如果我想在16个试验中获得9次成功的概率,而每个试验的概率为0.6,则可以使用二项分布。如果16个试验中的每一个都有不同的成功概率,我该怎么办?
如果我想在16个试验中获得9次成功的概率,而每个试验的概率为0.6,则可以使用二项分布。如果16个试验中的每一个都有不同的成功概率,我该怎么办?
Answers:
这是16个(可能是独立的)二项式试验的总和。独立性的假设使我们可以乘以概率。在两次具有成功概率和的试验之后,两次试验的成功机会均为,不成功的机会为,一次成功的机会为。最后一种表述的有效性归因于这样一种事实,即获得一种成功的两种方式是互斥的:至多一种实际上可以发生。那意味着他们的概率增加了。
通过这两个规则-独立的概率相乘和互斥的相加-您可以得出16个概率为试验的答案。为此,您需要考虑所有获得给定成功次数(例如9)的所有方法。有种方法可以实现9次成功。例如,当试验1、2、4、5、6、11、12、14和15成功时,其中一个失败,就会发生其中之一。成功的概率为和,失败的概率为。将这16个数字相乘即可结果的特定顺序。 将这个数字与剩余的11439个数字相加得出答案。
当然,您会使用计算机。
对于16个以上的试验,有必要对分布进行近似估计。如果概率和变得太小,则法线近似趋于很好地工作。使用这种方法,您会注意到对试验的总和的期望是并且(因为试验是独立的)方差是。然后,您假设总和的分布为正态,均值和标准差。答案往往适合于计算与成功比例不同的概率不超过几倍。由于生长过大,这种近似变得更加准确,适用于更大的倍数远离。
@whuber正常逼近的一种替代方法是使用“混合”概率或层次模型。当在某种程度上相似时,这将适用,您可以通过概率分布建模,其密度函数为,该密度函数由某个参数索引。您得到一个积分方程:
二项式概率来自设置,法线逼近来自于(我认为)设置(在@whuber答案中定义了和),然后注意“此PDF的尾部在峰顶附近急剧下降。
您还可以使用beta分布,这将导致一种简单的分析形式,并且不必遭受正态近似会出现的“小p”问题-因为beta非常灵活。使用分布,其中由以下方程的解设置(这是“最小KL散度”估计):
其中是digamma函数-与谐波序列密切相关。
我们得到“β-二项式”化合物分布:
在@whuber指出的情况下,此分布趋于正态分布-但应为小和偏斜的提供合理的答案-但对于多峰不能给出合理的答案,因为beta分布只有一个峰值。但是,您只需为模式使用 beta分布即可轻松解决此问题。您将积分从分解为片段,以使每个片段具有唯一模式(并且有足够的数据来估计参数),并在每个片段中拟合beta分布。然后将结果相加,请注意对进行变量的更改 beta积分转换为:
让〜的概率生成函数(PGF):
令表示这样的独立随机变量的总和。然后,对于总和PGF的这样的变量是:
我们寻求,即:
全部做完。这将根据产生确切的符号解。答案在屏幕上打印的时间很长,但是完全可以处理,并且在我的计算机上使用Mathematica进行评估所需的时间不到秒。
例子
如果,则:
如果,则:
超过16次审判?
如果进行了16次以上的试验,则无需估算分布。对于或示例,上面的精确方法同样容易工作。例如,当,使用下面的代码评估整个pmf(即,在每个值)花费的时间少于秒。
Mathematica代码
给定一个值的向量,说:
n = 16; pvals = Table[Subscript[p, i] -> i/(n+1), {i, n}];
...这是一些Mathematica代码,可完成所需的所有操作:
pgfS = Expand[ Product[1-(1-t)Subscript[p,i], {i, n}] /. pvals];
D[pgfS, {t, 9}]/9! /. t -> 0 // N
0.198268
导出整个pmf:
Table[D[pgfS, {t,s}]/s! /. t -> 0 // N, {s, 0, n}]
...或者使用更整齐,更快的方式(感谢下面的Ray Koopman的建议):
CoefficientList[pgfS, t] // N
对于的示例,只需花费1秒即可计算出,然后使用0.002秒即可得出整个pmf ,因此效率非常高。pgfS
CoefficientList
With[{p = Range@16/17}, N@Coefficient[Times@@(1-p+p*t),t,9]]
给出9次成功的概率,并With[{p = Range@16/17}, N@CoefficientList[Times@@(1-p+p*t),t]]
给出0,...,16次成功的概率。
Table
用于 -值是故意的,以允许不适合与更一般的形式。您使用的是非常不错的!我在上面的代码中添加了一个,可以大大加快直接访问的速度。即使这样,它甚至比还要快。对于小于50的,这并没有太大的区别(两种方法都只花费一秒钟的很小一部分来生成整个pmf),但是当n很大时,您也将是一个实际的实际优势。Range
CoefficientList
Expand
CoefficientList
ParallelTable
CoefficientList
@wolfies评论,而我对此的回复尝试显示了我的其他答案的一个重要问题,我将在后面讨论。
具体情况(n = 16)
通过使用在计算中使用基数2(二进制)的“技巧”,有一种相当有效的方法可以对整个分布进行编码。仅需4行R代码即可获得的完整分布,其中。基本上,二进制变量可以采用向量的总共选择。现在假设我们对每个不同的选择进行编号,范围从到。它本身没有什么特别的,但是现在假设我们使用2为底的算法表示“选择数”。现在取这样我就可以写下所有选择,所以有选择。然后,“普通数”中的变为“二进制数”中的。现在假设我们将它们写为四个数字,那么我们就有。现在来看最后各自的位数-可以被认为是,等等计数以二进制形式提供了一种有效的方式来组织的总和。幸运的是,有一个R函数可以为我们完成此二进制转换,将其调用,然后通过将原始二进制形式转换为数值,然后我们将得到一个的向量intToBits(x)
as.numeric(intToBits(x))
元素,每个元素都是数字的以2为底的版本的数字(从右到左,不是从左到右读取)。结合使用此技巧和其他一些R向量化,我们可以计算4行R代码中的概率:
exact_calc <- function(y,p){
n <- length(p)
z <- t(matrix(as.numeric(intToBits(1:2^n)),ncol=2^n))[,1:n] #don't need columns n+1,...,32 as these are always 0
pz <- z%*%log(p/(1-p))+sum(log(1-p))
ydist <- rowsum(exp(pz),rowSums(z))
return(ydist[y+1])
}
插入统一大小写和sqrt根大小写得到完整的分布对于y为:
因此,对于在试验中成功的特定问题,确切的计算是简单明了的。这也适用于大约的许多概率-超过此概率,您可能会开始遇到内存问题,并且需要不同的计算技巧。
请注意,通过应用建议的“β分布”,我们得到参数估计值,这给出了在几乎均匀的概率估计值,从而给出了。鉴于具有的beta分布的密度非常接近值的直方图,这似乎很奇怪。什么地方出了错?
一般情况
我现在将讨论更一般的情况,以及为什么我的简单Beta近似失败。基本上,通过编写然后将与另一个分布实际上是一个重要的假设-我们可以用一个二项式概率-剩下的唯一问题是使用哪个值。一种解决方法是使用在实际离散均匀的混合密度。因此,我们用离散密度代替Beta分布。然后,使用混合近似值可以用单词表示,选择概率为的值,并假定所有bernoulli试验都具有该概率。显然,为了使这种近似有效,大多数值应彼此相似。这基本上意味着,对于@wolfies值的均匀分布,使用beta混合分布时,导致糟糕的近似值。这也解释了为什么对于,逼近效果好得多-它们的分布较少。
然后,混合使用观察到的对单个所有可能选择进行平均。现在,由于“混合”就像是加权平均值,因此它不可能比使用单个最佳更好。因此,如果充分展开,则不会有单个可以为所有提供良好的近似值。
我在另一个答案中确实说过一件事,那就是最好在限制范围内使用beta分布的混合-但这仍然无济于事,因为它仍在单个混合 。更有意义的是将间隔分成几部分,并且每部分中都有一个二项式。例如,我们可以选择作为拆分,并在每个概率范围内拟合九个二项式。基本上,在每个拆分中,我们将拟合一个简单的近似值,例如使用二项式,其概率等于的平均值在那个范围内。如果我们使间隔足够小,则近似值将变得任意好。但是请注意,所有这些操作使我们不得不处理各种概率不同的独立二项式试验,而不是伯努利试验。但是,该答案的前一部分表明,只要二项式的数目足够小(例如10-15左右),我们就可以进行精确的计算。
为了将基于bernoulli的答案扩展到基于二项式的答案,我们只需“重新解释”变量是什么。我们只是简单地声明 -简化为最初的基于但现在说明成功来自哪个二项式。因此,情况现在意味着所有“成功”都来自第三个二项式,而没有一个来自前两个。
请注意,这仍然是“指数”的,因为计算数量类似于,其中是二项式的数量,是组的大小-因此您具有其中。但这比使用bernoulli随机变量要处理的更好。例如,假设我们将概率分为组,每组中的概率。与相比,这提供了计算
通过选择组,并注意限制约为(大约单元格),我们可以有效地使用此方法将最大增加到。
如果我们通过降低进行更粗略的近似,我们将增加的“可行”大小。 表示有效约为。除此之外,法线近似值应该非常准确。
R
非常有效的解决方案,并且可以处理更大得多的值,请参阅stats.stackexchange.com/a/41263。例如,它解决了,并在三秒钟内给出了完整的分布。(类似的Mathematica 9解决方案-参见@wolfies的答案-在较小的也能很好地执行,但无法以的大值完成执行。)
(通常难以处理的)pmf是 R代码:
p <- seq(1, 16) / 17
cat(p, "\n")
n <- length(p)
k <- 9
S <- seq(1, n)
A <- combn(S, k)
pr <- 0
for (i in 1:choose(n, k)) {
pr <- pr + exp(sum(log(p[A[,i]])) + sum(log(1 - p[setdiff(S, A[,i])])))
}
cat("Pr(S = ", k, ") = ", pr, "\n", sep = "")
对于在狼人答案中使用的,我们有:
Pr(S = 9) = 0.1982677
当增大时,使用卷积。
R
的解决方案同样的问题代码(与所述的不同的值)在stats.stackexchange.com/a/41263。此问题的解决时间是该代码的总计算时间为0.00012秒(通过求解1000次而估算),而该代码的总计算时间为0.53秒(通过求解一次而估算),而使用Wolfies的Mathematica代码则为0.00058秒(通过求解1000次而估算)。R