如何有效地建模伯努利随机变量的总和?


38

我正在建模一个随机变量(),它是大约15-40k个独立的伯努利随机变量()的总和,每个随机变量具有不同的成功概率()。形式上,其中和\ Pr(X_i = 0)= 1-p_iYXipiY=XiPr(Xi=1)=piPr(Xi=0)=1pi

我对快速回答诸如Pr(Y<=k)(其中k给出)的查询感兴趣。

目前,我使用随机模拟来回答此类查询。我根据每个Xip_i随机绘制它们pi,然后将所有Xi值求和以获得Y。我重复此过程数千次,然后返回分数Pr(Yk)

显然,这并不是完全准确的(尽管随着仿真次数的增加,准确度也会大大提高)。另外,似乎我有足够的有关分布的数据来避免使用模拟。您能想到一种获取确切概率\ Pr(Y \ leq k)的合理方法Pr(Yk)吗?

ps

我使用Perl&R。

编辑

在回答之后,我认为可能需要进行一些澄清。我将简短地描述问题的所在。给定的是一个带有周长的圆形基因组,c以及n映射到它的一组范围。例如c=3*10^9ranges={[100,200],[50,1000],[3*10^9-1,1000],...}。请注意,所有范围都是封闭的(两端都包括在内)。另请注意,我们仅处理整数(整个单位)。

我正在寻找圆上被给定n映射范围掩盖的区域。因此,为了测试x圆上给定的长度范围是否被掩盖,我测试了n范围随机映射的假设。映射的长度范围q>x将完全覆盖给定长度范围的概率x(q-x)/c。当c大和/或小时,该概率变得非常q小。我感兴趣的是n覆盖的范围数(超出范围)x。这是如何Y形成的。

我测试了原假设与单方面的选择(不足覆盖率)的对比。另请注意,我正在测试多个假设(不同的x长度),请确保对此进行更正。


您的p_i是否在整个建模过程中都得到固定,还是可以从一种计算更改为另一种计算?
ub

p_is的固定。
David B 2010年

根据当前的回答,您是否可以共享(a)p的和与(b)平方和的估计?这些值确定您的选择。
whuber

@whuber:这些情况因情况而异。不幸的是,这不是我正在创建的一次性模块。
David B 2010年

@David但是您不能提供一些指导,例如典型范围吗?例如,如果p的总和在1到100之间,这是有用的信息,并提出了一些有效的解决方案,但是,如果p的总数达到10,000,则可以排除某些方法。
ub

Answers:


24

如果它通常类似于泊松,您是否尝试过使用参数的泊松近似它?λ=pi

编辑:我已经找到了理论上的结果来证明这一点,以及的分布的名称:它称为Poisson二项分布Le Cam的不等式告诉您其分布与参数的泊松分布的近似程度。它告诉您,该近似值的质量由 s 的平方和决定,Steele(1994)解释。因此,如果您的所有都相当小(如现在看来),那应该是一个很好的近似值。λ = Σ p p p Yλ=pipipi

编辑2:“合理小”有多小?好吧,这取决于您需要近似值有多好!关于Le Cam定理Wikipedia文章给出了我上面提到的结果的精确形式:的概率质量函数(pmf)与上述泊松分布的pmf 之间的绝对差之和不超过总和的两倍。 s 的平方。Le Cam(1960)的另一个结果可能更易于使用:该总和也不超过最大 18倍。这样的结果还有很多……参见Serfling(1978)的一篇评论。p p Ypipi


1
+1不错。根据问题的澄清方式,少量的Poissons混合物可能会做得很好。
ub

1
我确实考虑过建议使用负二项式分布,该分布以Gamma-Poisson混合形式出现,但其方差大于平均值,而该问题的方差小于平均值。基于这一点,我不确定是否会混合使用泊松,因为任何此类混合的方差肯定会大于平均值吗?
一站式

@onestop在哪里说方差小于均值?我错过了那句话。
ub

抱歉,这有点晦涩难懂,但是这些注释不允许这么详细。mpiktas的是方差,它小于平均值。但是,如果平均非常小,则仅稍少一些,因此标准的Poisson大约足够好了。也许我应该在上面扩展我的答案..但是,会话线程变得令人困惑。p i p iBn=pi(1pi)pipi
一站式

是什么意思?如何获得值?X iXiXi
David B 2010年

11

我在寻找解决此问题的方法时遇到了您的问题。我对这里的答案不是很满意,但是我认为有一个非常简单的解决方案可以为您提供准确的分布,并且很容易处理。

两个离散随机变量之和的分布是它们的密度的卷积。因此,如果您有,并且知道和则可以计算:P X P Y Z=X+YP(X)P(Y)

P(Z=z)=k=P(X=k)P(Y=zk)

(当然,对于伯努利随机变量,您不需要完全达到无穷大。)

您可以使用它来找到RV总和的确切分布。首先将两个RV的PDF卷积在一起(例如[0.3,0.7] * [0.6,0.4] = [0.18,0.54,0.28])。然后将新发行版与下一个Bernoulli PDF进行卷积(例如[0.18,0.54,0.28] * [0.5,0.5] = [0.09,0.36,0.41,0.14])。继续重复此操作,直到添加了所有RV。瞧,结果向量就是所有变量总和的精确PDF。

我已经通过仿真验证了这会产生正确的结果。它不依赖任何渐近假设,也没有要求伯努利概率很小。

也许还有比重复卷积更有效地执行此操作的方法,但是我还没有考虑得很深。我希望这对某人有帮助!


2
您是否尝试了40K变量?(我想知道需要多少小时或几天的计算...)
笨蛋

5
(+1)我找到了使这个想法可行的方法。它需要两种技术:首先,对卷积使用FFT。其次,不要按顺序进行处理,而要分而治之:按不相交的对进行处理,然后按不相交的对进行处理,等等。算法现在缩放为而不是对于概率。例如,Mathematica可以在0.4秒内计算出40,000个概率的整个分布。(将在10.5秒内计算出1,000,000。)我将在后续注释中提供代码。O n 2nO(nlogn)O(n2)n
ub

7
这是Mathematica代码:multinomial[p_] := Module[{lc, condense}, lc = Function[{s}, ListConvolve[s[[1]], s[[2]], {1, -1}, 0]]; condense = Function[{s}, Map[lc, Partition[s, 2, 2, {1, 1}, {{1}}]]]; Flatten[NestWhile[condense, Transpose[{1 - p, p}], Length[#] > 1 &]]] 要应用它,请执行p = RandomReal[{0, 1}, 40000]; pp = multinomial[p];。这将创建概率p,然后计算精确的分布pp注意:当的平均值p不是极高时,分布非常接近正态:这导致算法更快。
ub

9

@onestop提供了很好的参考。维基百科上有关泊松二项式分布的文章给出了用于计算精确概率分布的递归公式;它需要努力。不幸的是,它是一个交替的和,因此在数值上将是不稳定的:用浮点算法进行这种计算是没有希望的。幸运的是,当小时,您只需要计算少量概率,因此工作量实际上与成正比。用有理算术进行计算所需的精度(即精确地,这样就不会出现数值不稳定的问题)增长得足够慢,以至于整个时序可能仍约为p i O n log i p iO n 2O(n2)piO(nlog(ipi))O(n2)。那是可行的。

作为测试,我为各种值(最多创建了一个概率数组,此问题的大小。对于较小的值(最大),准确计算概率的时机以秒为单位,并且进行二次缩放,因此我冒险将结果扩展到三个SD。平均值(0、1,...,22次成功的概率)。花了80分钟(使用Mathematica 8),与预计时间一致。(结果概率是分子和分母每个都有约75,000位的分数!)这表明可以完成计算。n n = 2 16 n n = 2 12 n = 2 16pi=1/(i+1)nn=216nn=212n=216

一种替代方法是进行长时间的模拟(应做一百万次试验)。只需执行一次,因为不变。pi


9

(因为这种方法独立于其他已发布的解决方案,包括我已经发布的解决方案,所以我将其作为单独的答复提供)。

如果p的总和很小,则可以以秒(或更少)为单位计算出精确的分布。

我们已经看到建议,分布可能近似为高斯分布(在某些情况下)或泊松分布(在其他情况下)。无论哪种方式,我们都知道它的均值是的总和,其方差是的总和。因此,分布将集中在其平均值的几个标准偏差内,例如 SD在在4到6之间或附近。因此,对于到我们只需要计算和等于(整数)的概率。当大多数p σ 2 p 1 - p Ž Ž X ķ ķ = μ - ž σ ķ = μ + ž σ p σ 2 μ ķ [ μ - ž μpiσ2pi(1pi)zzXkk=μzσk=μ+zσpi是小的,约等于(但稍小于),所以是保守的,我们可以做计算在区间。例如,当所述的总和等于并选择,以便覆盖尾部井,我们需要计算到盖在 =,仅是28个值。σ2μkp9Ž=6ķ[9-6[μzμ,μ+zμ]pi9z=6k[027][969,9+69][0,27]

该分布是递归计算的。令是这些伯努利变量中第一个的和的分布。对于从到任何,前变量的总和可以通过两种互斥的方式等于:前变量的总和等于,而为否则,前变量的总和等于,而为。因此Ĵ 0 + 1 + 1 Ĵ Ĵ + 1 ST 0 Ĵ - 1 + 1 ST 1fiij0i+1i+1jiji+1st0ij1i+1st1

fi+1(j)=fi(j)(1pi+1)+fi(j1)pi+1.

我们只需要 在从的时间间隔内对积分进行此计算最大值0 μ - ž j μ+Žmax(0,μzμ) μ+zμ.

当大多数很小时(但是仍然可以与区别开来,并且具有合理的精度),这种方法不会困扰我先前发布的解决方案中使用的浮点舍入误差的大量累积。因此,不需要扩展精度计算。例如,对概率(的数组进行双精度计算,需要计算和之间的和的概率 1 p i 1 2 16 p i = 1 /i + 1 μ = 10.6676 0 31 3 × 10 15 z = 6 3.6 × 10 8pi1pi1216pi=1/(i+1)μ=10.6676031)在Mathematica 8中花费了0.1秒,在Excel 2002中花费了1-2秒(都获得了相同的答案)。以四倍的精度重复该过程(在Mathematica中)大约需要2秒,但任何答案的更改都不会超过 x。在 SD 处终止分布到上尾巴,仅损失总概率的。3×1015z=63.6×108

使用Mathematica,另一个对40,000个精度介于0到0.001()的双精度随机值数组的计算花费了0.08秒。μ=19.9093

该算法是可并行化的。只需将的集合分解为大小相等的不相交的子集,每个处理器一个。计算每个子集的分布,然后对结果进行卷积(如果需要,可以使用FFT,尽管这种加速可能是不必要的),以获得完整的答案。这使得即使变大,当您需要向尾巴注视(大)和/或大时,也可以使用。 μ ž Ñpiμzn

具有处理器的变量的数组的时间缩放为。Mathematica的速度约为每秒一百万。例如,对于处理器,变量,总概率为,最后得出标准差进入上尾,万:计算几秒钟的计算时间。如果您对此进行编译,则可以将性能提高两个数量级。ø Ñ μ + ž nmO(n(μ+zμ)/m)m=1n=20000μ=100z=6n(μ+zμ)/m=3.2

顺便说一下,在这些测试案例中,分布图清楚地显示出一些正偏度:它们是不正常的。

作为记录,这是Mathematica解决方案:

pb[p_, z_] := Module[
  {\[Mu] = Total[p]},
  Fold[#1 - #2 Differences[Prepend[#1, 0]] &, 
   Prepend[ConstantArray[0, Ceiling[\[Mu] + Sqrt[\[Mu]] z]], 1], p]
  ]

注意:本网站使用的颜色编码对于Mathematica代码毫无意义。特别是,灰色内容不是注释:这是所有工作完成的地方!)

其用法的一个例子是

pb[RandomReal[{0, 0.001}, 40000], 8]

编辑

一个R解决方案是慢十倍数学在这个测试案例-也许我还没有最佳的编码-但它仍然迅速执行(约一秒钟):

pb <- function(p, z) {
  mu <- sum(p)
  x <- c(1, rep(0, ceiling(mu + sqrt(mu) * z)))
  f <- function(v) {x <<- x - v * diff(c(0, x));}
  sapply(p, f); x  
}
y <- pb(runif(40000, 0, 0.001), 8)
plot(y)

PDF图


8

使用不同的我认为最好的选择是正常近似。令。然后piBn=i=1npi(1pi)

Bn1/2(i=1nXii=1npi)N(0,1),
为,条件是每个nε>0

Bn1i=1nE((Xipi)21{|Xipi|>εBn1/2})0,
为,如果,则对于Bernoulli变量将成立。这就是所谓的Lindeberg条件,它足以收敛到标准法线。nBn

更新:可以从以下不等式计算近似误差:

supx|Fn(x)Φ(x)|ALn,
其中 并且是的缩放和居中和的cdf 。
Ln=Bn3/2i=1nE|Xipi|3
FnXi

正如胡布尔指出的那样,对于表现不佳的,收敛可能很慢。对于我们得到和。然后取我们得出与标准法线cdf的最大偏差为0.3。pipi=11+iBnlnnLn(lnn)1/2n=216


3
当p_i随着i增大而接近零时,情况并非如此。否则,您刚刚证明了泊松分布是正态的!
ub

1
这就是为什么它必须是。如果以比更快的速率接近零,则。BnpiLIM Ñ < 1/ilimBn<
mpiktas

@mpiktas是正确的。在这里,与泊松分布的类比不太合适。

顺便说一句,我实际上没有在第二段中检查那种可怕的情况。

@G。杰伊·科恩斯(Jay Kerns)我同意对泊松的类比并不完美,但我认为它提供了很好的指导。想象一个p的序列,p_i = 10 ^ {-j},其中j是i的数量级(i <= 10等于1,i <= 100等于2,依此类推)。当n = 10 ^ k时,p的90%等于10 ^ {-k},它们的和看起来像泊松,期望值为0.9。另有9%等于10 ^ {1-k},它们的总和为泊松(期望值相同)。因此,分布看起来近似于k个泊松变量的总和。显然,它离正常还差得远。因此需要“可怕的条件”。
ub

4

嗯,根据您的描述和评论中的讨论,很明显均值和方差。的分布形状最终取决于的行为。对于适当的“不错”的(在某种意义上说,它们中的确实不是真的接近零),的分布将近似为正态(以为中心)。但是当 开始趋向于零时,分布将向左移动,并且当它向方向时Yipiipi(1pi)YpipiYpiipiy如@whuber和@onestop所提到的,轴将开始看起来比正常情况少很多,而泊松更多。

从您的评论“分布看起来像是泊松”,我怀疑这是后一种情况,但是如果没有某种可视化显示或有关的摘要统计信息,就无法确定。但是请注意,就像@whuber一样,通过的足够的病理行为,您可能会发生各种怪异的事情,例如作为混合分布的极限。我怀疑情况是否如此,但同样,这实际上取决于您的在做什么。ppp

关于最初的“如何有效建模”的问题,我打算为您建议一个分层模型,但是如果是固定常数,那确实不合适。简而言之,请看一下的直方图,然后根据您看到的内容进行第一个猜测。如果您的不太拥挤在左侧,我会建议使用@mpiktas(扩展名为@csgillespie),如果他们拥挤在左侧,我会建议使用@onestop。ppp

顺便说一下,这是我在解决此问题时使用的R代码:如果您的太小,该代码并不是很合适,但是应该很容易为插入不同的模型(包括怪异的-疯狂的人),以了解的最终分布会发生什么。ppY

set.seed(1)
M <- 5000
N <- 15000
p <- rbeta(N, shape1 = 1, shape2 = 10)
Y <- replicate(M, sum(rbinom(N, size = 1, prob = p)))

现在看一下结果。

hist(Y)
mean(Y)
sum(p)
var(Y)
sum(p*(1 - p))

玩得开心; 我确定


为什么说“如果您的太小,该代码就不是很合适”?似乎可以正常工作,例如shape1 = 1,shape2 = 999,平均为0.001。pp
一站式

@onestop我的意思是上面写的(1,10)的特定选择并没有给出非常小的值,以至于法线逼近看起来还不错。如果一个人想让Poisson出来,那么他们就需要尝试其他方法。听起来您选择的(1,999)表现不错,是吗?我也曾想过将设为0.25,但我没有尝试过。pα<1

2

我认为其他答案也不错,但是我没有看到任何贝叶斯方法来估算您的概率。答案没有明确的形式,但是可以使用R来模拟概率。

这是尝试:

Xi|piBer(pi)

piBeta(α,β)

使用维基百科,我们可以获得和估算值(请参阅参数估算部分)。α^β^

现在,您可以为第步骤生成从生成,然后从生成。完成次之后,您可以得到。这是生成Y的单个周期,请执行此(大)次数,并且 Y 的直方图将是Y密度的估计值。ithpiBeta(α^,β^)XiBer(pi)NY=XiMM

Prob[Yy]=#YyM

仅当不固定时,此分析才有效。pi这里不是这种情况。但是,如果有人有类似问题,我将在这里保留。


1
对于某些纯粹主义者而言,这可能不是贝叶斯方法。这实际上是经验贝叶斯方法,但是它是一种在R中模拟您的概率的快速方法,而无需求助于先验超大的巨型波。
suncoolsu

1
为什么给定p_i时需要先验?
ub

@whuber。谢谢,你是对的。我错过了固定部分。我以为David只是使用作为(qx)/ c 的值,并且不固定。我将编辑我的答案。pi
suncoolsu

@suncoolsu-请注意,“ beta-bernoulli”分布只是另一个bernoulli分布,但替换为。这是。因此,基本上,通过混合您将在此处应用二项式逼近。piαα+β(1xi)B(α+xi,β+1xi)B(α,β)=αxiβ1xiα+βpip1=p2==pn
概率

2

正如其他答案中提到的那样,您描述的概率分布是泊松二项分布。Hong,Yili给出了一种计算CDF的有效方法关于泊松二项式分布的分布函数的计算

该方法是有效地计算特征函数的DFT(离散傅里叶变换)。

泊松二项式分布的特征函数由 ()给出。ϕ(t)=jn[(1pj)+pjeit]i=1

该算法是:

  1. 令,对于。zj(k)=1pj+pjcos(ωk)+ipjsin(ωk)ω=2πn+1
  2. 定义,定义。xk=exp{jnlog(zj(k))}x0=1
  3. 为计算。使用对称来得到其余的值。xkk=1,,[n/2]x¯k=xn+1k
  4. 将FFT应用于向量。1n+1<x0,x1,,xn>
  5. 取结果的总和即可得到CDF。

该算法在poibin R软件包中可用。

与递归公式相比,这种方法提供的结果要好得多,因为它们往往缺乏数值稳定性。


3
我只能访问该论文的摘要,但听起来它实现了我在stats.stackexchange.com/questions/41247/…上使用的方法,并讨论了它与该线程中给出的其他方法的比较。如果您对本文的成就了解更多,我们将很高兴阅读摘要。
whuber

1

我建议应用泊松近似。众所周知(请参见AD Barbour,L。Holst和S. Janson:泊松近似),与具有泊松分布且参数的rv之间的总变化距离很小: 在信息差异方面也有界限(Kullback-Leibler距离,您可能会看到P.Harremoёs:“信息差异中的Poisson分布的收敛”。预印本第2号,2003年2月,哥本哈根大学数学系。http: //www.harremoes.dk/Peter/poisprep.pdfYZipi

supA|P(YA)P(ZA)|min{1,1ipi}ipi2.
和哈雷莫斯(P.Harremoёs)的其他出版物),卡方距离(请参阅Borisov和Vorozheikin https://link.springer.com/article/10.1007%2Fs11202-008-0002-3)和其他距离。

对于近似精度 无界功能您可能会看到鲍里索夫和Ruzankin https://projecteuclid.org/euclid.aop/1039548369。此外,该论文还包含一个简单的概率边界:对于所有,我们都有 |Ef(Y)Ef(Z)|fPÝ 1A

P(YA)1(1maxipi)2P(ZA).


1
+1感谢您提供有关近似范围的有用的定量信息。欢迎来到我们的网站!
ub
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.