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

时间:2013-04-21 02:43:12

标签: r statistics

我试图在R中计算这个后验分布。问题是分子,它是一堆dbern(p_i,y_i)< 1,太小了。 (我的约是1500)。因此,R吐出0,所有\ theta的后验值也为0.

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

enter image description here

可重复的例子(分子)

p <- sample(seq(0.001,0.999,by=0.01), 1500, replace=T)
y <- sample(c(0,1), 1500, replace=T)
dbern(y, p) # 1500-element vector, each element < 1
prod(dbern(y, p)) # produces 0
exp(sum(log(dbern(y, p)))) # produces 0

编辑(上下文):我正在进行贝叶斯变换点分析(jstor.org/stable/25791783 - Western和Kleykamp 2004)。与论文中的连续y不同,我的y是二元的,所以我在Albert和Chib(1993)中使用数据增强方法。使用该方法,y的可能性是伯努利,p = cdf-normal(x'B)。

那么p如何依赖于theta?这是因为θ是变化点。其中一个x是时间虚拟 - 例如,如果theta = 10,那么第10天之后所有观测值的时间dummy = 1,而第10天之前的所有观测值则= 0。

因此,p取决于x,x取决于θ - 因此,p取决于θ。

我需要上面的数量,因为这是吉布斯采样中theta的全部条件。

3 个答案:

答案 0 :(得分:5)

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

如果您为了优化而计算后验,请注意您可以完全删除分母:您无需标准化以找到argmax

答案 1 :(得分:3)

我运行了你的例子,你是(正如预期的那样)获得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

答案 2 :(得分:1)

我也在Cross Validated上问了这个问题,glen_b给了我这个(测试过的)解决方案:


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

在这种情况下,我建议:

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

步骤2:处理对数刻度,这意味着分子是日志差异总和的exp,分母是日志差异总和的exp之和。

注意:如果您的任何一个是0或1,请单独取出它们,不要记录这些条款;它们很容易评估!

分子中的通常术语在大小上往往会更加温和,因此在许多情况下,分子和分母都是相对合理的。

如果分母中有一系列尺寸,请在添加较大尺寸之前加上较小的尺寸。

如果一个或几个术语占主导地位,你应该把注意力集中在那些相对准确的计算上。