※古い記事です。懐かしのBRugsを使っています。
問題設定
- 2つのミカンの産地$ \tau_1$ と $\tau_2$ を考える。
- ミカンには、甘い$y_1$ のと酸っぱい $y_2$ のがあり、年によってその割合は異なる。
- 良作の年 $\beta_1$ は9割が甘いが、通常の年 $\beta_2$ は半々ぐらい、不作の年 $\beta_3$ は、1割しか甘いのがない。
- 産地$\tau_1$は良作の年が多く、産地$\tau_2$は不作の年が多い。
- 今、店で5つのミカンを買って食べたところ、{甘い、甘い、酸っぱい、酸っぱい、甘い}、すなわち、$y={y_1,y_1,y_2,y_2,y_1}$ だった。
- どちらの産地のどの年のミカンが出回っているのだろうか?
尤度 $Pr(y|\tau,\beta)$ は次のとおり。
$y=1$ | $y=2$ | ||
---|---|---|---|
$\Pr(\tau_1)=0.5$ | $\Pr(\beta_1;\tau_1)=0.7$ | 0.9 | 0.1 |
$\Pr(\beta_2;\tau_1)=0.2$ | 0.5 | 0.5 | |
$\Pr(\beta_2;\tau_1)=0.1$ | 0.1 | 0.9 | |
$\Pr(\tau_2)=0.5$ | $\Pr(\beta_1;\tau_2)=0.1$ | 0.9 | 0.1 |
$\Pr(\beta_2;\tau_2)=0.2$ | 0.5 | 0.5 | |
$\Pr(\beta_3;\tau_1)=0.7$ | 0.1 | 0.9 |
求めたい事後分布は、$\beta_1,\tau_1$ で例示的に示すと、
$$
\Pr(\beta_1,\tau_1|y)
=\frac{\Pr(y|\beta_1)\Pr(\beta_1|\tau_1)\Pr(\tau_1)}
{\sum_{i=1}^{3}\Pr(y|\beta_i)\Pr(\beta_i|\tau_1)\Pr(\tau_1)+\sum_{i=1}^{3}\Pr(y|\beta_i)\Pr(\beta_i|\tau_2)\Pr(\tau_2)}
$$
ただし、
$$
\Pr(y|\beta_1)=\Pr(y_1|\beta_1)\Pr(y_1|\beta_1)\Pr(y_2|\beta_1)\Pr(y_2|\beta_1)\Pr(y_1|\beta_1)
$$
$\tau$ を与えたときの $\beta$ の事後分布は、
$$
\Pr(\beta_1|\tau_1,y)
=\frac{\Pr(y|\beta_1)\Pr(\beta_1|\tau_1)\underline{\Pr(\tau_1)}}
{\sum_{i=1}^{3}\Pr(y|\beta_i)\Pr(\beta_i|\tau_1)\underline{\Pr(\tau_1)}}
$$
$$
=\frac{\Pr(y|\beta_1)\Pr(\beta_1|\tau_1)}
{\sum_{i=1}^{3}\Pr(y|\beta_i)\Pr(\beta_i|\tau_1)}
$$
$\beta$ を与えたときの $\tau$ の事後分布は、
$$
\Pr(\tau_1|\beta_1,y)
=\frac{\underline{\Pr(y|\beta_1)}\Pr(\beta_1|\tau_1)\Pr(\tau_1)}
{\underline{\Pr(y|\beta_1)}\Pr(\beta_1|\tau_1)\Pr(\tau_1)+
\underline{\Pr(y|\beta_1)}\Pr(\beta_1|\tau_2)\Pr(\tau_2)}
$$
$$
=\frac{\Pr(y|\beta_1)\Pr(\beta_1|\tau_1)\Pr(\tau_1)}
{\Pr(\beta_1|\tau_1)\Pr(\tau_1)+
\Pr(\beta_1|\tau_2)\Pr(\tau_2)}
$$
ギブスサンプラーは、上記の2種の確率で$\beta$ と $\tau$ を発生させること。
GSのプロシジャーをRで再現してみる
各種確率を与える。
py<-rep(NA,3)
pb<-matrix(nrow=3,ncol=2)
pt <-rep(NA,2)
py[1] <-0.9
py[2] <-0.5
py[3] <-0.1
p <-cbind(py,1-py)
pb[1,1] <-0.7
pb[2,1] <-0.2
pb[3,1] <-0.1
pb[1,2] <-0.1
pb[2,2] <-0.2
pb[3,2] <-0.7
pt[1] <-0.5
pt[2] <-0.5
y <-c(1,1,2,2,1)
$\Pr(y|\beta)$
p
py [1,] 0.9 0.1 [2,] 0.5 0.5 [3,] 0.1 0.9
pb
[,1] [,2] [1,] 0.7 0.1 [2,] 0.2 0.2 [3,] 0.1 0.7
$\Pr(\tau)$
pt
[1] 0.5 0.5
$y$
y
[1] 1 1 2 2 1
τを与えたときのβの事後分布を求める関数の定義
$\Pr(β=1,2,3|\tau,y)$
$=\Pr(y|\beta=1,2,3)\Pr(β=1,2,3|\beta)/\sum_i\Pr(y|\beta=i)\Pr(\beta=i|\tau)$
pbeta <-function(y,tau){
N <-length(y)
p01 <-c(1,1,1)
for(i in 1:N){
p01 <-p01*p[,y[i]]
}
pb01 <-p01*pb[,tau]/
(p01[1]*pb[1,tau]
+p01[2]*pb[2,tau]
+p01[3]*pb[3,tau])
pb01
}
$\beta$を与えたときの$tau$の事後分布を求める関数の定義
$\Pr(τ=1,2|\beta,y)$
$=\Pr(\beta|\tau=1,2)\Pr(\tau=1,2)$
ptau <-function(beta){
pt00 <-pb[beta,]*pt[]/
(pb[beta,1]*pt[1]
+pb[beta,2]*pt[2])
pt00
}
βとτの初期値を(1,1)に指定。
beta00 <-1
tau00 <-1
繰り返しの回数を10000に設定
itr=10000
ギブスサンプラーの実行:o01に結果。
o01 <-matrix(nrow=itr,ncol=2)
for(i in 1:itr){
beta01 <-sample(1:3,1,p=pbeta(y,tau00))
tau01 <-sample(1:2,1,p=ptau(beta00))
beta00 <-beta01
tau00 <-tau01
o01[i,1] <-beta01
o01[i,2] <-tau01
}
hist(o01[,1])
BRugsでも計算してみる。
gmodel.txt
model{
for(i in 1:N){
y[i]~dcat(p[])
}
p[1] <-py[beta]
p[2] <-1-p[1]
py[1] <-0.9
py[2] <-0.5
py[3] <-0.1
pb[1,1] <-0.7
pb[2,1] <-0.2
pb[3,1] <-0.1
pb[1,2] <-0.1
pb[2,2] <-0.2
pb[3,2] <-0.7
pt[1] <-0.5
pt[2] <-0.5
beta~dcat(pb[,tau])
tau~dcat(pt[])
}
Rスクリプト
d01 <-list(y=c(1,1,2,2,1),N=5)
d02 <-list(list(beta=1,tau=1),list(beta=2,tau=2))
library(BRugs)
setwd("d:/home/doc")
modelCheck("gmodel.txt")
bugsData(d01,"./data.txt")
modelData("./data.txt")
modelCompile(numChains=2)
bugsInits(d02,numChain=2,file=c("./inits1.txt","./inits2.txt"))
modelInits(c("inits1.txt","inits2.txt"))
modelGenInits()
samplesSet(c("beta", "tau"))
summarySet(c("alpha","beta1"))
modelUpdate(10000)
samplesStats("*")
両者の結果を比較してみる。
Rスクリプト
summary(factor(o01[,1]))/length(o01[,1])
o02 <-samplesSample("beta")
summary(factor(o02))/length(o02)
summary(factor(o01[,2]))/length(o01[,2])
o03 <-samplesSample("tau")
summary(factor(o03))/length(o03)
結果
summary(factor(o01[,1]))/length(o01[,1])
1 2 3
0.3073 0.6616 0.0311
o02<-samplesSample("beta")
summary(factor(o02))/length(o02)
1 2 3
0.31548155 0.64996500 0.03455346
summary(factor(o01[,2]))/length(o01[,2])
1 2
0.6043 0.3957
o03<-samplesSample("tau")
summary(factor(o03))/length(o03)
1 2
0.6079108 0.3920892
産地1の並作の年のミカンである確率が最も高い。それぞれ6割、6割5分で。