可能太小的乘积-R只给出0

可能太小的乘积-R只给出0,r,statistics,R,Statistics,我试图计算R中的后验分布。问题是分子太小了,它是一群dbern(p_I,y_I)

我试图计算R中的后验分布。问题是分子太小了,它是一群dbern(p_I,y_I)<1的乘积。(我的n大约是1500)。因此,R吐出0,所有θ的后验值也为0

为了澄清,每个y_i都有自己的p_i,这些p_i一起构成n个元素的向量。每个θ都有自己的p_i的n元素向量

(分子的)可复制的例子


p解决此类精度问题的一种方法是在日志空间中工作。然而,这引入了分母的对数和积,这通常可能是痛苦的


如果为了优化目的而计算后验概率,请注意,您可能能够完全去掉分母:您不需要进行规格化以找到
argmax

我运行了您的示例,您(如预期)得到了
0
,因为存在
0

p <- sample(seq(0,1,by=0.01), 1500, replace=T)
y <- sample(c(0,1), replace=T)
x <- dbern(y, p)
any(x == 0)
## [1] TRUE

p我也在交叉验证中问了这个问题,并给了我下面这个(测试过的)解决方案:


这是计算各种模型可能性的常见问题;通常要做的事情是处理日志,并使用一个通用的比例因子,将值带入一个更合理的范围

在这种情况下,我建议:

步骤1:选择一个相当“典型”的θ,θ0。将一般项的分子和分母的公式除以θ=θ0的分子,以得到不太可能下溢的东西

步骤2:在对数刻度上工作,这意味着分子是对数差值和的exp,分母是对数差值和的exp之和

注意:如果你的任何一个p值是0或1,请分别取出,不要记录这些术语;它们很容易评估

分子中的常用术语在大小上趋于适中,因此在许多情况下,分子和分母都相对合理

如果分母中有一系列大小,则先将较小的数相加,再将较大的数相加


如果有一个或几个术语占主导地位,你应该集中精力对那些相对准确的术语进行计算。

你应该使用
log.likelion
我试过了。如果我没有错的话,是不是要取概率(<0)的对数,将这1500个负数相加,然后exp(总和)?即使如此,总和仍然是负数,exp(总和)仍然是0。可能是我做错了吗?好吧,给我们发一个可复制的例子,让我们试一下你能告诉我们更多关于上下文/如何定义
p|I | theta
吗?上下文有点长,所以我编辑了主要的帖子。非常感谢。我在上面的评论中尝试了对数可能性。我做错了吗?要在对数空间中工作,只需将
log
应用于方程的两边,并使用标准恒等式:比率变为差,乘积变为和,等等。但是请注意,没有标准标识可以将日志移过总和。还要注意,R中的大多数PDF都有一个log argumentOK——但dbern小于1,因此其日志为负。将这些负数中的n=1500求和产生一个非常负数。求和的幂仍然会产生一个0。计算完这个数字后,你需要对它做什么?我能想到的唯一一个统计应用需要计算似然而不是对数似然,那就是贝叶斯后验概率分母的积分。如果你真的需要处理这么小的数字,你可以使用
Brobdingnag
包:。。。但更多的上下文将是有用的。谢谢你指出。这是因为我从[0,1]中生成p。在我的实际应用程序中,p从来都不是精确的0或1。我编辑了上面的代码,使其在p中不包含0和1。
p <- sample(seq(0,1,by=0.01), 1500, replace=T)
y <- sample(c(0,1), replace=T)
x <- dbern(y, p)
any(x == 0)
## [1] TRUE