Stan と R でベイズ統計モデリング読書会
-Chapter 4-Stan と RStan をはじめよう
1
Osaka.stan #2(2016/12/23)
自己紹介
• 紀ノ定 保礼 大阪大学大学院人間科学研究科 心理学・人間工学 界隈
- 専門は交通行動
• ベイズ歴 1 年弱(学会発表 1 件,投稿準備中論文 1 本) 目下勉強中なので,発表者の理解が誤っている場合は,
ご指摘よろしくお願いします!
2
3
最近書きました
本発表について• 本書 1~4 章の既読者を想定
1~3 章は前回の読書会資料を参照http://www.slideshare.net/simizu706/stanr13
• 進め方 基本的にページ順に説明
- 一部,後の節から先取りして,ひとまとめにしている箇所あり
写経+補足説明
「本書に書いてある通り」の部分は省略4
本発表について
• ggplot2 の素晴らしさも伝えたい ただ作図コードがおのずと長くなるので,敬遠
されてしまうかもしれない
そこで,見栄え調整のコードは省略し,最低限必要な部分だけ抜粋した書き方も紹介- 以下のサイトで公開しました
5http://qiita.com/kyn02666/items/e41c076cd5140e78b99a
• MCMC の結果が本書と違うが,気にしないでください 環境は R ( version 3.3.2 )と RStan ( version 2.12.1 )
6Modeling Language User‘s Guide and Reference Manual, Version 2.13.1 より
7http://www.kyoritsu-pub.co.jp/bookdetail/9784320112421
本章以降のデータやコードはダウンロード可能
8
↓ まず読む
9
← chap04 内にプロジェクトを 作っておくと便利
4.1Stan のインストール
10
特に追記することはないので省略!
11http://www.slideshare.net/KojiKosugi/r-stan
詳細はこちら
4.2Stan の基本的な文法
12
13
以降は Rstudio 上でコードを書いていることを前提にします
Stan 超初心者講習よりhttp://www.slideshare.net/simizu706/stan-62042940
4.2.1 ブロック構成
14
データの宣言
サンプリングしたいパラメータの宣言
これら 3 ブロックは基本的に必要
※Stan におけるパラメータの定義:確率変数すべて
𝑝 (𝜃|𝑌 )=𝑝 (𝑌|𝜃 )𝑝 (𝜃 )𝑝 (𝑌 )
← この部分を書く
4.2.2 文法の基礎
• 例:正規分布の平均を推定 観測されたデータは 20 個あるとする 背景知識
- 推定したい正規分布の標準偏差は 1- 平均に関する背景知識なし
モデル式 4-1
15
𝑝 (𝜃|𝑌 )=𝑝 (𝑌|𝜃 )𝑝 (𝜃 )𝑝 (𝑌 )
4.2.2 文法の基礎
16
𝜇 𝑁𝑜𝑟𝑚𝑎𝑙 (0 ,100 )↑ 無情報事前分布であれば省略可能 (自動的に,十分に広い一様分布が設定される)
← 推定対象のパラメータを宣言
← モデルを書く上で必要なデータを指定
17
↓ データ型についてはここを参照
http://qiita.com/hoxo_m/items/e4dab11fed062689eff2
4.2.3 コーディング規約守らなくてもエラーは生じないが,可読性が向上
18
インデント(字下げ) データ変数の先頭は大文字パラメータ変数の先頭は小文字
ブロック間は 1 行空ける
やの前後は 1 スペース空ける
4.2.3 コーディング規約エラーを招く原因
19最終行は 1 行空ける
行末のセミコロンを忘れない
L と 1 を見間違えない
4.2.3 コーディング規約変数の宣言を行える場所は, { の直後のみ
20
21
{ の直後であれば,パラメータの宣言はブロックの冒頭でなくてもよい
ただし, {} の中で宣言したパラメータは出力されないので注意
4.2.3 コーディング規約とりあえず Stan コードを書いたら Check
22
’model4-1.stan’ として保存
試しにデータを流し込んでみる data ブロックで宣言した変数を, R から渡してや
る
23
以下のデータを渡してみる• N=20• Y= 平均 200 ,標準偏差 1 の正規乱数が
20 個格納されたベクトル
MCMC の結果…
ほぼ実データ通り!
4.3Stan の lp__ と targetmodel4-1 を例に説明
24
以下の資料を参考にさせていただきました
25http://www.slideshare.net/simizu706/stan-64926504
40-48 枚目スライド参照
26
↑ これは何?
Stan コードでは,そのような“パラメータ”は宣言していないはず…
27
↑ これは何?
実はこの背後で計算されている!lp : log posterior (対数事後確率)の略
復習
• そもそも MCMC とは何をするものか
知りたいのは左辺
でも正規化定数が邪魔で計算できない
は定数なのだから,
に従う乱数を生成して事後分布を近似
28
𝑝 (𝜃|𝑌 )=𝑝 (𝑌|𝜃 )𝑝 (𝜃 )𝑝 (𝑌 )
ベイズの定理
効率よくを推定するには
• 事後確率 が大きくなるようなの付近で,たくさんサンプリングしたい
ステップごとに,パラメータについて偏微分
なお,計算を簡単にするために,両辺対数をとる
29
¿ log𝑝 (𝑌|𝜃 )+log𝑝 (𝜃 )+𝑐𝑜𝑛𝑠𝑡 .
• 事後確率
• 対数事後確率
30
¿ [∏𝑛=1
20
𝑁𝑜𝑟𝑚𝑎𝑙 (𝑌 [𝑛 ] |𝜇 ,1 )]×𝑁𝑜𝑟𝑚𝑎𝑙 (𝜇∨0 ,100 )
¿ [∑𝑛=1
20
log𝑁𝑜𝑟𝑚𝑎𝑙 (𝑌 [𝑛 ]∨𝜇 ,1 ) ]+ log𝑁𝑜𝑟𝑚𝑎𝑙 (𝜇∨0 ,100 )( 式 4.3)
𝑝 (𝜃|𝑌 )
※偏微分で消える定数項は省略
負の値の足し算になるlog𝑝 (𝜃|𝑌 )
(一般的に) 1 より小さい値の積
31
sampling statement form(簡略的コード) explicit increment form( lp を正確に計算する版)
[∑𝑛=1
20
log𝑁𝑜𝑟𝑚𝑎𝑙 (𝑌 [𝑛 ]∨𝜇 ,1 ) ]+ log𝑁𝑜𝑟𝑚𝑎𝑙 (𝜇∨0 ,100 )
そのまま表現しただけ!
• target は lp のニックネーム• 予約語なので宣言不要
32http://www.slideshare.net/simizu706/stan-64926504
確率密度/質量関数については本書Chapter 2, p7 参照
4.4単回帰
33
本題に入る前に復習
• 解析の手順( Chapter3, p18-19 ) データをとる前
- 問題設定:何を知りたいのか- 解析計画:どの手法を使うのか
データをとった後- データの分布の確認:データ生成メカニズムの
想像が可能• 本書では ggplot2 パッケージを使用
- 解析34
ggplot2 について知りたい方は
35
この順に読むのが分かりやすいと思います
http://ggplot2.org/簡単に・多層的にデータを視覚化できる
36
37
重ね着するイメージで
基本的な書き方
• 基本レイヤー
このなかで指定した dataや変数が,以降の geomや statに持ち越される- data :描画用データが含まれるデータフレーム- aes() :データをグラフに mapping させる関数
• この変数は X軸に,この変数は Y軸に,この変数で識別して…
ggplot()内で指定しなければ,以降の各 geomや stat内で指定する必要がある 38
基本的な書き方
• geom_や stat_ 描画形式を指定(例:散布図,棒グラフ…)
今回は, 1 行目でデータや変数を指定済みなので,これらを geom内や stat内で指定する必要がない
geom内や stat内で,別のデータフレームや別の変数を指定することも可能 39
困ったときのチートシート
Data Visualization with ggplot2 Cheat Sheet
データセット(年齢と年収)を利用
• : B社の社員の年齢(歳)
• :年収(万円)
年収基本年収
• 分析の目的
歳時点での年収の予測- 応答変数 = 年収,説明変数 = 年齢の,単回帰分析 42
年齢に正比例平均の正規分布に従う(例:ランダムな業績のばらつき)
データの分布の確認
43
もっと詳しく確認したいなら
44
GGally パッケージは,本書 5.1.2 で初登場します
どうやら,年収を年齢で直線回帰してもよさそう
4.4.3 モデル式の記述
モデル式 4-2
45
𝑛=1 ,2 ,…,𝑁𝑛=1 ,2 ,…,𝑁𝑛=1 ,2 ,…,𝑁
全員に共通の線形式があり,そこに個人ごとに独立のノイズが乗ることで,年収が決まる
• モデル式 4-2
• モデル式 4-3
• モデル式 4-4
• モデル式 4-5
46
𝑛=1 ,2 ,…,𝑁
どのモデルも等価!
47
Stan 超初心者講習よりhttp://www.slideshare.net/simizu706/stan-62042940
(モデル式 4-5 は)
4.4.4 R の lm 関数で推定
lm.Rファイルより
48
年齢が一つ増えるごとに,基本年収が 21.9 万円上昇
先ほど求めた回帰式 res_lm に, X_new 歳を代入し, 95% 信頼区間を推定
予測値 49
年齢 95% 信頼区間の下限と上限
信頼区間の求め方予測値 ± t値 × 予測値のばらつき ↓ 追記する
例えば 23歳の年収の, 95%信頼区間上限なら
50
予測値のばらつき ↓ ↓ 誤差の自由度
51
直線: 23~60 歳での推定年収薄い灰帯: 95% 信頼区間濃い灰帯: 50% 信頼区間
fig4-3.R ファイルより
52
①②③④⑤⑥⑦⑧
① ② ③ ④
⑤ ⑥ ⑦ ⑧
基本レイヤーの作成(データなし) 背景テーマと文字サイズの変更
上限下限を指定( 95%CI )その範囲内を塗りつぶす
③ と同様( 50%CI) 区別のため色の透過度を調整
直線回帰 Raw data のプロット 軸ラベルの変更データ表示範囲の変更 見栄えよく!
⑨
⑨ 出来上がったら,好きな形式で保存
Y 軸は予測値 fitなので一直線
目盛間隔を調整し
53
引数が多いから難しそうに見えるが…
最低限必要なのは,これだけその他のコードは見栄えを調整しているだけ大丈夫,こわくない!
54
ローデータの X の範囲( 24~59 歳)で構わないなら,信頼区間に関してはこういう書き方も可能
予測区間の場合
55
予測値 ± t値 × (予測値のばらつき+ 予測値からのばらつき)
予測値からのばらつきのぶん,信頼区間よりも広い
56
↓ 追記する
例えば 23歳の年収の, 95%予測区間上限なら
↓ 予測値の ばらつき ↓ 予測値からの ばらつき
57
直線: 23~60 歳での推定年収薄い灰帯: 95% 予測区間濃い灰帯: 50% 予測区間
※予測区間に関しては geom_smooth() は使えない
fig4-3.R ファイルを極力短縮化
参考にさせていただきました
• predict 関数と数式の対応、グラフの描き方 (信頼区間・予測区間編 ) http://crayfish44.hatenablog.jp/entry/20160223/1456220882
• Excel で回帰分析の予測区間を描く http://qiita.com/ksksk/items/75ba95337ccdb32e7cb1
58
4.4.5 Stan で実装
59
model4-5.stan ファイルに説明追記
今回は無情報事前分布を採用するので,事前分布は省略可能(自動的に,十分に広い一様分布が適用される)
4.4.6 R からの実行方法
60
run-model4-5.R を改変(書き方が違うだけで内容は同一)コンパイル済みの Stan モデルファイルを参照できるので,サンプリングだけを行えばよい場合は速い( 4.4.9 ( p44 )参照)
乱数の種。指定しておくと,乱数が再現可能
4.4.7 RStan の結果の見方
• まずは, lp__ を含む全パラメータが収束しているか確認 n_eff :実効的と判断された MCMC サンプル数
- 小さいと,分布や統計量の推定が不正確になる
Rhat : Chain 間の一致度の指標- 本書では, Chain 数が 3 以上で,全パラメータの Rhat < 1.1 が収束の基準
61
デフォルトの設定
4.4.7 Rstan の結果の見方
62
MCMC サンプルの分位点
分位点や小数点以下桁数は変更可能
4.4.8 収束診断をファイルへ出力する• ggmcmc パッケージを使用
収束診断に有用なグラフを自動で描いてくれる,ggplot2 のラッパー
63https://cran.r-project.org/web/packages/ggmcmc/ggmcmc.pdf
64
rstan-save-diagnostics.Rファイルより
グラフ指定全部出力
65
描画形式ごとに関数も存在する
自分で ggplotオブジェクトを改造することも可能!!
bayesplot パッケージも便利
66デフォルトで,基準位置を示してくれている
4.4.9 MCMC の設定の変更• Chains, iter, warmup, thin の目安
Chains- Stan 開発チームは 4 を推奨(デフォルト)
iter- モデルの試行錯誤段階では 500~1000 (デフォルトは 2000 )- 最終モデルが決まったら大きくする
warmup- traceplot を見て判断(デフォルトは 1000 )
thin- デフォルトは 1- traceplot を見て自己相関が高そうなら, thin を増やして一時的
な影響を低減させる67
68
上手く収束した場合
自己相関が高そうな場合
一時的に極端な値が生成されているhttp://qiita.com/kyn02666/items/a26a389aa5bfc8682186
4.4.10 並列計算の実行方法
• 通常は,複数の Chain を逐次的に走らせる(右図)
• Chain を並列的に走らせて,サンプリングの計算時間を短縮
69
現時点では,並列化が必要なほど複雑なモデルは組んでいないので,説明は割愛
4.4.11 ベイズ信頼区間とベイズ予測区間
• : B社の社員の年齢(歳)
• :年収(万円)
年収基本年収
70
基本年収のベイズ信頼区間は?年収のベイズ予測区間は?
95% ベイズ信頼区間
71
rstan-extract-MCMCsamples.R ファイル
N歳のときの 95% ベイズ信頼区間
72
rstan-extract-MCMCsamples.R ファイル・続き例えば 50 歳の時なら…
↓ 推定したパラメータを用いて予測した, 50 歳時点の基本年収←予測した 50 歳時点の基本年収を 平均とする,正規分布から発生 された年収
ベイズ信頼区間
73
大変そうに見える…が!
fig4-8.R より
74
最低限必要なコードはこれだけ
dplyr パッケージを使っていいならこのほうが挙動がイメージしやすいかも
75
推定した回帰式に任意の X を代入して予測値(の分布)を求めている
ベイズ予測区間
76
fig4-8.R のうち最低限必要なコードはこれだけ
77
fig4-8.R を, dplyr パッケージを使って書き換えた場合
4.4.12 transformed parameters ブロックgenerated quantities ブロック
78
データの宣言
サンプリングしたいパラメータの宣言※Stan におけるパラメータの定義:確率変数すべて
𝑝 (𝜃|𝑌 )=𝑝 (𝑌|𝜃 )𝑝 (𝜃 )𝑝 (𝑌 )
← この部分を書く
最低限必要なブロック
• ここまでの説明 Stan 上で確率モデルのパラメータを推定
MCMC サンプルを用いて, R 上で様々な計算
• この方法の問題点 R コードが複雑になりバグが入りやすくなる 計算速度が遅い 作業全体の見通しが悪い
79
可能な限り Stan 上で計算させたい!!
• transformed parameters ブロック data ブロックおよび parameter ブロックで宣言され
たパラメータと,定数値が使用可能 四則演算と log などの関数を用いて,新たにサンプ
リングする変数を作成- 例:条件 A の平均と,条件 B の平均の差
• generated quantities ブロック 上記に加え, transformed parameters ブロックで宣
言されたパラメータも使用可能! 事後確率とは完全に切り離されているため,計算が速い
80
81
82model4-5.stan model4-4.stan
↑ 正規分布に従う乱数を生成
83
(中略)
run-model4-4.R
R 上での計算が不要!
練習問題
84
ねらい
t検定に相当することを Stan で
85
準備まずはデータフレーム形式に加工
86
※あらかじめ作業ディレクトリを 移動しておくこと中略
Exercise (1)各グループの値に差が認められるか,おおよそ把握するために可視化
87
• ex1.Rファイル内の模範解答がこちら• group2 は,若干分布が歪んでいる• 中央値は group2 のほうが大きい• group2 のほうが,若干分散が小さそう
分布が知りたいなら…
88
• やはり group2 のほうが分散は小さそう
• 平均値(十字の中心)に差がありそう 縦線は SE を表す
• 両群とも大雑把には正規分布のようにみえる
Exercise (2)
各グループで標準偏差が等しいと仮定して,モデル式を書け( Student の t検定)
•
•
89
Exercise (3)• Stan で (2) のモデルファイルを作成して実行せ
よ ただし generated quantities ブロックは使用しない
90
R コード( ex3.R )Stan コード( ex3.stan )
Exercise (3)
91
だいたい一致( sd が大きいから…)
Exercise (4)• MCMC サンプルから R側でを計算
全MCMC のなかで, となる割合を求める
92
どちらの方法でもよい
ex4.R より
𝜇1<𝜇 2𝜇1<𝜇 2𝜇1<𝜇 2𝜇1<𝜇 2𝜇1<𝜇 2𝜇1>𝜇 2
93
generated quantities ブロックを使用した場合は…
diff が 0 より大きい確率を求めればいいmean(rstan::extract(fit)$diff > 0)
Exercise (5)
94
各グループで標準偏差が異なると仮定して,モデル式を書け( Welch の t検定)
•
•
添え字が付いただけ!
95
← 群の数だけを宣言する
を計算
• Exercise(4) と同様なので省略
96
おわりに
今回説明を飛ばした点: p47 MCMC サンプルが,事後分布であるからサンプリ
ングされたことを確認する点
つまり,の同時分布であることを確認する点
fig4-7.R だけでなく,以下のサイトが参考になります
散布図と周辺分布をあわせて描きたいhttp://qiita.com/hoxo_b/items/0382ae9055838b05ad9b
97