zoukankan      html  css  js  c++  java
  • 二项式分布Binomial Distribution

    二项式分布Binomial Distribution

    引言

    因为我在一个课题中,需要统计一个基因出现的频率数,是否有显著性。原看文献说是应用超几何分布检验,后来经过调研,参考这篇Without Replacement; Hypergeometric / With replacement: Binomial
    最后我认为是不放回抽样的模型,所以应该使用二项式分布模型,所以这里总结一下二项式分布概率计算和R语言实现的知识。

    二项分布是离散的概率分布。它描述了一个实验中n个独立试验的结果。每个试验都假定只有两种结果,要么成功,要么失败。如果一次试验成功的概率是p,那么事件X,即在n次独立试验中k次试验成功的概率为:

    Binomial probability model

    公式个人理解:因为是放回抽样的模型,每次抽样是相互独立的,所以事件X,可以理解为等价于,一个子事件(该子事件的发生概率是p^k * q ^(n-k)),然后乘以排列组合的项。

    Problem

    假设在英语课堂测验中有10道单项选择题。每个问题有4个选项,其中只有1个是正确的。如果学生准备随机回答每一个问题,请问回答正确的不少于6道题目的概率。这个例子可以通俗理解为,一次考试试卷一共10道选择题,答对6道算是及格,问他全蒙的话,能及格的概率。

    Solution

    因为4个可能的答案中只有1个是正确的,所以随机回答一个问题的正确概率是1/4=0.25。我们可以通过下面的办法,找出恰好答对6道的概率。

    > options(digits = 3)
    > dbinom(x = 6, size = 10, prob = 0.25)
    [1] 0.0162
    

    因为事件X是答对不少于6道题,所以接下来可以有两种解决问题的思路:一是分别计算答对7,8,9,10道的概率并求和;二是分别计算答对0-5道题的概率,用1减求和。

    两种思路都可以,下面我用第二种思路计算,答对0, 1, 2, 3,4,5 道题的概率并求和:

    > sum(unlist(lapply(0:5, function(x){dbinom(x, size = 10, prob = 0.25)})))
    [1] 0.98
    

    上面使用了R语言dbinom函数,我们也可以根据公式自行计算刚好答对6道题的概率,如下:

    > pvalue <- factorial(10)/ factorial(4)/factorial(6) * 0.25^6 * 0.75^4
    > print(pvalue)
    [1] 0.0162
    # 可以看到计算结果和R语言stats包中的dbinom函数的计算结果一致。
    
    # 计算答对题目道数,从0到5道题的概率之和
    > sum(unlist(lapply(0:5, function(x){factorial(10)/ factorial(x)/factorial(10-x)*0.25^x * 0.75^(10-x)})))
    [1] 0.98
    

    所以,根据结果得出结论,该同学全蒙的情况下,98%的概率他答对题目数不到6道,也就是说,全蒙的话,98%的概率会挂科

    另外,可以发现上述逐个计算概率再求和比较麻烦,R语言提供了pbinom() 函数,直接计算答对不超过5道的概率,计算结果也是一致的,如下:

    > pbinom(5, size = 10, prob = 0.25)
    [1] 0.98
    

    参考

  • 相关阅读:
    函数
    A × B problem
    求n的阶乘
    自己构建一个vector函数
    int与string的互相转化
    列一列(斐波那契数列)
    找一找
    c++大数计算模板
    JSON--js中 json字符串转对象、对象转字符串
    JSON
  • 原文地址:https://www.cnblogs.com/songbiao/p/12711359.html
Copyright © 2011-2022 走看看