对 Pólya 分布的数值积分的建议

计算科学 正交
2021-12-09 09:06:09

这个问题来自贝叶斯统计建模项目。为了使用我的模型进行计算,我需要执行积分,其中被积函数的一部分是“Pólya”或“Dirichlet-Multinomial”分布,

p(nα)=(N!)Γ(Kα)Γ(α)KΓ(N+Kα)i=1KΓ(ni+α)ni!

在哪里niN=i=1Kni是整数,n=(n1,n2,,nK), 和α>0. 我想计算的积分,0(other terms)p(n|α)dα, 适用于小型N,但我尝试过的求积方法(在 MATLAB 中)分解为N变大。我没试过蒙特卡洛;一个准确、快速的求积方法对我的项目来说非常好。

目前,“最好”的方法是N大是计算log[p(n|α)]在 alpha 的网格上,归一化和取幂。这是不准确的(我基本上失去了关于分布的所有细节,除了它的峰值),但至少产生了一个数字。

我将不胜感激有关改进此计算的任何建议,或指向不同算法/方法或现有软件的指针。

编辑:我也许应该补充一点,我对p(n|α), 通过计算执行logp(n|α)使用一些精心编写的代码来计算logΓ(x)对于大x, 似乎没有引起任何问题。

编辑2:此外,“大”值将是N108, 最大ni105,以及许多小的值ni. 其他项在数值上表现良好。作为大致适当的尾部行为的简化,您可以采取

(other terms)=exp(α)

1个回答

对于积分,在处理指数时使用高斯正交规则作为经验法则。例如,使用辛普森规则或梯形规则在小面积上积分三次函数不需要大的 N,但将它们用于指数函数会导致实现收敛所需的巨大 N。所以总是选择基于指数的插值(即:高斯正交规则)。如果这失败了,那么您需要绘制函数以查看它的振荡速度以及它如何随着积分区域的消亡/上升。