winbugs入門cse.fra.affrc.go.jp/okamura/bayes/winbugs.pdf · 2007-07-31 · winbugsとは • bugs...
TRANSCRIPT
WinBUGS入門
遠洋水産研究所 外洋資源部
鯨類管理研究室
岡村 寛
水産資源学におけるベイズ統計の応用ワークショップ
2007年8月2-3日,中央水研
WinBUGSとは
• BUGS (Bayesian Inference Using Gibbs Sampling)のWindowsバージョン
フリーのソフトウェア
Gibbs samplingを利用した事後確率からのサ
ンプリングを行う
WinBUGS
• プログラムコードはRとよく似ている
• それゆえ,Rでプログラムが書けると理解が早いし,何かと便利
• R2WinBUGSというRからWinBUGSを呼び出して実行するプログラムも開発されている
• 様々な状況に自動で対応して適当なサンプリング法を選んでくれる
例. log-concave → adaptive rejection sampling範囲を制限したとき → スライスサンプラー
範囲制約がないとき → Metropolis法
WinBUGS画面
WinBUGSプログラム
基本的に,model.odc,data.dat,inits.inの3つのファイルからなる.
model.odcの中身の例model{…for (i in 1:N){Y[i] ~ dnorm(mu[i],tau)mu[i] <- a + b*x[i] # a + b*(x[i]-mean(x)) is better.
}…}
WinBUGSプログラミングの注意1• 変数を2度定義できない
x <- 1x <- 3 × ベクトルや行列で対応
• if文は使えない
X = (3, NA, 2) X=cbind(c(1,3),c(3,2))X[t,2]~dpois(N[X[t,1]]) (ただし,この場合はNAのままでもOK)
• × Y ~ dnorm(log(N), sigma)○ Y ~ dnorm(LN, sigma)
LN <- log(N)
WinBUGSプログラミングの注意2
• 最初に少ないパラメータからスタートして(いくつかのパラメータをfix),段々複雑にする
• R2WinBUGSを使うとデータの扱いなど便利
• bugs(data, inits,… , debug=TRUE,…) • Trapというエラーメッセージが出ることがある
→ 初期値がおかしい
事前分布を少し狭く ~ 徐々に広げる
WinBUGSプログラミングの注意3
• まず最尤法を用いた簡単なプログラムであたりをつける
• プロット!プロット!プロット!
• あまり洗練されたプログラムを書こうとしないこと
• よく使う人と友達になる
• 仲間を増やす
例題1(検定)
• 池A,池Bの中のある場所をランダムに選ん
で毎回同じ時間調査し,その中にいるメダカの数を数えた結果,下のようなデータが得られた(池Bは行きにくいので3回しか調査できなかった).池Aと池Bのメダカの数は違うであろうか?
検定仮説
• 検定したい仮説:
池Aの平均メダカ数 = 池Bの平均メダカ数
池Aと池Bの平均メダカ数は,
池A: 平均 1.5,分散 1.7池B: 平均 0.0,分散 0.0
t検定
池Bはメダカのサンプルなしなので,池Aの平均
が0と有意に違うかどうかを見るt検定を行う
> x <- c(1,1,0,4,2,2,0,2)> t.test(x)…t = 3.2404, df = 7, p-value = 0.01425 有意
通常の検定の何が問題か?
• 池Bはすべて0の観測値であるが,3回0が続いただけである.これは10回0が続いたのと
は証拠の大きさが異なるはずである.先の検定は,そこのとこを考慮していない.
• 3回とも0だったので分散は0となり,0確実である.しかし,3回しかやってないので,たまたま0が続いたということもあるのでは?
> rpois(3,1.5)[1] 0 0 0 なんていこうともありうる.
GLMしてみる
• カウントデータであるし,池Aの平均と分散は
およそ等しいのでポアソン分布を仮定してGLMしてみる
a <- factor(c(rep("A",8),rep("B",3)))x1 <- data.frame(area=a, med=c(x,rep(0,3)))res <-
glm(med~area,family=poisson,data=x1)
GLM結果
> summary(res)…Coefficients:
Estimate Std. Error z value Pr(>|z|)(Intercept) 0.4055 0.2887 1.405 0.160areaB -19.7081 5442.46 -0.004 0.997
収束していない.これは池Bが全部0だからである
こんなふうに考えてみる
池Aから3回続けてサンプルしたとき,すべ
て0となる確率はどうなるか?これがすごく
小さかったら,池Bは池Aよりメダカが少な
いと考えてもおかしくないであろう.確率が
大きければ,池Aと池Bが違うと考える根
拠は希薄であることになる.
事後予測分布
ベイズ推定で考えると,池Aのデータが与えられたとき,
新たな調査を行って3回続けて0となる確率を推定す
れば良い
y = {新たに調査したら3回続けて0}とするとき,事後予
測分布P(y|x) = ∫ P(y|θ)P(θ|x)dθを推定する
ポアソン分布を仮定すると3回続けて0= {exp(-θ)}3 = exp(-3θ)
WinBUGSコード
model{Jm ~ dunif(0,100) mu <- pow(Jm,-2) for (i in 1:N){x[i] ~ dpois(mu) # likelihood
}Prob <- exp(-3*mu)}list(x = c(1,1,0,4,2,2,0,2), N=8) # data
WinBUGS実行
1. プログラムをWinBUGS上で開く
2. ツールバーのModelのSpecification…を選択
3. プログラムのmodel部分を選んで,Specification Toolのcheck modelをクリック
4. データ先頭のlistを選んで,Specification Toolのload dataをクリック
5. compileをクリック
WinBUGS実行
6. 初期値を自動生成するため,今回はgen initsをクリック
7. ツールバーInferenceをクリックして,Samples…を選択
8. Sample Monitor Toolのnodeにmuと入れて,setをクリック
9. Sample Monitor ToolのnodeにProbと入れて,setをクリック
WinBUGS実行
10. 再びツールバーのModelをクリックし,今度はUpdate…を選択
11. Update Toolのupdateボタンをクリック
12. Sample Monitor Toolに行って,nodeにmuと入れる.下のボタンがactiveになる
13. densityやstatsボタンを押して結果を見る
14. nodeにProbを入れて同じことをする
WinBUGS実行
と文章や口で言っても分かりにくいので,実際
にやってみる
実演
WinBUGS – the movie!というページもある.動画で紹介.http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/winbugsthemovie.html
事後分布
平均 1.43 95%CI[0.72, 2.38]
平均 0.03 95%CI[0.001, 0.11]
まとめ
• ベイズ推定によって,うまいこと問題(池Bのサンプルサイズを考慮,観測したどのデータも0,など)を回避していることに注意
• 池Bの結果を,池Aの結果が与えられたという条件のもとで,池A=池Bとしたとき,池Bの結
果と同じようになる確率で評価した.他にどんなモデリングが考えられるか?(例.池Bの方も池Aと同じようにモデル化して,二つの平均を比較するとか)
例題2(階層ベイズ)
大西洋ビンナガマグロの漁獲量と
CPUEのデータにプロダクションモデ
ルをフィットし,そのパラメータの推定
結果を用いて,MSYを計算せよ.
最近の漁獲量は適切な水準にあると
言えるか?
CPUE (Catch Per Unit Effort)CPUE = 漁獲量 / 努力量
CPUE = qPq:漁獲効率,P:資源量(個体数 or 個体重量)
CPUEを使って個体群の増減が分かる
年トレンドの推定 → CPUEの標準化(GLM等)
CPUE = qPx (Hilborn & Walters 1992)
MSYの考え方
個体群の増加率(ロジスティック曲線)
dP/dt = rP(1-P/K)P:資源量,r:内的自然増加率, K:環境収容量
MSY(Maximum Sustainable Yield):dP/dtが最大になるのは,P=K/2のとき
P=K/2になるように魚を獲っていたら,最大の収穫を得
ながら,個体群を健全に維持できる!
0 KP
状態空間モデル
• State-Space Model
Xt-1 Xt Xt+1
Yt-1 Yt Yt+1
プロセス方程式: Xt = G(Xt-1, wt)
観測方程式: Yt = F(Xt, vt)
個体群動態モデルのパラメータ推定
ロジスティックモデル
Bt+1 = {Bt + rBt(1-Bt/K)-Ct}exp(ut)It = qBtexp(wt)
ut ~ N(0,sA2), wt ~ N(0,sO
2)MSY = rK/4BMSY = K/2EMSY = r/(2q)
プログラム中では,rとKの相関を弱めるため,Pt = Bt/Kを使う
状態空間モデルの特徴
• 観測誤差とプロセス誤差を同時に推定することが可能
• 計算機集約的な方法と組み合わせることにより,柔軟なモデリング・推定が可能
• カルマン・フィルタは状態空間モデルの特殊な場合と考えられる
• 一般に計算大変
データ:漁獲量とCPUE
南大西洋ビンナガマグロのデータ
WinBUGS実行
実演
事後分布
110,000万回計算して,最初の10,000回をburn-inとして取り除いた
RとKの相関
相関係数 = -0.84
r 0.0 0.2 0.4
K
200.0
300.0
400.0
500.0
600.0
自己相関thinningなし thinning=50
thinning=100 thinning=200
2本のchainでやってみる
R = V/WV = poolしたchainの変動W = 個々のchainの平均変動
R
WV
2本のchainでやってみる
R2WinBUGS
• RからWinBUGSを呼び出して解析を実行し,Rの中でoutputを操作
• データや初期値の作成が楽ちん
• 即codaを使える
• 最初は少ない繰り返し数で
R2WinBUGSでやってみる
coda
まとめ
• 個体群動態モデルでは,従来観測誤差かプロセス誤差のどちらか一方だけを仮定することが多かったが,ベイズ型状態空間モデルを使うことによってどちらの誤差も考慮した分析が比較的容易に行える
• いろいろプロットして,うまくいっているか確認することが大事
• R2WinBUGSを使うといろいろ便利なことが
参考文献
Meyer, R., and Millar, R. B. 1999. BUGS in Bayesian stock assessments. CJFAS 56: 1078-1086.
Plummer, M. 2006. CODA: convergence diagnosis and output analysis for MCMC. R News 6(1): 7-11.
Spiegelhalter et al. 2003. WinBUGS user manual version 1.4.