関数解読discint

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

離散確率分布に対して最高確率区間を計算する。

 最高確率区間:こちらから与える確率を含む最短区間
  確率分布が単峰でない場合は,2つ以上の区間に分かれる。
  確率分布が左右対称でない場合は,区間の位置が分布中心から左右のどちらかにずれる。

使用法

discint(dist, prob)

引数
dist:1列目に確率変数の値,2列目に対応する確率を含む行列
prob:最高確率区間を求めるためにこちらから与える確率の値


prob:下記のsetに含まれる確率変数のどれかが実現する正確な確率(>=prob)
set:最高確率区間に含まれる確率変数の値の集合

discint = function (dist, prob)
#関数discintの中身
{

    x = dist[, 1]
    p = dist[, 2]
     # distの中身をx,pに分けて保存。
    n = length(x)
     # xの長さをnに保存。
     
    sp = sort(p, index.return = TRUE)
     # pを昇順で並べ替えて,対応する要素の位置も出力し,
     #  spにリストとして保存。

    ps = sp$x
     # 昇順に並べ替えたpをpsに保存。後で使わず。
     
    i = sp$ix[seq(n, 1, -1)]
     # seq(n, 1, -1)
     #  nから1まで1ずつ減少する数列
     # sp$ix[seq(n, 1, -1)]
     #  pの昇順に対応する添字を降順に変換しiに保存。
     # 結局,iにはpの要素を降順で並べ替えた場合の
     #  pの要素の位置が保存されている。


    ps = p[i]
     # pの要素を降順で並べ替えてpsに保存。
     # ps = sp$x[seq(n,1,-1)]でも良さそう。

    xs = x[i]
     # xをpの要素を降順に対応するように並べ替えてxsに保存。

    cp = cumsum(ps)
     # psの累積和を計算。
     #  cp[i]=sum(ps[1:i])

    ii = 1:n
     # 別の添字1〜nの作成。

    j = ii[cp >= prob]
     # cp>=probを満たすcpの要素について,iiの位置でTRUEと表す。

    j = j[1]
     # cp>=probを最初に満たしたcpの要素の位置をjに保存。
     #  cp[j]>=prob かつ cp[j-1]<prob が成立。

    eprob = cp[j]
     # cp[j]をeprobに保存。

    set = sort(xs[1:j])
     # xs[1:j]を昇順に並べ替え,setに保存。

    v = list(prob = eprob, set = set)
     # eprobとsetをリスト形式にしてvに保存。
    
    return(v)
     # vを出力。
}

x=0:10
probs=dbinom(x,size=10,prob=.3)

# 図示
plot(x,probs,type="h")

dist=cbind(x,probs)
pcontent=.8

(hpi = discint(dist,pcontent))
$prob
[1] 0.8214841

$set
[1] 1 2 3 4