2010-02-09 - 地域生態系学講座

2010–02–09
統計数理研究所 公開講座 (2010-02-09)
「マルコフ連鎖モンテカルロ法の基礎と実践」 の投影資料
(久保担当部分)
2. ベイジアンモデリングと MCMC
3. R と WinBUGS の使いかた
久保拓弥 kubo@ees.hokudai.ac.jp
http://hosho.ees.hokudai.ac.jp/~kubo/ce/IsmBayes2010.html
2010–02–09
(2010-02-21 08:28 修正版)
1/ 108
• 今日の投影資料は配布資料版を修正・改訂したものです
配布版とほぼ同じ
かなり変更したペイジ
追加ペイジ
• 最新版 PDF ファイルは
http://hosho.ees.hokudai.ac.jp/~kubo/ce/
IsmBayes2010.html
からダウンロードできます
2010–02–09
(2010-02-21 08:28 修正版)
2/ 108
伊庭さんの MCMC 講座 (前半)
(久保が勝手にまとめ)
• Markov Chain Monte Carlo の目的: 多変量の分布からのサンプ
リング方法
• MCMC の要点: 乱数による変化 + 少しずつ変える (マルコフ
連鎖) でうまくいく
• ギブス・サンプラー: 条件つき確率分布を使ったわかりやすい
MCMC
• 定常分布,収束,非周期性,詳細釣り合い,……
• メトロポリス法: 試行錯誤で値を変化させていく MCMC
• などなど
2010–02–09
(2010-02-21 08:28 修正版)
3/ 108
久保の話の中で検討していくこと
• 直線回帰などといった 統計モデルあてはめと MCMC は
どう関係するんだろう?
• 階層ベイズモデルと MCMC の関係は?
– そもそも階層ベイズモデルとは?
• 簡単な階層ベイズモデルは,R や WinBUGS といった誰
でも簡単に入手できるソフトウェアであつかえる
2010–02–09
(2010-02-21 08:28 修正版)
4/ 108
統計モデリング: 観測データのモデル化
• 統計モデルは観測データのパターンをう
まく説明できるようなモデル
• 基本的部品: 確率分布
(とそのパラメーター)
• データにもとづくパラメーター推定,あ
てはまりの良さを定量的に評価できる
たとえば「結果 ← 原因」関係を一番単
純に表現している線形モデルという統計
モデルについて……
2010–02–09
(2010-02-21 08:28 修正版)
5/ 108
「結果 ← 原因」関係を表現する線形モデル
• 結果: 応答変数
• 原因: 説明変数
• 線形予測子
(linear predictor):
(応答変数の平均) = 定数 (切片)
(あるいは応答変数の平均の関数)
2010–02–09
(2010-02-21 08:28 修正版)
+
(係数 1) × (説明変数 1)
+
(係数 2) × (説明変数 2)
+
(係数 3) × (説明変数 3)
+
···
6/ 108
2010–02–09
(2010-02-21 08:28 修正版)
7/ 108
今日の話: ベイズモデルを WinBUGS で
2. ベイジアンモデリングと MCMC
階層ベイズモデルとは何か?
MCMC とどういう関係にあるのか?
3. R と WinBUGS の使いかた
階層ベイズモデルを推定するソフトウェアは?
WinBUGS はどうやって使うか?
2010–02–09
(2010-02-21 08:28 修正版)
8/ 108
2. ベイジアンモデリング
と MCMC
本日の例題: 植物の種子と二項分布
2010–02–09
(2010-02-21 08:28 修正版)
10/ 108
繁殖生態学の例題: 架空植物の結実確率
• 架空植物の胚珠の結実を調べた
• 用語
– 胚珠: 種子のもとになる器
官 (この植物ではどの個体
でも 8 個 調べたとする)
– 結実: 胚珠が種子になるこ
と
– 結実確率: ある胚珠が種子
になる確率
胚珠数 Ni = 8
個体 i
結実数 yi = 3
• データ: 植物 100 個体,合計 800 胚珠の結実の有無を調べた
• 問: この植物の結実確率はどのように統計モデル化できるか?
2010–02–09
(2010-02-21 08:28 修正版)
11/ 108
このあとの統計モデル化の説明の手順
1. 簡単な例題: GLM でうまくいく場合
• 統計モデルの部品: 二項分布モデル (GLM)
• 統計モデルの推定方法: 最尤推定法
2. MCMC とベイズモデリング
• 最尤推定を MCMC におきかえてみる
• MCMC で得られた結果をベイズ的に解釈
3. ちょっと難しい例題: GLM でうまくいかない場合
• 「個体全体の平均」と「個体差」をどうあつかう?
• 階層ベイズモデル!
2010–02–09
(2010-02-21 08:28 修正版)
12/ 108
簡単な例題: 結実確率は全個体で同じ (「個体差」なし)
0
1
2
3
4
5
6
7
8
観察された個体数
0
5
8
21
29
22
12
2
1
観察された
0
5
植物の個体数
10
15
20
25
30
個体ごとの結実数
0
2
4
6
8
結実した種子数 yi
2010–02–09
(2010-02-21 08:28 修正版)
13/ 108
結実確率 q と二項分布の関係
• 結実確率を推定するために 二項分布という確率分布を
使う
• 個体 i の Ni 胚珠中 yi 個が結実する確率は二項分布
( )
Ni yi
f (yi | q) =
q (1 − q)Ni −yi ,
yi
• ここで仮定していること
– 個体差はない
– つまり すべての個体で同じ結実確率 q
2010–02–09
(2010-02-21 08:28 修正版)
14/ 108
二項分布で「Ni 個中の yi 個」型データをあつかう
(
f (yi | q) =
Ni
q yi (1 − q)Ni −yi ,
0.30
yi
)
0.00
0.10
0.20
Ni = 8
q = 0.5
0
2
4
6
8
結実した種子数 yi
2010–02–09
(2010-02-21 08:28 修正版)
15/ 108
ゆうど
尤度: 100 個体ぶんのデータが観察される確率
• 観察データ {yi } が与えられたもので,パラメータ q は
値が自由にとりうると考える
• この 100 個体ぶんの確率はパラメータ q の関数として
定義される尤度
L(q| 全 yi ) =
100
∏
f (yi | q)
i=1
(先ほどの観測データ)
個体ごとの結実数
0
1
2
3
4
5
6
7
8
観察された個体数
0
5
8
21
29
22
12
2
1
2010–02–09
(2010-02-21 08:28 修正版)
16/ 108
対数尤度方程式と最尤推定
• この尤度 L(q | データ) を最大化するパラメータの推定
量 qˆ を計算したい
• 尤度を対数尤度になおすと
log L(q | データ) =
100
∑
i=1
+
100
∑
log
(
Ni
)
yi
{yi log(q) + (Ni − yi ) log(1 − q)}
i=1
• この対数尤度を最大化するように未知パラメーター q
の値を決めてやるのが最尤推定
2010–02–09
(2010-02-21 08:28 修正版)
17/ 108
最尤推定とは何か
• 対数尤度 L(q | データ) が最大になるパラメーター q の
値をさがしだすこと
結実合計
404
qˆ =
=
= 0.505
800
胚珠合計
2010–02–09
(2010-02-21 08:28 修正版)
-1200
log likelihood
-1000 -800
-600
-400
-200
*
-1400
• 対数尤度 L(q | データ) を q で
偏微分して 0 となる qˆ が対数
尤度最大
∂L(q | データ)/∂q = 0
• 結実確率 q が全個体共通の場
合の最尤推定量・最尤推定値は
0.0
0.2
0.4
q
0.6
0.8
1.0
18/ 108
二項分布で説明された 8 胚珠中 yi 個の結実
y
0.505y 0.4958−y
20
25
30
qˆ = 0.505 なので
(8)
観察された
0
5
植物の個体数
10
15
二項分布
による予測
0
2
4
6
8
結実した種子数 y
2010–02–09
(2010-02-21 08:28 修正版)
19/ 108
MCMC で結実確率 q を推定する:
パラメーター q の確率分布?
2010–02–09
(2010-02-21 08:28 修正版)
20/ 108
ここでやること: 尤度と MCMC の関係を考える
• さきほどの簡単な例題 (結実確率) のデータ解析を
• 最尤推定ではなく
• 試行錯誤な MCMC 法であるメトロポリス 法であつかう
• 得られる結果: パラメーターの分布?
あえて MCMC をもちださなくてもいい問題に関して
メトロポリス法を適用してみて,
その挙動だの得られる結果だのをながめてみる
2010–02–09
(2010-02-21 08:28 修正版)
21/ 108
数値的に試行錯誤するパラメーター推定
連続的な対数尤度関数 log L(q)
離散化: q がとびとびの値をとる
-180
-195
-195
-190
-190
→
log likelihood
-185
log likelihood
-185
-180
*
0.40
0.45
0.50
q
0.55
0.60
0.40
0.45
0.50
q
0.55
0.60
(簡単のため,結実確率 q の軸を離散化する)
2010–02–09
(2010-02-21 08:28 修正版)
22/ 108
メトロポリス法で q を変化させていく
-185
メトロポリス法は MCMC アルゴリズムのひとつ (cf. 伊庭さんの解説)
-184
10
9
-186
-186.07
log likelihood
-186
-185
log likelihood
-188 -187
8
-187.33
3
-187
-189
-188.69
7
-188
-190
6
5
4
2
1
0.415
0.420
0.425
q
0.430
0.435
0.425
0.430
q
0.435
0.440
(q の初期値を 0.425,ランダムウォークで移動先を選ぶ)
2010–02–09
(2010-02-21 08:28 修正版)
23/ 108
-195
log likelihood
-190
-185
-180
対数尤度関数上での q の変化
0.40
2010–02–09
0.45
(2010-02-21 08:28 修正版)
0.50
q
0.55
0.60
24/ 108
0.40
0.45
q
0.50
0.55
0.60
MCMC ステップにそった q の変化
0
20
40
step
60
80
100
右側は q のヒストグラム
2010–02–09
(2010-02-21 08:28 修正版)
25/ 108
MCMC は何をサンプリングしている?
既出の対数尤度 log L(q)
尤度 L(q) に比例する確率密度関数
20
0
-195
5
10
log likelihood
-190
-185
15
-180
*
0.40
0.45
0.50
q
0.55
0.60
0.40
0.45
0.50
q
0.55
0.60
尤度に比例する確率分布からのランダムサンプル
(「パラメーターの分布」と仮称)
「マルコフ連鎖の収束定理」のおかげ (cf. 伊庭さんの説明)
2010–02–09
(2010-02-21 08:28 修正版)
26/ 108
0.40
0.45
q
0.50
0.55
0.60
もっと長くサンプリングしてみる
0
200
400
step
600
800
1000
まだまだ……?
2010–02–09
(2010-02-21 08:28 修正版)
27/ 108
0.40
0.45
q
0.50
0.55
0.60
もっともっと長くサンプリングしてみる
0
20000
40000
step
60000
80000
ターゲットとなる「パラメーターの分布」に近づいてきた
2010–02–09
(2010-02-21 08:28 修正版)
28/ 108
0
5
10
15
20
MCMC の結果として得られた「q の分布」
0.40
0.45
0.50
q
0.55
0.60
• データからえられる推定結果としては有用: 分布の平均
や区間推定など
• 「パラメーターの分布」 …… ベイズ統計でいうところ
の事後分布
2010–02–09
(2010-02-21 08:28 修正版)
29/ 108
いったん整理: 尤度と MCMC の関係
• 統計モデルを作ると,あるデータのもとでの尤度が定義
される
• この尤度に対して MCMC すると「尤度に比例するパラ
メーターの分布」からのランダムサンプルがえられる
0.40
0.45
q
0.50
0.55
0.60
• ベイズとの関連: これは事後分布からのサンプリングで
ある
0
2010–02–09
(2010-02-21 08:28 修正版)
20000
40000
step
60000
80000
30/ 108
いったん整理: いろいろな MCMC の方法
• メトロポリス法: 試行錯誤で値を変化させていく MCMC
– メトロポリス・ヘイスティングス法: その改良版
• ギブス・サンプラー: 条件つき確率分布を使った MCMC
– 普通は複数の変数 (パラメーター・状態) のサンプリングの
ためにもちいる
• メトロポリス法で説明したけれどギブス・サンプラー
でも同じことが言える
• ここからあとで登場する MCMC はギブス・サンプ
ラーと考えてください
2010–02–09
(2010-02-21 08:28 修正版)
31/ 108
ベイズモデル: 尤度・事後分布・事前分布……
p(D | P ) × p(P )
• ベイズの公式
p(P | D) =
p(D)
• p(P | D) は何かデータ (D) のもとで何かパラメーター (P )
が得られる確率 → 事後分布
• p(P ) はあるパラメーター P が得られる確率 → 事前分布
• p(D) は「てもとにあるデータ D が得られる確率」
• p(D | P ) パラメーターを決めたときにデータが得られる確率
→ 尤度
尤度 × 事前分布
事後分布 =
(データが得られる確率)
事後分布 ∝ 尤度 × 事前分布
2010–02–09
(2010-02-21 08:28 修正版)
32/ 108
現在の例題で仮定している事前分布
q の事前分布は一様分布,と考えるとつじつまがあう?
q の尤度
q の事前分布
(posterior)
(likelihood)
(prior)
0.0
5
0.5
10
15
×
0
0
5
10
15
∝
0.40
0.45
0.50
q
0.55
0.60
1.0
1.5
20
20
2.0
q の事後分布
0.40
0.45
0.50
q
0.55
0.60
0.0
0.2
0.4
q
0.6
0.8
1.0
このように「q はどんな値でもいいんですよ」という気分を
表現するための事前分布が無情報事前分布 (non-informative
prior)
2010–02–09
(2010-02-21 08:28 修正版)
33/ 108
ちょっと難しい例題:
階層ベイズモデルが必要になる状況
2010–02–09
(2010-02-21 08:28 修正版)
34/ 108
また別の観測データ: 二項分布だめだめ?!
20
25
100 個体の植物の合計 800 胚珠中 403 個の結実が見ら
れたので,平均結実確率は 0.50 と推定されたが……
15
二項分布
による予測
0
5
植物の個体数
ぜんぜんうまく
表現できてない!
10
観察された
0
2
4
6
8
結実した種子数 yi
2010–02–09
(2010-02-21 08:28 修正版)
35/ 108
「個体差」 → 過分散 (overdispersion)
観察された植物の個体数
0
5
10
15
20
25
極端な過分散の例
0
2
4
6
8
結実した種子数 yi
• 胚珠全体の平均結実確率は 0.5 ぐらいかもしれないが……
• 植物個体ごとに胚珠の結実確率が異なる: 「個体差」
• 「個体差」があると overdispersion が生じる
• 「個体差」の原因: ?
2010–02–09
(2010-02-21 08:28 修正版)
36/ 108
あのー …… 「個体差」とは?
• 生物学的には明確な定義はない
• しかしデータ解析においては人間が主観的に「これは個
体差由来の効果であり,観察されたパターンに影響して
いる」と定義,そして以下の二種類を区別する:
1. fixed effects 的な効果
2. random effects 的な効果
• 同様に,ブロック差・場所差・時間ごとに異なる差,な
どが統計モデルの中で定義される
2010–02–09
(2010-02-21 08:28 修正版)
37/ 108
「個体差」の fixed だの random だの …… って何?
• 「個体ごとに異なる何かに由来する効果」を
fixed/random effects にわけて統計モデリングする:
1. fixed effects 的な効果: 「この要因は結実確率を上下するだろう」
と観測者が設定・測定した要因 (実験処理,植物のサイズなど)
– この例題では fixed effects 的な個体差はない
2. random effects 的な効果: fixed effects 的ではない要因 (観測対象個
体に関連する,人間が設定・測定していないすべて)
– 平均結実確率を変えずにばらつきだけを変えると考える
今回の例題では random effects 的な
「個体差」の統計モデリングに専念
2010–02–09
(2010-02-21 08:28 修正版)
38/ 108
モデリングやりなおし: まず二項分布の再検討
• 結実確率を推定するために 二項分布という確率分布を
使う
• 個体 i の Ni 胚珠中 yi 個が結実する確率は二項分布
( )
Ni yi
f (yi | qi ) =
qi (1 − qi )Ni −yi ,
yi
• ここで仮定していること
– 個体差がある
– 個体ごとに異なる結実確率 qi
2010–02–09
(2010-02-21 08:28 修正版)
39/ 108
ロジスティック関数で表現する結実確率
1.0
• そこで結実する確率 qi = q(zi ) をロジスティック
(logistic) 関数 q(z) = 1/{1 + exp(−z)} で表現
0.5
q(z)
−4
−2
0
2
4
z
• 線形予測子 zi = a + bi とする
– パラメーター a: 全体の平均
– パラメーター bi : 個体 i の個体差 (ずれ)
2010–02–09
(2010-02-21 08:28 修正版)
40/ 108
(ロジスティック関数の補足説明を追加する)
2010–02–09
(2010-02-21 08:28 修正版)
41/ 108
個々の個体差 bi を最尤推定するのはまずい
• 100 個体の結実確率を推定するためにパラメーター 101
個(a と {b1 , b2 , · · · , b100 }) を推定すると……
• 個体ごとに結実数 / 胚珠数を計算していることと同じ!
(「データのよみあげ」と同じ)
• こう仮定すると問題がうまくあつかえないだろうか?
– 個体間の結実確率はばらつくけど,そんなにすごく
異ならない?
– 観測データを使って,
「個体差」にみられるパターン
を抽出したい (統計モデル化)
2010–02–09
(2010-02-21 08:28 修正版)
42/ 108
階層ベイズモデル化: bi の事前分布の設計
平均ゼロで標準偏差 σ の正規分布
gb (bi | σ) = √
1
exp
2πσ 2
−2
0
,
= 1.5
−4
2σ 2
=1
−6
−b2i
2
=3
4
bi
6
個体差 {b1 , b2 , · · · , b100 } がこの確率分布に従うとする
2010–02–09
(2010-02-21 08:28 修正版)
43/ 108
bi の事前分布は無情報事前分布ではない
データにあわせて σ が変化する階層的な事前分布
=1
= 1.5
−6
−4
−2
0
2
=3
4
bi
6
• σ がとても小さければ個体差 bi はどれもゼロちかくに
なる → 「どの個体もおたがい似ている」
• σ がとても大きければ,bi は各個体の結実数 yi にあわ
せるような値をとる
2010–02–09
(2010-02-21 08:28 修正版)
44/ 108
パラメーター σ が決める個体間の類似性
individual 1
2
3
個体ごとの bi
の事後分布
個体差のばらつき
small
事前分布
posterior
prior
large
個体差 bi
2010–02–09
(τ = 1/σ 2 とおき,τ も事前分布にしたがうとする)
(2010-02-21 08:28 修正版)
45/ 108
(注): 「リアル」に作図するとこうなります
σ小
−3
−2
−1
0
1
2
3
個体差
のばらつき σ
−3
−2
−1
0
1
2
3
(τ = 1/σ2 )
−3
−2
−1
0
bi
2010–02–09
(2010-02-21 08:28 修正版)
1
2
3
σ
大
❄
46/ 108
なぜ「階層」ベイズモデルと呼ばれるのか?
超事前分布 → 事前分布という階層があるから
2010–02–09
(2010-02-21 08:28 修正版)
47/ 108
全パラメーターを一斉に推定する
矢印は手順ではなく,依存関係をあらわしている
2010–02–09
(2010-02-21 08:28 修正版)
48/ 108
階層ベイズモデルではないベイズモデルって何でしょう?
個体差 bi の事前分布の設定を例に検討してみる
• 事前分布を主観的に決める
「自分は σ = 0.1 と信じるので,それを使う」
• 以前のデータを使う?
「これまでの経験から σ = 0.1」
• 無情報事前分布ばかりにする
「よくわからないので σ をすごく大きくする」
individual 1
2
3
small
posterior
prior
large
(これらに対して)
観測データにもとづいて σ を決めようとする
のが階層ベイズモデル
2010–02–09
(2010-02-21 08:28 修正版)
49/ 108
τ = 1/σ 2 の事前分布を無情報事前分布
• σ はどのような値をとってもかまわない
• そこで τ の事前分布は 無情報事前分布(non-informative
prior) とする
• たとえば「ひらべったいガンマ分布」
p(τ ) = τ α−1
2010–02–09
e−τ β
Γ(α)β
(2010-02-21 08:28 修正版)
,
−α
α = β = 10−4
50/ 108
1.0
無情報事前分布 (1) ばらつきパラメーター τ
0.4
0.6
0.8
ガンマ分布
(平均 1; 標準偏差 1)
0.0
0.2
無情報事前分布
ガンマ分布
(平均 1; 標準偏差 100)
0
2
4
6
8
10
τ
「τ は正の値であれば何でもよい」と表現している
2010–02–09
(2010-02-21 08:28 修正版)
51/ 108
標準正規分布
(平均 0; 標準偏差 1)
0.2
0.3
0.4
無情報事前分布 (2) 全個体の平均 a
0.0
0.1
無情報事前分布
正規分布
(平均 0; 標準偏差 100)
-10
-5
0
5
10
a
「結実確率の (logit) 平均 a は何でもよい」と表現している
2010–02–09
(2010-02-21 08:28 修正版)
52/ 108
階層ベイズモデル全体の定式化
100
Y
p(a, {bi }, τ | データ) =
f (yi | q(a + bi )) ga (a) gb (bi | τ ) h(τ )
i=1
ZZ
···
Z
(分子 ↑
そのまま) dbi dτ da
分母は何か定数になるので
p(a, {bi }, τ | データ) ∝
100
Y
f(yi | q(a+bi )) ga (a) gb (bi | τ) h(τ)
i=1
事後分布:
尤度:
p(a, {bi }, τ | データ)
100
Y
f(yi | q(a + bi ))
i=1
事前分布たち:
2010–02–09
(2010-02-21 08:28 修正版)
ga (a) gb (bi | τ) h(τ)
53/ 108
個体差 bi とそのばらつき σ の事前分布・事後分布
individual 1
2
3
small
posterior
hyperprior
prior
(posterior)
large
hyperparameter
「ちょうどいいぐあい」の個体差のばらつきになる
あたりを σ の事後分布となるようにしたい⇔ MCMC
2010–02–09
(2010-02-21 08:28 修正版)
54/ 108
どうやって事後分布を推定するの?
事後分布
p(a, {bi }, τ | データ) ∝
100
Y
f(yi | q(a+bi )) ga (a) gb (bi | τ) h(τ)
i=1
• 観測データと事前分布を組みあわせれば 事後分
布p(a, {bi }, τ | データ) を知ることができるはず
• しかし右辺をみてもよくわからない
• Markov chain Monte Carlo (MCMC) を使えば「よくわか
らない確率分布」から事後分布が得られる!
→ ということで,WinBUGS のハナシに……
2010–02–09
(2010-02-21 08:28 修正版)
55/ 108
パラメーターの条件つき分布から Gibbs sampling
サンプリングの対象とするパラメーター以外は値を固定する
p(a | · · ·)
∝
100
Y
f(yi | q(a + bi )) ga (a)
i=1
p(τ | · · ·)
∝
100
Y
gb (bi | τ) h(τ)
i=1
p(b1 | · · ·)
∝
f(y1 | q(a + b1 )) gb (b1 | τ)
p(b2 | · · ·)
∝
f(y2 | q(a + b2 )) gb (b2 | τ)
.
.
.
p(b100 | · · ·)
2010–02–09
∝
f(y100 | q(a + b100 )) gb (b100 | τ)
(2010-02-21 08:28 修正版)
56/ 108
観察された
0
5
植物の個体数
10
15
20
25
推定された事後分布に基づく予測
0
2
4
6
8
結実した種子数
「個体差」を考慮することで,
少しはマシな統計モデルが作れた
2010–02–09
(2010-02-21 08:28 修正版)
57/ 108
観察された
0
5
植物の個体数
10
15
20
25
解決策: 二項分布と正規分布をまぜる
0
2
4
6
8
結実した種子数
複雑な確率分布を新しく導入するのではなく
二項分布と正規分布をまぜることで現象を表現した
2010–02–09
(2010-02-21 08:28 修正版)
58/ 108
ここまでの用語の整理
• 階層ベイズモデル
(事後分布) ∝ (尤度) × (事前分布) × (超事前分布)
• 事後分布の推定計算方法: Markov Chain Monte Carlo (MCMC) 法
2010–02–09
(2010-02-21 08:28 修正版)
59/ 108
階層ベイズモデルのご利益とは?
階層ベイズモデルでないとうまく表現できない現象がある
• 複数の random effects (個体差・ブロック差・縦断的データ・……)
• 「隠れた」状態をあつかうモデル
– 例: 「欠側値を補う」処理
• 空間構造ある問題も MCMC 計算で
– 例: 「隣は似てるよ」効果 – Gaussian Random Field
2010–02–09
(2010-02-21 08:28 修正版)
60/ 108
2010–02–09
(2010-02-21 08:28 修正版)
61/ 108
3. R と WinBUGS
の使いかた
「R と WinBUGS の使いかた」の内容
1. MCMC をどんなソフトウェアで動かす?
「できあい」の Gibbs sampler あれこれ
2. WinBUGS を R で使う
R2WBwrapper 関数セットを経由して
3.「結実確率の推定」例題を WinBUGS で推定
実際に使ったコードを説明しつつ
2010–02–09
(2010-02-21 08:28 修正版)
63/ 108
繁殖生態学の例題: 架空植物の結実確率
• 架空植物の胚珠の結実を調べた
• 用語
– 胚珠: 種子のもとになる器
官 (この植物ではどの個体
も 8 個 持つとする)
– 結実: 胚珠が種子になるこ
と
– 結実確率: ある胚珠が種子
になる確率
胚珠数 Ni = 8
個体 i
結実数 yi = 3
• データ: 植物 100 個体,合計 800 胚珠の結実の有無を調べた
• 問: この植物の結実確率はどのように統計モデル化できるか?
2010–02–09
(2010-02-21 08:28 修正版)
64/ 108
また別の観測データ: 二項分布だめだめ?!
20
25
100 個体の植物の合計 800 胚珠中 403 個の結実が見ら
れたので,平均結実確率は 0.50 と推定されたが……
15
二項分布
による予測
0
5
植物の個体数
ぜんぜんうまく
表現できてない!
10
観察された
0
2
4
6
8
結実した種子数 yi
2010–02–09
(2010-02-21 08:28 修正版)
65/ 108
MCMC 用のソフトウェア
2010–02–09
(2010-02-21 08:28 修正版)
66/ 108
階層ベイズモデリング,その手順のまとめ
• 観測データを説明できそうな確率分布を選ぶ
• その確率分布の平均・分散などのモデリング
• パラメーターの事前分布を設定する
– 階層的な事前分布 — 個体差・場所差など
– 無情報事前分布 — いわゆる「処理の効果」など
• モデリングできたら,事後分布を推定する
– 例: MCMC 計算によって事後分布からのサンプルを
得る
• 事後分布を解釈する
2010–02–09
(2010-02-21 08:28 修正版)
67/ 108
MCMC による事後分布からのサンプリング
• Markov Chain Monte Carlo : 単純な乱数を うまく つ
かって「あつかいづらい」確率分布からランダムサンプ
ルを得る方法 (アルゴリズム)
• ある種のデータを解析するためには階層ベイズモデルが
必要
• そういったベイズモデルを観測データに「あてはめ」て
パラメーター推定するためには MCMC が役にたつ,
ということにしたい (MCMC 利用法のひとつ)
2010–02–09
(2010-02-21 08:28 修正版)
68/ 108
「事後分布からのサンプル」って何の役にたつの?
> post.mcmc[,"a"] # 事後分布からのサンプルを表示
[1] -0.7592 -0.7689 -0.9008 -1.0160 -0.8439 -1.0380 -0.8561 -0.9837
[9] -0.8043 -0.8956 -0.9243 -0.9861 -0.7943 -0.8194 -0.9006 -0.9513
[17] -0.7565 -1.1120 -1.0430 -1.1730 -0.6926 -0.8742 -0.8228 -1.0440
... (以下略) ...
0.0
0.4
0.8
1.2
• これらのサンプルの平均値・中央値・95% 区間を調べることで「も
と」の事後分布の概要がわかる
-1.0
-0.5
0.0
0.5
1.0
N = 1200 Bandwidth = 0.08258
2010–02–09
(2010-02-21 08:28 修正版)
1.5
69/ 108
どのようなソフトウェアで MCMC 計算するか?
1. 自作プログラム
• 利点: 問題にあわせて自由に設計できる
• 欠点: 階層ベイズモデル用の MCMC プログラミング,けっ
こうめんどう
2. R のベイズな package
• 利点: 空間ベイズ統計など便利な専用 package がある
• 欠点: 汎用性,とぼしい
3. 「できあい」の Gibbs sampler ソフトウェア
• 利点: 「原因 → 結果」型の階層ベイズモデルは得意
• 欠点: それ以外の問題に応用するには……
2010–02–09
(2010-02-21 08:28 修正版)
70/ 108
統計ソフトウェア R
http://www.r-project.org/
• いろいろな OS で使える free software
• 使いたい機能が充実している
• 作図機能も強力
• S 言語によるプログラミング可能
• よい教科書が出版されつつある
–
–
–
–
「R による保健医療データ解析演習」 中澤港 (2007)
「The R-Tips」 舟尾暢男 (2005)
“Statistics: An Introduction Using R ” M. Crawley (2005)
ネット上のあちこち
2010–02–09
(2010-02-21 08:28 修正版)
71/ 108
R だけで何とかなる: 経験ベイズ法 (1)
今回の例題の事後分布
p(a, {bi }, τ | データ) ∝
100
Y
f(yi | q(a+bi )) ga (a) gb (bi | τ) h(τ)
i=1
積分で「個体差」 bi を消して,周辺尤度を定義する
(a, τ の尤度) =
100
Y
i=1
Z
∞
−∞
f (yi | q(a + bi )) gb (bi | τ )dbi
これを最大化する a
ˆ と τˆ を推定すればよい
2010–02–09
(2010-02-21 08:28 修正版)
72/ 108
R だけで何とかなる: 経験ベイズ法 (2)
• 周辺尤度最大化って何をやっ
ていることになるのだろうか?
individual 1
2
個体ごとの bi
の事後分布
– 最も良さそうな「『個体
差』の幅」を探している
– 同時に全個体共通の a も
探している
• これは一般化線形混合モデル
(GLMM) の最尤推定と同じ
3
個体差のばらつき
small
事前分布
posterior
prior
large
個体差 bi
• R での対処例: library(glmmML) の glmmML() 関数
glmmML(cbind(y, N - y) ~ 1, family = binomial, などなど指定)
2010–02–09
(2010-02-21 08:28 修正版)
73/ 108
R だけで何とかなる? ちょっと無理かも……
GLMM は階層ベイズモデルの一部
• R にはいろいろな GLMM 推定関数が準備されている
– library(glmmML) の glmmML()
– library(lme4) の lmer()
– library(nlme) の nlme() (正規分布のみ)
– library(MCMCglmm) の MCMCglmm()
• しかしながら「めんどうな状況」では……ちょっと無理
があるかも (推定計算がうまくいかない)
2010–02–09
(2010-02-21 08:28 修正版)
74/ 108
「めんどうな状況」では MCMC が有用である
複雑な階層ベイズモデルは MCMC で推定するほかない
• 複数の random effects (個体差・ブロック差・縦断的データ・……)
• 「隠れた」状態をあつかうモデル
– 例: 「欠側値を補う」処理
• 空間構造ある問題も MCMC 計算で
– 例: 「隣は似てるよ」効果 – Gaussian Random Field
2010–02–09
(2010-02-21 08:28 修正版)
75/ 108
そこで “BUGS” な汎用 Gibbs sampler たち
(じつは Gibbs sampling 以外の手法も使ってるようなのだが……)
• BUGS でベイズモデルを記述できるソフトウェア (と久
保の蛇足な論評):
– WinBUGS — 評: 「とりあえず,これしかない」って
現状?
– OpenBUGS — 評: ココロザシは高いんでしょうけど,
どうなってんの?
– JAGS — 評: じりじりと発展中,がんばってください
• リンク集:
http://hosho.ees.hokudai.ac.jp/~kubo/ce/BayesianMcmc.html
2010–02–09
(2010-02-21 08:28 修正版)
76/ 108
BUGS 言語: ベイズモデルを記述する言語
•
Spiegelhalter et al. 1995. BUGS: Bayesian Using Gibbs Sampling version 0.50.
model { # BUGS コードで定義された階層ベイズモデルの例
Tau.noninformative <- 1.0E-4
P.gamma <- 1.0E-4
for (i in 1:N.sample) {
Y[i] ~ dbin(q[i], N[i])
logit(q[i]) <- a + b[i]
}
a ~ dnorm(0, Tau.noninformative)
for (i in 1:N.sample) {
b[i] ~ dnorm(0, tau)
}
tau ~ dgamma(P.gamma, P.gamma)
}
# あとで説明
2010–02–09
(2010-02-21 08:28 修正版)
77/ 108
君臨しつづける WinBUGS 1.4.3
(あとで詳しく説明)
• おそらく世界でもっともよく使われている Gibbs sampler
• BUGS 言語の実装
• 2004-09-13 に最新版 (ここで開発停止 → OpenBUGS )
• ソースなど非公開,無料,ユーザー登録不要
• Windows バイナリーとして配布されている
– Linux 上では WINE 上で動作
– MacOS X 上でも Darwine など駆使すると動くらしい
• ヘンな GUI (Linux ユーザーの偏見)
• R ユーザーにとっては R2WinBUGS が快適 (後述)
2010–02–09
(2010-02-21 08:28 修正版)
78/ 108
WinBUGS は Gibbs sampling しているのか?
よくある質問: WinBUGS は Gibbs sampling してるの?
• 「外から見るとギブス・サンプラー」 (伊庭さん)
• 事前分布・尤度の組みあわせによって,サンプリング方
法を自動的に変更している
– 共役事前分布がない場合は,さまざまな数値的な方法を使う
• ユーザーはそのあたりをまったく指定する必要なし (指
定できない)
くわしくは WinBUGS のマニュアル読みましょう
http://www.google.com/search?q=winbugs+user+manual
2010–02–09
(2010-02-21 08:28 修正版)
79/ 108
DJ Spiegelhalter, A Thomas, NG Best, D Lunn. 2003. WinBUGS version 1.4
user manual. MRC Biostatistics Unit, Cambridge.
Continuous target distribution
Method
Conjugate
Direct sampling using standard algorithms
Log-concave
Derivative-free adaptive rejection
sampling (Gilks, 1992)
Restricted range
Slice sampling (Neal, 1997)
Unrestricted range
Current point Metropolis
Discrete target distribution
Method
Finite upper bound
Inversion
Shifted Poisson
Direct sampling using standard algorithm
2010–02–09
(2010-02-21 08:28 修正版)
80/ 108
GPL な WinBUGS めざして: OpenBUGS 3.0.3
• Thomas Andrew さん他が開発している
• WinBUGS の後継プロジェクト
• ソースは公開しているが ……
– Component Pascal で実装
– ソースを読んだりするには
BlackBox Component Builder が必要
• Windows バイナリ配布,Linux でもなんとか使えた
• 2007 年 9 月以降新しいニュースなし
• どうなっているのかよくわからない
2010–02–09
(2010-02-21 08:28 修正版)
81/ 108
R な (?) Gibbs sampler: JAGS 1.0.4
• R core team のひとり Martyn Plummer さんが開発
– Just Another Gibbs Sampler
• C++ で実装されている,誰でもコンパイルできる
– R がインストールされていることが必要
– 拡張 plugin を簡単に書ける設計になっている
• Linux, Windows, Mac OS X バイナリ版もある
• ぢりぢりと開発進行中
• R から使う: library(rjags)
2010–02–09
(2010-02-21 08:28 修正版)
82/ 108
WinBUGS を R で使う
2010–02–09
(2010-02-21 08:28 修正版)
83/ 108
今回説明する WinBUGS の使いかた (概要)
• WinBUGS を R から使う
– R から WinBUGS をよびだし「このベイズモデルの
パラメーターの事後分布をこういうふうに MCMC 計
算してね」と指示する
– WinBUGS が得た事後分布からのサンプルセットを R
がうけとる
• R の中では library(R2WinBUGS) package を使う
• library(R2WinBUGS) をラップする R2WBwrapper 関数
(久保作) を使う
2010–02–09
(2010-02-21 08:28 修正版)
84/ 108
なんで WinBUGS を R 経由で使うの?
• WinBUGS の「ステキ」なユーザーインターフェイス使
うのがめんどうだから
• どうせ解析に使うデータは R で準備するから
• どうせ得られた出力は R で解析・作図するから
• R には R2WinBUGS という (機能拡張用) package があっ
て,R から WinBUGS を使うしくみが準備されてるから
– R 上で install.packages("R2WinBUGS") でインストー
ルできる
2010–02–09
(2010-02-21 08:28 修正版)
85/ 108
なんで R2WinBUGS をラップして使うの?
• R2WinBUGS の「ステキ」なインターフェイス使うの
がめんどうだから
– モデルをちょっと変更したらあちこち書きなおさないとい
けない
– R2WBwrapper を使うとそのあたりがかなりマシになる
• Linux と Windows で「呼びだし」方法がびみょーに異な
るため
– R2WBwrapper を使うと自動的に OS にあわせた WinBUGS
よびだしをする
2010–02–09
(2010-02-21 08:28 修正版)
86/ 108
R2WBwrapper 経由で WinBUGS を使う (1)
1. BUGS 言語でかかれた model ファイルを準備する
2. R2WBwrapper 関数を使う R コードを書く
3. R 上で 2. を実行
4. 出力された結果が bugs オブジェクトで返される
5. これを plot() したり summary() したり……
6. あるいは mcmc / mcmc.list オブジェクトに変換して,
いろいろ事後分布の図なんかを描いてみたり……
2010–02–09
(2010-02-21 08:28 修正版)
87/ 108
R2WBwrapper 経由で WinBUGS を使う (2)
2010–02–09
(2010-02-21 08:28 修正版)
88/ 108
「結実確率の推定」例題を
WinBUGS で推定
2010–02–09
(2010-02-21 08:28 修正版)
89/ 108
「結実確率の推定」例題を WinBUGS に推定させる手順
1. 結実確率の階層ベイズモデルの構築する
2. それを BUGS 言語でかく (model.bug.txt)
3. R2WBwrapper 関数を使って R コードを書く
(runbugs.R)
4. R 上で runbugs.R を実行 (source(runbugs.R) など)
5. 出力された結果が bugs オブジェクトで返される
2010–02–09
(2010-02-21 08:28 修正版)
90/ 108
結実確率の階層ベイズモデルってどんなでしたっけ?
p(a, {bi }, τ | データ) ∝
100
Y
f(データ | q(a+bi )) ga (a) gb (bi | τ) h(τ)
i=1
2010–02–09
(2010-02-21 08:28 修正版)
91/ 108
事前分布の設定方法
• 階層的な (hierarchical) 事前分布にする
– random effects 的な個体差・場所差
• 無情報 (non-informative) 事前分布にする
– 切片や説明変数の係数など fixed effects 的なパラ
メーター
• 主観的な (subjective) 事前分布にする
– あまりおすすめできない
– (反復測定していないときの) 測定時のエラーとか
2010–02–09
(2010-02-21 08:28 修正版)
92/ 108
結実確率の階層ベイズモデルを BUGS 言語で
ファイル model.bug.txt の内容 (一部簡略化)
model{
for (i in 1:N.sample) {
Y[i] ~ dbin(q[i], N[i])
logit(q[i]) <- a + b[i]
}
a ~ dnorm(0, 1.0E-4)
for (i in 1:N.sample) {
b[i] ~ dnorm(0, tau)
}
tau ~ dgamma(1.0E-4, 1.0E-4)
sigma <- sqrt(1 / tau)
# 観測値との対応
# 結実確率 q[i]
# 個体の平均
# 個体差
# 個体差のばらつき
# tau から SD に変換
}
2010–02–09
(2010-02-21 08:28 修正版)
93/ 108
BUGS 言語について,いくつか
• BUGS 言語は普通の意味でのプログラミング言語では
ない
– 「式」を列挙しているだけ,と考える
– 「式」の並び順を変えても計算結果は (ほぼ) 変わら
ない
• 各パラメーターは二種類の node それぞれで一度ずつ定
義できる (二度以上は定義できない)
1. ~
sthochastic node
2. <- deterministic node
2010–02–09
(2010-02-21 08:28 修正版)
94/ 108
R2WBwrapper な R コード runbugs.R
(前半部)
観測データの設定
source("R2WBwrapper.R")
# R2WBwrapper よみこみ
d <- read.csv("data.csv") # 観測データよみこみ
clear.data.param() # いろいろ初期化 (まじない)
set.data("N.sample", nrow(d)) # データ数
set.data("N", d$N)
# 胚珠
set.data("Y", d$Y)
# 結実
2010–02–09
(2010-02-21 08:28 修正版)
95/ 108
R2WBwrapper な R コード runbugs.R
(後半部)
パラメーターの初期値の設定など
set.param("a", 0)
# 個体の平均
set.param("sigma", NA) # 個体差のばらつき
set.param("b", rep(0, N.sample)) # 個体差
set.param("tau", 1, save = FALSE) # ばらつきの逆数
set.param("p", NA)
# 結実確率
post.bugs <- call.bugs(
# WinBUGS よびだし
file = "model.bug.txt",
n.iter = 2000, n.burnin = 1000, n.thin = 5
)
2010–02–09
(2010-02-21 08:28 修正版)
96/ 108
WinBUGS に指示した事後分布のサンプリング
post.bugs <- call.bugs(
# WinBUGS よびだし
file = "model.bug.txt",
n.iter = 2000, n.burnin = 1000, n.thin = 5
)
• じつは default では独立に (並列に) 3 回(n.chains = 3) MCMC
sampling せよと指定されている (収束性をチェックするため)
– cf. 伊庭さんのたくさんの PC で MCMC する話
• ひとつの chain の長さは 2000 step (n.iter = 2000)
• 最初の 1000 step は捨てる(n.burnin = 1000)
• 1001 から 2000 step まで 5 step おきに値を記録する (n.thin = 5)
このあたりの設定はデータ・統計モデルによって変わる
2010–02–09
(2010-02-21 08:28 修正版)
97/ 108
“burn-in”: MCMC の最初のほうを捨てる
2010–02–09
(2010-02-21 08:28 修正版)
98/ 108
で,実際に動かすには?
• たとえば,R 上で source("runbugs.R") とか
• すると WinBUGS が起動して MCMC sampling をはじ
める
• この例題は簡単なのですぐに計算が終了する (WinBUGS
内で図などが表示される)
• 手動で WinBUGS を終了する
• すると WinBUGS が得た結果が R にわたされ,
post.bugs というオブジェクトにそれが格納される
2010–02–09
(2010-02-21 08:28 修正版)
99/ 108
事後分布のサンプルを R で調べる
a のサンプリングの様子
a の事後確率密度の推定
収束?
2010–02–09
(2010-02-21 08:28 修正版)
100/ 108
bugs オブジェクトの post.bugs を調べる (1)
• plot(post.bugs)
→ 次のペイジ, 実演表示
• R-hat は Gelman-Rubin の収束判定用の指数
√
ˆ + (ψ|y)
var
ˆ=
◦ R
W
n−1
1
+
ˆ (ψ|y) =
◦ var
W + B
n
n
◦ W : chain 内の variance
◦ B : chain 間の variance
◦ Gelman et al. 2004. Bayesian Data Analysis. Chapman & Hall/CRC
2010–02–09
(2010-02-21 08:28 修正版)
101/ 108
o/kuboThinkPad/public_html/stat/2009/ism/winbugs/model.bug.txt", fit using WinBUGS, 3 chains, each with 1300 ite
80% interval for each chain R-hat
-10 -5 0 5 10 1 1.5 2+
a
sigma
* b[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
[34]
[35]
[36]
[37]
tau
* q[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
[34]
[35]
[36]
[37]
0.5
a
0
-0.5
3.5
sigma
3
2.5
*b
10
5
0
-5
-10
1 2 3 4 5 6 7 8 910 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
0.2
tau
0.15
0.1
0.05
1
*q
0.5
0
1 2 3 4 5 6 7 8 910 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
260
240
deviance
220
-10 -5 0 5 10 1 1.5 2+
* array truncated for lack of space
2010–02–09
medians and 80% intervals
(2010-02-21 08:28 修正版)
200
102/ 108
bugs オブジェクトの post.bugs を調べる (2)
• print(post.bugs, digits.summary = 3)
• 事後分布の 95% 信頼区間などが表示される
a
sigma
b[1]
b[2]
b[3]
b[4]
b[5]
b[6]
b[7]
b[8]
b[9]
b[10]
b[11]
b[12]
b[13]
2010–02–09
mean
0.018
2.980
-3.800
-1.142
1.992
3.745
-2.005
2.047
3.765
3.782
-2.049
-2.028
-0.013
-3.798
-2.062
sd
0.322
0.361
1.711
0.874
1.047
1.781
1.066
1.077
1.763
1.661
1.106
1.066
0.781
1.785
1.111
2.5%
-0.621
2.346
-7.652
-3.003
0.169
0.975
-4.257
0.147
1.023
1.133
-4.439
-4.340
-1.593
-7.882
-4.603
25%
-0.202
2.738
-4.776
-1.688
1.251
2.503
-2.719
1.310
2.482
2.591
-2.745
-2.655
-0.514
-4.817
-2.683
(2010-02-21 08:28 修正版)
50%
0.025
2.948
-3.503
-1.111
1.889
3.408
-1.909
1.933
3.593
3.570
-1.948
-1.902
-0.006
-3.590
-1.931
75%
0.233
3.205
-2.554
-0.530
2.665
4.751
-1.257
2.716
4.811
4.703
-1.255
-1.314
0.517
-2.523
-1.329
97.5%
0.628
3.752
-1.193
0.464
4.346
7.926
-0.131
4.456
7.515
7.621
-0.218
-0.175
1.498
-1.040
-0.135
Rhat n.eff
1.030
75
1.003
590
1.002 1100
1.010
200
1.005
390
1.008
520
1.005
370
1.002 1100
1.000 1200
1.003
640
1.004
470
1.002
750
1.006
440
1.000 1200
1.006
330
103/ 108
mcmc.list クラスに変換して作図
• post.list <- to.list(post.bugs)
• plot(post.list[,1:4,], smooth = F)
→ 次のペイジ, 実演表示
2010–02–09
(2010-02-21 08:28 修正版)
104/ 108
2010–02–09
(2010-02-21 08:28 修正版)
105/ 108
mcmc クラスに変換して作図
• post.mcmc <- to.mcmc(post.bugs)
• これは matrix と同じようにあつかえるので,作図に
便利
15
20
25
例: 推定された事後分布に基づく予測
0
5
10
観察された
植物の個体数
0
2010–02–09
2
(2010-02-21 08:28 修正版)
4
6
結実した種子数
8
106/ 108
「R と WinBUGS の使いかた」のまとめ
1. MCMC をどんなソフトウェアで動かす?
まあ,WinBUGS + R が無難ではないでしょうか
2. WinBUGS を R で使う
R2WBwrapper 関数セットを経由して
3.「結実確率の推定」例題を WinBUGS で推定
準備するファイル: model.bug.txt, runbugs.R
結果を R 内で解析・作図・変換する
2010–02–09
(2010-02-21 08:28 修正版)
107/ 108
公開講座に参加していただき,ありがとうございました
http://hosho.ees.hokudai.ac.jp/~kubo/ce/IsmBayes2010.html
• 本日の例題のデータなどは上記 URL のペイジからダウ
ンロードできます
– この公開講座のペイジからリンクされています
• 投影資料 (修正を反映させていったもの) もダウンロー
ドできます
2010–02–09
(2010-02-21 08:28 修正版)
108/ 108