関数解読pdisc

Bayesian Computation with R: Second Edition (Use R!)

離散事前分布を用いた場合の比率に関する事後分布の計算

使用法

pdisc(p, prior, data)

引数
p:(推測する)比率の候補となる値で構成されるベクトル
prior:候補となる各比率の事前確率で構成されるベクトル
data:成功と失敗の数で構成されるベクトル
 確率pで成功が起こるベルヌーイ分布でモデル化


候補となる各比率の事前確率で構成されるベクトル

#関数pdiscの中身
pdisc = function (p, prior, data)
{
    s = data[1]
    f = data[2]
    p1 = p + 0.5 * (p == 0) - 0.5 * (p == 1)
     #ベクトルpの要素に0があれば,その要素に0.5を加える。
     #ベクトルpの要素に1があれば,その要素から0.5を引く。
     # 上の操作は何を意味する?
     #log(0)は計算できないからか。
     #ベクトルpの要素に0も1もなければ,p1=pでこれが通常。

    like = s * log(p1) + f * log(1 - p1)
     #対数尤度(A)   (定数項を除く)
       #確率p1で成功がs回発生
       #確率1-p1で失敗がf回発生

    like = like * (p > 0) * (p < 1) -
    999 * ((p == 0) * (s > 0) + (p == 1) * (f > 0))
     #通常は第1項目のみでOK。
     # p>0かつp<1の場合は対数尤度(A)をそのまま代入。

     # p==0かつs>0 (成功の確率は0なのに成功した結果あり)
     # p==1かつf>0 (失敗の確率は0なのに失敗した結果あり)
     #  この場合,log(0)=-Infの代わりに-999を代入。

    like = exp(like - max(like))

     #対数尤度を尤度に戻す。
     # max(like)を引く意味は?
     # 後でsum(post)=1となるよう基準化するので,
     # -max(like)はなくても同じ。
     # exp(like - max(like))=exp(like)*exp(-max(like))
     #  exp()の値を発散させないよう念のため付けてる?

    product = like * prior
     #事後分布のカーネル

    post = product/sum(product)
     #事後確率
     #sum(post)=1がとなるようにproductを基準化


    return(post)#事後確率postを出力
}

#比率(成功確率)と対応する事前確率
p=c(.0,.25,.3,1)
prior=c(.25,.25,.25,.25)

#成功と失敗の数
data=c(5,10)

#比率(成功確率)の事後確率
pdisc(p,prior,data)