不同概率的概率分布


36

如果我想在16个试验中获得9次成功的概率,而每个试验的概率为0.6,则可以使用二项分布。如果16个试验中的每一个都有不同的成功概率,我该怎么办?


1
@whuber在您对正态近似的解释中,均值和标准差的计算与Wikipedia中的描述不同。在Wiki中,平均值为np,标准偏差为np(1-p)。因此,在这个问题中,对于二项分布成功概率的正态近似,平均值为p1 + p2 + p3 + p4 + p5 + ... + pi,方差为p1(1-p1)+ p2( 1-p2)+ ... + pi(1-pi)。我对吗?
大卫,

1
有关Poisson二项式分布的信息,请参阅Wikipedia 。也是一个搜索词,在这里显示了一些热门。
2013年

@David当所有等于一个公共值,则和,显示您所引用的Wikipedia描述只是一个特例。pipp1+p2++pn=npp1(1p1)++pn(1pn)=np(1p)
whuber


Answers:


22

这是16个(可能是独立的)二项式试验的总和。独立性的假设使我们可以乘以概率。在两次具有成功概率和的试验之后,两次试验的成功机会均为,不成功的机会为,一次成功的机会为。最后一种表述的有效性归因于这样一种事实,即获得一种成功的两种方式是互斥的:至多一种实际上可以发生。那意味着他们的概率增加了p1p2p1p2(1p1)(1p2)p1(1p2)+(1p1)p2

通过这两个规则-独立的概率相乘和互斥的相加-您可以得出16个概率为试验的答案。为此,您需要考虑所有获得给定成功次数(例如9)的所有方法。有种方法可以实现9次成功。例如,当试验1、2、4、5、6、11、12、14和15成功时,其中一个失败,就会发生其中之一。成功的概率为和,失败的概率为。将这16个数字相乘即可p1,,p16(169)=11440p1,p2,p4,p5,p6,p11,p12,p14,p151p3,1p7,,1p13,1p16结果的特定顺序。 将这个数字与剩余的11439个数字相加得出答案。

当然,您会使用计算机。

对于16个以上的试验,有必要对分布进行近似估计。如果概率和变得太小,则法线近似趋于很好地工作。使用这种方法,您会注意到对试验的总和的期望是并且(因为试验是独立的)方差是。然后,您假设总和的分布为正态,均值和标准差。答案往往适合于计算与成功比例不同的概率pi1pinμ=p1+p2++pnσ2=p1(1p1)+p2(1p2)++pn(1pn)μσμ不超过几倍。由于生长过大,这种近似变得更加准确,适用于更大的倍数远离。σnσμ


9
计算机科学家称这些为“泊松试验”,以区别于伯努利试验。除了中心极限定理逼近外,还可以使用良好的尾边界。这是一个 Google搜索“泊松试验的切尔诺夫界线”会发现您在典型CS疗法中可能会发现的结果。
主教

@Cardinal命名法很有趣。这对于很小的是有效的,但否则似乎会引起误解,因为否则该分布不能很好地通过泊松分布近似地估计出来。(关于这个问题,还有关于简历的另一种讨论,其中“ 16”被10,000代替,我们确实检查了尾部概率,但是我一直没有找到它。)pi
whuber

1
是的,我同意这个名字。当我第一次遇到它时,我发现它有点奇怪。我在这里给出了更多有用的搜索术语。看来计算机科学家在处理某些算法时经常考虑这些概率。如果您碰巧发现了另一个问题,我会很感兴趣。也许是这个吗?
主教

2
@cardinal是正确的,我们“ CS人员”称它们为Poisson试验。实际上,对于这种情况,标准的Chernoff-Hoeffding界限将为您提供OP所要求的界限。
Suresh Venkatasubramanian

1
根据@David昨天的评论,您对正态近似均值的陈述存在问题。我们求和16个Bernoulli rv,每个rvs都可以取值0或1,因此总和的支持范围是0到16,而不是0到1。值得检查您的sd。
μ=(p1+p2++pn)/n
Wolfies

12

@whuber正常逼近的一种替代方法是使用“混合”概率或层次模型。当在某种程度上相似时,这将适用,您可以通过概率分布建模,其密度函数为,该密度函数由某个参数索引。您得到一个积分方程:pipiDist(θ)g(p|θ)θ

Pr(s=9|n=16,θ)=(169)01p9(1p)7g(p|θ)dp

二项式概率来自设置,法线逼近来自于(我认为)设置(在@whuber答案中定义了和),然后注意“此PDF的尾部在峰顶附近急剧下降。g(p|θ)=δ(pθ)g(p|θ)=g(p|μ,σ)=1σϕ(pμσ)μσ

您还可以使用beta分布,这将导致一种简单的分析形式,并且不必遭受正态近似会出现的“小p”问题-因为beta非常灵活。使用分布,其中由以下方程的解设置(这是“最小KL散度”估计):beta(α,β)α,β

ψ(α)ψ(α+β)=1ni=1nlog[pi]
ψ(β)ψ(α+β)=1ni=1nlog[1pi]

其中是digamma函数-与谐波序列密切相关。ψ(.)

我们得到“β-二项式”化合物分布:

(169)1B(α,β)01p9+α1(1p)7+β1dp=(169)B(α+9,β+7)B(α,β)

在@whuber指出的情况下,此分布趋于正态分布-但应为小和偏斜的提供合理的答案-但对于多峰不能给出合理的答案,因为beta分布只有一个峰值。但是,您只需为模式使用 beta分布即可轻松解决此问题。您将积分从分解为片段,以使每个片段具有唯一模式(并且有足够的数据来估计参数),并在每个片段中拟合beta分布。然后将结果相加,请注意对进行变量的更改npipiMM0<p<1Mp=xLULL<x<U beta积分转换为:

B(α,β)=LU(xL)α1(Ux)β1(UL)α+β1dx

+1此答案包含一些有趣且聪明的建议。最后一个看起来特别灵活和强大。
ub

为了简单而具体,假设(i)和(ii),对于到16。您的和估计,因此根据OP的问题,给定对估计?pi=i17pi=i/17i=1αβP(X=9)n=16
Wolfies

很好的答案和建议,尤其是beta版!很高兴看到这个答案以和一般形式写成。ns
pglpm

8

让〜的概率生成函数(PGF):XiBernoulli(pi)

pgf=E[tXi]=1pi(1t)

令表示这样的独立随机变量的总和。然后,对于总和PGF的这样的变量是:S=i=1nXinSn=16

pgfS=E[tS]=E[tX1]E[tX2]E[tX16] (... by independence)=i=116(1pi(1t))

我们寻求,即:P(S=9)

19!d9pgfSdt9|t=0

全部做完。这将根据产生确切的符号解。答案在屏幕上打印的时间很长,但是完全可以处理,并且在我的计算机上使用Mathematica进行评估所需的时间不到秒。pi1100

例子

如果,则: pi=i17,i=1 to 16P(S=9)=964794185433480818448661191875666868481=0.198268

如果,则: pi=i17,i=1 to 16P(S=9)=0.000228613

超过16次审判?

如果进行了16次以上的试验,则无需估算分布。对于或示例,上面的精确方法同样容易工作。例如,当,使用下面的代码评估整个pmf(即,在每个值)花费的时间少于秒。n=50n=100n=50110s=0,1,,50

Mathematica代码

给定一个值的向量,说:pi

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 ,因此效率非常高。n=1000pgfSCoefficientList


1
它甚至可以更简单。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次成功的概率。
Ray Koopman

@RayKoopman太酷了。的Table用于 -值是故意的,以允许不适合与更一般的形式。您使用的是非常不错的!我在上面的代码中添加了一个,可以大大加快直接访问的速度。即使这样,它甚至比还要快。对于小于50的,这并没有太大的区别(两种方法都只花费一秒钟的很小一部分来生成整个pmf),但是当n很大时,您也将是一个实际的实际优势。pRangeCoefficientListExpandCoefficientListParallelTablenCoefficientList
Wolfies 2013年

5

@wolfies评论,而我对此的回复尝试显示了我的其他答案的一个重要问题,我将在后面讨论。

具体情况(n = 16)

通过使用在计算中使用基数2(二进制)的“技巧”,有一种相当有效的方法可以对整个分布进行编码。仅需4行R代码即可获得的完整分布,其中。基本上,二进制变量可以采用向量的总共选择。现在假设我们对每个不同的选择进行编号,范围从到。它本身没有什么特别的,但是现在假设我们使用2为底的算法表示“选择数”。现在取这样我就可以写下所有选择,所以有Y=i=1nZiPr(Zi=1)=pi2nz=(z1,,zn)Zi12nn=323=8选择。然后,“普通数”中的变为“二进制数”中的。现在假设我们将它们写为四个数字,那么我们就有。现在来看最后各自的位数-可以被认为是,等等计数以二进制形式提供了一种有效的方式来组织的总和。幸运的是,有一个R函数可以为我们完成此二进制转换,将其调用,然后通过将原始二进制形式转换为数值,然后我们将得到一个的向量1,2,3,4,5,6,7,81,10,11,100,101,110,111,10000001,0010,0011,0100,0101,0110,0111,10003001(Z1=0,Z2=0,Z3=1)Y=1intToBits(x)as.numeric(intToBits(x))32元素,每个元素都是数字的以2为底的版本的数字(从右到左,不是从左到右读取)。结合使用此技巧和其他一些R向量化,我们可以计算4行R代码中的概率:y=9

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为:pi(1)=i17pi(2)=i17

yPr(Y=y|pi=i17)Pr(Y=y|pi=i17)00.00000.055810.00000.178420.00030.265230.00260.243040.01390.153650.04910.071060.11810.024870.19830.006780.23530.001490.19830.0002100.11810.0000110.04910.0000120.01390.0000130.00260.0000140.00030.0000150.00000.0000160.00000.0000

因此,对于在试验中成功的特定问题,确切的计算是简单明了的。这也适用于大约的许多概率-超过此概率,您可能会开始遇到内存问题,并且需要不同的计算技巧。y16n=20

请注意,通过应用建议的“β分布”,我们得到参数估计值,这给出了在几乎均匀的概率估计值,从而给出了。鉴于具有的beta分布的密度非常接近值的直方图,这似乎很奇怪。什么地方出了错?α=β=1.3206ypr(y=9)=0.06799117α=β=1.3206pi

一般情况

我现在将讨论更一般的情况,以及为什么我的简单Beta近似失败。基本上,通过编写然后将与另一个分布实际上是一个重要的假设-我们可以用一个二项式概率-剩下的唯一问题是使用哪个值。一种解决方法是使用在实际离散均匀的混合密度。因此,我们用离散密度代替Beta分布(y|n,p)Binom(n,p)ppf(θ)ppipBeta(a,b)pi=116wiδ(ppi)。然后,使用混合近似值可以用单词表示,选择概率为的值,并假定所有bernoulli试验都具有该概率piwi。显然,为了使这种近似有效,大多数值应彼此相似。这基本上意味着,对于@wolfies值的均匀分布,使用beta混合分布时,导致糟糕的近似值。这也解释了为什么对于,逼近效果好得多-它们的分布较少。pipi=i17pi=i17

然后,混合使用观察到的对单个所有可能选择进行平均。现在,由于“混合”就像是加权平均值,因此它不可能比使用单个最佳更好。因此,如果充分展开,则不会有单个可以为所有提供良好的近似值。pi pppippi

我在另一个答案中确实说过一件事,那就是最好在限制范围内使用beta分布的混合-但这仍然无济于事,因为它仍在单个混合 。更有意义的是将间隔分成几部分,并且每部分中都有一个二项式。例如,我们可以选择作为拆分,并在每个概率范围内拟合九个二项式。基本上,在每个拆分中,我们将拟合一个简单的近似值,例如使用二项式,其概率等于的平均值p(0,1)(0,0.1,0.2,,0.9,1)0.1pi在那个范围内。如果我们使间隔足够小,则近似值将变得任意好。但是请注意,所有这些操作使我们不得不处理各种概率不同的独立二项式试验,而不是伯努利试验。但是,该答案的前一部分表明,只要二项式的数目足够小(例如10-15左右),我们就可以进行精确的计算。

为了将基于bernoulli的答案扩展到基于二项式的答案,我们只需“重新解释”变量是什么。我们只是简单地声明 -简化为最初的基于但现在说明成功来自哪个二项式。因此,情况现在意味着所有“成功”都来自第三个二项式,而没有一个来自前两个。ZiZi=I(Xi>0)Zi(Z1=0,Z2=0,Z3=1)

请注意,这仍然是“指数”的,因为计算数量类似于,其中是二项式的数量,是组的大小-因此您具有其中。但这比使用bernoulli随机变量要处理的更好。例如,假设我们将概率分为组,每组中的概率。与相比,这提供了计算kggkYj=1gXjXjBin(k,pj)2gkn=16g=4k=444=256216=65536

通过选择组,并注意限制约为(大约单元格),我们可以有效地使用此方法将最大增加到。g=10n=20107nn=50

如果我们通过降低进行更粗略的近似,我们将增加的“可行”大小。 表示有效约为。除此之外,法线近似值应该非常准确。gng=5n125


@momo-我认为可以,因为我的答案是解决问题的两种不同方法。这个答案不是我第一个答案的编辑版本-只是一个不同的答案
概率

1
要获得一种R非常有效的解决方案,并且可以处理更大得多的值,请参阅stats.stackexchange.com/a/41263。例如,它解决了,并在三秒钟内给出了完整的分布。(类似的Mathematica 9解决方案-参见@wolfies的答案-在较小的也能很好地执行,但无法以的大值完成执行。)nn=104nn
whuber

5

(通常难以处理的)pmf是 R代码:

Pr(S=k)=A{1,,n}|A|=k(iApi)(j{1,,n}A(1pj)).
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 = "")

对于在狼人答案中使用的,我们有:pi

Pr(S = 9) = 0.1982677

当增大时,使用卷积n


1
用R代码做到这一点真的很有帮助。我们中的一些人更具体地思考,并且对生成函数的可操作版本有很大帮助。
DWin

@DWin我提供高效R的解决方案同样的问题代码(与所述的不同的值)在stats.stackexchange.com/a/41263。此问题的解决时间是该代码的总计算时间为0.00012秒(通过求解1000次而估算),而该代码的总计算时间为0.53秒(通过求解一次而估算),而使用Wolfies的Mathematica代码则为0.00058秒(通过求解1000次而估算)。piR
whuber

因此,将遵循泊松二项分布。P(S=k)
fccoelho 2014年

+1非常有用的帖子,有助于我回答这个问题。我想知道使用日志是不是真正需要的更酷的数学公式。我不太担心运行时间...
Antoni Parellada
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.