具有离散先验的 beta 分布的归一化常数:R 代码查询

Normalizing constant for beta distribution with discrete prior : R code query

我目前正在学习 Jim Albert 的 Bayesian Thinking with 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) 成正比,但不清楚以下两行在做什么 - 我想这与归一化常数有关,但是书中也没有对此的解释。

like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s > 
    0) + (p == 1) * (f > 0))

处理先验概率为 0 或 1 的边缘情况。基本上,如果 p=0 并且观察到任何成功,则 like=-999,如果 p=1 并且观察到任何失败,则 like= -999。我宁愿使用 -Inf 而不是 -999,因为在这些情况下,对数似然就是这样。

第二行

like = exp(like - max(like))

当只有记录值的相对差异很重要时,

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