使用离散先验:R代码查询归一化β分布的常数

时间:2015-04-01 14:56:14

标签: r bayesian

我目前正在接受Jim Albert的贝叶斯思维与R 。我有一个关于他的代码的查询,他的例子有beta似然和离散先验。他计算后验的代码是:

pdisc <- function (p, prior, data) 
    s = data[1] # successes
    f = data[2] # failures

    #############
    p1 = p + 0.5 * (p == 0) - 0.5 * (p == 1)
    like = s * log(p1) + f * log(1 - p1)
    like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s > 
        0) + (p == 1) * (f > 0))
    like = exp(like - max(like))
    #############

    product = like * prior
    post = product/sum(product)
    return(post)
}

我的查询是关于用于计算可能性的突出显示的代码,以及它背后的逻辑(在书中没有解释)。我知道beta分布的pdf,并且对数可能性与s * log(p1) + f * log(1 - p1)成正比,但不清楚以下2行是做什么的 - 我想它是什么的使用归一化常数,但在书中没有对此进行解释。

1 个答案:

答案 0 :(得分:2)

该行

like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s > 
    0) + (p == 1) * (f > 0))
当先前概率为0或1时,

处理边缘情况。基本上,如果p = 0并且观察到任何成功,那么类似于= -999并且如果p = 1并且观察到任何失败,那么就像= -999 。我宁愿使用-Inf而不是-999,因为这是那些情况下的对数可能性。

第二行

like = exp(like - max(like))
当只有记录值的相对差异很重要时,

是一种数值稳定的取幂方法。如果喜欢真的很小,例如你有很多成功和失败,那么exp(like)可能会在计算机中表示为0向量。只有相对差异在这里很重要,因为在构造后验概率时,将产品重新归一化为总和为1.