2015-04-01 20 views
-1

我目前正在通過Jim Albert的R進行貝葉斯思考。我有一個關於他的代碼的查詢,他的例子有一個beta可能性和離散事件。他計算後的代碼是:使用離散事先標準化β分佈的常量:R代碼查詢

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)成正比,但是不清楚接下來的兩行是怎麼做的 - 我想這與標準化常量有關,但是再次沒有這本書中沒有解釋。

+1

以'like ='開頭的第二行只是將'p'設置爲0或1時設置爲零(實際爲'exp(-999)')的可能性的一種方式。在下面的行中,由於exp(-max(like))因子的可能性可能是爲了避免由於數字太接近零而導致的精度損失。 – nicola 2015-04-01 15:30:23

+1

但是,我不明白他爲什麼不使用'dbeta'。 – nicola 2015-04-01 15:32:46

回答

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)) 

是當僅在記錄的值的相對差異是很重要的一個exponentiate數值穩定的方式。如果像真的很小,例如你有很多的成功和失敗,那麼exp(like)在計算機中可能會被表示爲0向量。只有相對差異很重要,因爲在構造後驗概率時,將產品重新歸一化爲1。