Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

StanとRでベイズ統計モデリングに関する読書会(Osaka.stan) 第四章

3,713 views

Published on

StanとRでベイズ統計モデリングに関する読書会(Osaka.stan)第二回における,第四章の発表資料です

Published in: Data & Analytics

StanとRでベイズ統計モデリングに関する読書会(Osaka.stan) 第四章

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

×