O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

StanとRでベイズ統計モデリング読書会Ch.9

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
Prml7 2
Prml7 2
Carregando em…3
×

Confira estes a seguir

1 de 73 Anúncio
Anúncio

Mais Conteúdo rRelacionado

Mais de 考司 小杉 (20)

Mais recentes (20)

Anúncio

StanとRでベイズ統計モデリング読書会Ch.9

  1. 1. Chapter 9 一歩進んだ文法 StanとRでベイズ統計モデリング 解説するのは;小杉考司
  2. 2. /71 自己紹介 • 小杉考司(こすぎこうじ)@kosugitti • 山口大学教育学部小学校コース心理学選修所属 • 専門;社会心理学,心理統計 2
  3. 3. /71 お品書き • 9.1 Stanで利用できる変数の型とインデックス • 9.5 エラーとその対処法 • 9.2 ベクトル型の活用による高速化 • 9.3 ベクトル型・マトリックス型を使ったモデル • 9.4 型でパラメタに制約を入れる方法 3
  4. 4. 9.1 Stanで利用できる変 数の型とインデックス
  5. 5. /71 9.1 型とインデックス • 大前提;「今からどういう変数を使いますよ」「パラメ ータはこんなですよ」をブロックの冒頭で宣言してから でないと使えない 5 BasicやRなどでは「事前通知」なしでいける親切?設計 CやC++など宣言が必要な言語の方が多い メモリの節約など機械にとってはこちらの方が安心
  6. 6. /71 9.1 型とインデックス • 型;データやパラメータを扱う形式のこと • スカラー,ベクトル,マトリックス・・・ • 多次元だと「配列」;X[n,m,l,k,...] 6 サイズ感が大事 (後述)
  7. 7. /71 9.1 型とインデックス • 一次元の配列とベクトルはどう違うのか? • 二次元の配列とベクトルは何が違うのか? 7 どちらも与える データは同じ…
  8. 8. /71 9.1 型とインデックス • 行の対応関係が保持される/セットとして受け付ける 8ざっくりあたえる セットを与える
  9. 9. /71 9.1 型とインデックス • ベクトル型/マトリックス型の利点 • 行列関数などが用意されているので高速化できる • 配列型の利点 • vectorが1次元,matrixが2次元に限定されているのに対し, 配列は自由 • int型ベクトルというのはない 9 intを書くところがそもそもない
  10. 10. /71 変数の宣言例と解説 10 型の例 宣言例 説明 整数 int N 整数 実数 real Y 実数 整数の配列 int Y[N] N個ある整数 実数の配列 real Y[N,M,L] N×M×L個の実数からなる 配列 表9.1 上の部分
  11. 11. /71 変数の宣言例と解説 11 型の例 宣言例 説明 ベクトル vector[K] Y 1個の長さKベクトル ベクトルの配列 vector[K] Y[N] N個の長さKベクトル ベクトルの配列 vector[K] Y[N,M] N×M個の長さKベクトル 行列 matrix[J,K] X 1個のJ×K行列 行列の配列 matrix[J,K] X[N] N個のJ×K行列 表9.2 下の部分 1 2 3 4 5
  12. 12. /71 変数の宣言例と解説 12 表9.2 下の部分 ・・・ ex)K個の質問に 答えるN人の回答者 ※個人の中でネスト されているのでベクトル として対応させた方が良い 1 2
  13. 13. /71 変数の宣言例と解説 13 表9.2 下の部分 ・・・ M個の対象についてN人の人が K個の質問に答える ・・・ ・・・ ex)6項目(からい,スッキリ,コク…)で 3個の銘柄(キリン,アサヒ,サッポロ) を200人に評定してもらいます 3
  14. 14. /71 変数の宣言例と解説 14 表9.2 下の部分 ex)誰が誰のことが 好きだと思うか,と いう調査をみんなに する 4 5
  15. 15. /71 変数へのアクセス 15 表9.4 StanにおけるIndexの利用例 宣言例 宣言例 得られる型 real Y[3] Y[2] real Y[2:3] real[2] real Y[N,M,L] Y[n] real[M,L] vector[K] V V[k] real V[1:(K-1)] vector[K-1] vector[K] V[N] V[n] vector[K] V[n,k] real K K-1 注意
  16. 16. /71 変数へのアクセス 16 表9.4 StanにおけるIndexの利用例 宣言例 宣言例 得られる型 matrix[J,K] X X[j] row_vector[K]X[j,] X[j,:] X[j,k] real X[,k] vector[J] X[1:2,1:2] matrix[2,2] matrix[J,K] X[N] X[n] matrix[J,K] J×K J J×K j,k ,k J×K 2×2
  17. 17. /71 J×K アクセスの特徴(p.150) • vector[K] Vとint Index[J] → V[Index] から vector[J] • Stanのmatrix型は列優先 • 並びに注意(K→L) • row_vectorへのアクセスはrow_vector型で 17 V … 個 V 注 J×K k ↓ J→ J→ J→ 行列演算をしなければ 扱うデータの形は同じ
  18. 18. /71 9.1.3. RからStanに渡す時 • 基本的にlist型で渡した方がエラーには出くわしにくい • あるいはRの配列array型 • data.frame型を渡してエラーになることも • サイズは合っているんだけど,型が合ってない(一次元配列 にdata.frameを渡しちゃった場合など) 18
  19. 19. 9.5 エラーとその対処法
  20. 20. /71 9.5.1 int型のパラメータ • Stanの最大の弱点,それはint型のパラメータを宣言でき ないことである。 • Stanのアルゴリズムに依る • 連続分布の勾配を使って効率の良いサンプリングを するアルゴリズムを採用しているから • JAGSはできる 20
  21. 21. 今月中に出ます! Amazonで 予約受付中 ch14がStanの章
  22. 22. /71 9.5.2 NAを渡せない • Stanの二番目の弱点,それは欠損値を渡せないこと • コードを工夫してやれば問題ない • 縦長コードにしてna.omitし,完全なデータだけ渡す ようにする • NA部分にindexをつけてパラメータとして推定する • JAGSは自動的にパラメータと思って推定してくれる・・・ 23
  23. 23. 今月中に出ます! Amazonで 予約受付中 ch8がJAGSの章 ch7のMCMCも 読み応えありますよ
  24. 24. /71 9.5 エラーとその対処 • 教えていて出てくるエラー/警告トップ3 25 バージョンあってません問題 このあと rstudioapiパッケージ ないよと言われるまでが ワンセット
  25. 25. /71 9.5 エラーとその対処 • 教えていて出てくるエラー/警告トップ3 26空の14行目が要る=13行目の後ろで改行
  26. 26. /71 9.5 エラーとその対処 • 教えていて出てくるエラー/警告トップ3 27 この中に三種類の間違いがあります どこでしょう?! C言語的にあり得へんエラー出てます問題
  27. 27. /71 9.5 エラーとその対処 28 大文字と小文字 まさかの「1(いち)」 スペルミス!
  28. 28. /71 9.5 エラーとその対処 29 正解一応ハイライトされてます
  29. 29. /71 こんなエラーも • 文法的には間違えていない=コンパイルは通るが,サン プリングができない。 30
  30. 30. /71 そのほかのエラー① 31 Macだと少し不親切・・・ セミコロン忘れちゃってますよ問題 忘れている次の行が検出される
  31. 31. /71 そのほかのエラー② 32 Macだと少し不親切・・・ ない変数使いましたよ問題
  32. 32. /71 そのほかのエラー③ 33 Macだと少し不親切・・・ 宣言していない変数使いましたよ問題
  33. 33. /71 そのほかのエラー④と⑤ 34 整数型=離散型パラメータは Stanでは使えない Macだと少し不親切・・・ ベクトルのサイズを指定する 場所を間違えている
  34. 34. /71 そのほかのエラー⑥ 35 Macだと少し不親切・・・ modelブロックで代入「=」を使った
  35. 35. /71 そのほかのエラー⑦ 36 Macだと少し不親切・・・ intをintで割ってるよ問題 丸められますけど?と警告してくれている
  36. 36. /71 警告など① 37 transformされたパラメータに対して サンプリングをさせると警告が出る (non-fatal)
  37. 37. 警告など② 初期値が却下されました (-2,2)の範囲で初期化 しようとしたけどさ ? stan坊や迷子問題
  38. 38. /71 余談;MCMCのイメージ • MCMCサンプリングはパラメータが同時に成立する可能 性のある組み合わせをたくさんとってくること • 確率空間をstan坊やが走り回って値を持ってくるイメージ 39 同時確率空間 鎖1 鎖2 鎖3
  39. 39. SAS小僧 vs Stan坊や
  40. 40. /71 余談;MCMCのイメージ • 適当な広さでないと,坊やたちはど こまでも行ってしまって帰ってこな い • 適切に条件を定めてやらないと坊や たちはなんでも拾って来てしまう • 複雑な地形になると,坊やたちの探 す時間がかかってしまう 41 そのための宣言(上限・下限など) そのための事前分布
  41. 41. 警告など③ ・スケールパラメータが無限大になっちゃったよ 368回 ・位置パラメータが無限大になっちゃったよ 26回 ・スケールパラメータが0になっちゃったよ 1回
  42. 42. 9.2 ベクトル型の活用 による高速化
  43. 43. /71 9.1 型とインデックス • ベクトル型/マトリックス型の利点 • 行列関数などが用意されているので高速化できる • 配列型の利点 • vectorが1次元,matrixが2次元に限定されているのに対し, 配列は自由 • int型ベクトルというのはない 44 intを書くところがそもそもない 再掲
  44. 44. /71 ベクトル化の基本 • それはもう高速化はありがたいですよ。 • まずはベクトル化を考えず,読みやすくて動くコードを 書こう。それができてから,ベクトル化できるところは やっていく,という順番。 • ベクトル化バージョンを作る際は「動く」バージョン も残しておこう! 45 model9-1.stan model9-2.stan
  45. 45. /7146 model9-1.stan model9-2.stan Nの位置に注意
  46. 46. /71 速さのひみつ 47 = = = = for文を書き下すと = N回の計算 1回の計算
  47. 47. /71 速さのひみつ 48 realsはreal型,vector型,row_vector型,real型一次元配列を許す real型として受け取っている vector型として受け取っている !
  48. 48. /71 normal_lpdfの引数の 型による挙動 49 yの型 muの型 sigmaの型 等価の表現 実数 実数 実数 y~normal(mu,sigma) ベクトル 実数 実数 for(n in 1:N) y[n]~normal(mu,sigma); 実数 ベクトル 実数 for(n in 1:N) y~normal(mu[n],sigma); ベクトル ベクトル 実数 for(n in 1:N) y[n]~normal(mu[n],sigma); ベクトル ベクトル ベクトル for(n in 1:N) y[n]~normal(mu[n],sigma[n]); 表9.6
  49. 49. /71 ベクトル化していこう • ベクトル化はmodelブロックから考えていく 1. for文の中でサンプリングしているところを見つける 2. マニュアルでベクトル化しているかチェック 3. dataやparametersブロックをベクトル化 50 9.2.2 ベクトル化の応用例-その1
  50. 50. /7151 まずはここから for文が怪しい
  51. 51. /7152 ベクトル化してみた .* は要素ごとの掛け算を行う演算子
  52. 52. これでベクトル化できた⭐︎ それに合わせて 他のブロックも 変更する
  53. 53. matrix型の宣言 Y mu to_vector関数 Y mu↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ベクトルとしてアクセスする model8-7b.stan exp/logなどベクトル化対応関数を使う技!
  54. 54. 9.3 ベクトル型の活用 による高速化
  55. 55. /71 9.3 vector型・matrix型を使っ たモデル 56 多変量正規分布 共分散行列型 10.2.4弱情報事前分布 も参照のこと
  56. 56. /71 応用的な変数の型 • cov_matrix, corr_matrix型 • 分散共分散型,相関行列型 • 正定値行列(全ての固有値が正)を仮定している • cholesky_factor_cov, cholesky_factor_corr型 • 共分散/相関行列をコレスキー分解したもの。 57 Cov/R 正方・対称行列 正方なのでサイズ 指定は一つでOK Cov/R = L L’
  57. 57. /71 • 行列はサイズ感が大事 58 = 同じであること 出来上がりは外側 • 行列の積のルールとサイズ感 行方向 列方向 =
  58. 58. /71 行列を使って考えましょう • 重回帰分析を行列表現する 59 Y = b0 X1 X2 X3 b1 b2 b3+ + + = b0 b1 b2 b3 X1 X2 X3 1 1 1 1 1 行列計算の基礎 = 同じであること 出来上がりは外側
  59. 59. /71 行列を使って考えましょう 60 の行列 のベクトル のベクトル ベクトル化された表現 行列のサイズ感
  60. 60. 9.4 型でパラメタに 制約を入れる方法
  61. 61. /71 9.4 型でパラメータに制約を • MCMCサンプリングはパラメータが同時に成立する可能 性のある組み合わせをたくさんとってくること • 確率空間をstan坊やが走り回って値を持ってくるイメージ 62 同時確率空間 鎖1 鎖2 鎖3
  62. 62. /71 9.4 型でパラメータに制約を 63 鎖1 鎖2 鎖3 upper lower <lower=0,upper=1> などで上限・下限を制約 ordered/simplexなどで 持ってくるものを制約
  63. 63. /71 9.4 型でパラメータに制約を • simplex型は「0から1の範囲」で「合計が1」なので確率 とみなせる • categorical分布のパラメータなどで使う • unit_vector型は各要素の二乗の合計が1の単位ベクトル • ordered型は要素が小さい順に並ぶベクトル • positive_ordered型は各要素が正のordered型 64
  64. 64. /71 9.4 型で制約出来ない場合 • 「0から1の範囲」で大きい順に並べたい • ordered型で「順に並べる」を考える • transformed parametersでinv_logitし「0から1の範囲」を達 成しつつ,順を逆転する 65
  65. 65. /71 9.4 型で制約出来ない場合 • 切断されたような分布の場合 • upperやlowerで切るだけ • 分散の事前分布には半コーシーや半t分布を使いますよね 66
  66. 66. /71 9.4 型で制約出来ない場合 • 等式を満たすパラメータ • 長さNのベクトルで合計が特定の値になってほしい • ex)分散分析をモデリングする場合,効果の大きさは水準を全て足 し合わせると0になる(水準の効果は平均からの偏差として表す) 67 N-1まではコピー N番目で帳尻を合わせる
  67. 67. 今月中に出ます! Amazonで 予約受付中 分散分析的モデリングは ch20を見てね!
  68. 68. /71 9.4 型で制約出来ない場合 • 不等式を満たすパラメータ • 長さNのベクトルで合計が特定の値以上になってほしい 69 N-1まではコピー N番目で帳尻を合わせる 下限を設定
  69. 69. /71 9.4 型で制約出来ない場合 • 不等式を満たすパラメータ2 • にしてほしい 70 • transformed parametersで宣言・定義した変数に制約をか けるとサンプリング効率が著しく低下する • 適切な変換を見つける • ex)Box-Mueller変換
  70. 70. /71 9.4 型で制約出来ない場合 • 不等式を満たすパラメータ2 • にしてほしい 71 • 条件に合わなければrejectしたり,負の無限大を加えるな どして必要なところだけ取り出すこともできる
  71. 71. /71 • 9.1 Stanで利用できる変数の型とインデックス • 9.5 エラーとその対処法 • 9.2 ベクトル型の活用による高速化 • 9.3 ベクトル型・マトリックス型を使ったモデル • 9.4 型でパラメタに制約を入れる方法 72
  72. 72. 今月中に出ます! Amazonで 予約受付中 Enjoy Modeling and Stan!

×