Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tokyo.R #94 脱rstan初心者

E163ae0588e154424d78e17672076ef4?s=47 Koji E. Kosugi
September 11, 2021

Tokyo.R #94 脱rstan初心者

第94回Tokyo.Rでの発表資料です。

E163ae0588e154424d78e17672076ef4?s=128

Koji E. Kosugi

September 11, 2021
Tweet

Transcript

  1. めざせ! 脱rstan初心者 @kosugitti 1

  2. 自己紹介 • 名前;小杉考司(こすぎこうじ) • 略歴;1976.01.17 大阪市生まれ • 趣味;心理統計,統計モデリング • 仕事;専修大学で心理統計教えてます

    2
  3. 初心者を脱出する 4 ඿ా޺ઌੜˏ౦๺େֶͷΞΠσΞΛ΋ͱʹΠϥετԽ ॳ৺ऀ͔΋ CSNT͕ ΍ͬͯ͘ΕΔʂ தڃऀʁ ্ڃऀ ਆ

  4. 初心者だって大変だ • データを眺める=可視化するだけでもやることはたくさん • 分布に当てはめていくのも,分布とリンク関数の知識が必要 なので,やるべきこといっぱーい • 幸いbrmsなど専用パッケージがあれば,細かくコードを 書く必要はないし,収束しない問題に出会うことも少ない •

    まずは色々あそんでみよう 5
  5. じゃあ中級者は? • Stanのコードを自分で描き始めたら(brmsなど既存パッ ケージに頼らなければ),あなたはもう中級者! • 分布をあれこれ混ぜ合わせたくなってきたら,あなたはもう 中級者! • 分布の混ぜ合わせ方→階層モデル,潜在クラスモデル •

    決まったモデルから入っていくというよりも,自分の分析し たい現象に素直に向き合って,モデルを作り上げていく 6
  6. ٱอઌੜͷΠϥετ দӜઌੜͷΠϥετ ؠ೾σʔλαΠΤϯεWPMΑΓ 世界の成り立ちを想像しよう

  7. ٱอ  σʔλղੳͷͨΊ ͷ౷ܭϞσϦϯάೖ໳ΑΓ

  8. 紙とペン • フルスクラッチでstanコードを書くときは,まず紙とペンを 用意します! • タブレットとタッチペンでもいいけど,とりあえずいきなり エディタを立ち上げるわけではありません • 描き方に好みがあるかもしれませんが,おすすめは縦長に セットしてデータを最下部に置きます

    10
  9. yi σʔλ͕͋ͬͨͱ͞

  10. d Կ͔ͷϝΧχζϜʹ֬཰෼෍ ͔Βग़͖ͯͯΔ yi

  11. d ୯ๆͰࠨӈରশͳΒ ͻͱ·ͣਖ਼ن෼෍͔ͳʁ yi

  12. d ୯ๆͰࠨӈରশͳΒ ͻͱ·ͣਖ਼ن෼෍͔ͳʁ ਖ਼ن෼෍ʹ͸ ύϥϝλೋͭ̇ ʢҐஔͱ෯ʣ yi μ σi ෼ࢄ

    ਫ਼౓ ͕ݸਓ͝ͱʹ มΘΔͱ͍͏Ϟσϧ
  13. d d d Θ͔Βͳ͍΋ͷ͸ ֬཰෼෍ʹ͕ͨ͠͏ͷ͕ ϕΠδΞϯͷᎄ Θ͔Βͳ͍΋ͷ͸ ֬཰෼෍ʹ͕ͨ͠͏ͷ͕ ϕΠδΞϯͷᎄ μ

    σi yi
  14. d d d ͓͖·͠ΐ͏ࣄલ෼෍ ͓͖·͠ΐ͏ࣄલ෼෍ μ σi yi

  15. 完成 17 d d d μ σi yi

  16. 完成 • 下から上に書いていく • パラメータは記号か数字 • わからないものにはそれを生む 確率分布をおく • 数字で

    fi xされたら図の完成 18 ͘͝౰ͨΓલͷ͜ͱͷΑ͏ʹࢥ͑·͕͢ɼ ͪΌΜͱઃܭਤΛॻ͍͓͔ͯͳ͍ͱ ίʔυΛॻ͘ͱ͖ʹ໎ࢠʹͳΓ·͢
  17. ίʔυʹ͠·͢ σʔλͷग़Ͳ͜Ζʹ ໬౓ σʔλͷग़Ͳ͜Ζʹ ໬౓ Θ͔Βͳ͍΋ͷΛ ද֬͢཰෼෍ʹ ࣄલ෼෍

  18. ίʔυʹ͠·͢ ٻΊ͍ͨ΋ͷɼϞσϧϒϩοΫͰ ه߸Ͱද͍ͯͨ͠΋ͷΛ ύϥϝʔλϒϩοΫʹॻ͘ ֎͔Β༩͑ΒΕΔ΋ͷ͸ σʔλϒϩοΫʹॻ͘

  19. yi σʔλ͕͋ͬͨͱ͞ 分布の混ぜ合わせ1 階層線形モデルの場合

  20. d yi Կ͔ͷϝΧχζϜʹ֬཰෼෍ ͔Βग़͖ͯͯΔ

  21. d yi ୯ๆͰࠨӈରশͳΒ ͻͱ·ͣਖ਼ن෼෍͔ͳʁ

  22. d yi μ ୯ๆͰࠨӈରশͳΒ ͻͱ·ͣਖ਼ن෼෍͔ͳʁ ਖ਼ن෼෍ʹ͸ ύϥϝλೋͭ̇ ʢҐஔͱ෯ʣ σ

  23. d yi μ Θ͔Βͳ͍΋ͷ͸ ֬཰෼෍ʹ͕ͨ͠͏ͷ͕ ϕΠδΞϯͷᎄ σ d ࣄલ෼෍ͷύϥϝλ΋ ϑΟοΫε͞Ε͍ͯΔͷͰ

    ͜Ε͸͜͜ͰऴΘΓ
  24. d yi μi ʹ β0 + β1i Xi ܏͖͕ ݸਓJͰมΘΔ

    Ϟσϧ ฏۉʹ͸ߏ଄ʢϞσϧʣ͕ ೖΔʢ֬཰తͰͳ͍ʣ σ d
  25. d yi μi ʹ β0 + β1i Xi ܏͖͕ ݸਓJͰมΘΔ

    Ϟσϧ d 0 100 Θ͔Βͳ͍΋ͷ͸ ֬཰෼෍ʹ͕ͨ͠͏ͷ͕ ϕΠδΞϯͷᎄ ࣄલ෼෍ͷύϥϝλΛ ϑΟοΫε͢Δͱ ͜Ε͸͜͜ͰऴΘΓ σ d
  26. d yi μi ʹ β0 + β1i Xi ܏͖͕ ݸਓJͰมΘΔ

    Ϟσϧ d 0 100 τ β1M d ܏͖ͷฏۉ ʢݸਓࠩͷฏۉʣ ܏͖ͷ෼ࢄ ʢݸਓࠩͷ෼ࢄʣ σ d
  27. d yi μi σ ʹ β0 + β1i Xi ܏͖͕

    ݸਓJͰมΘΔ Ϟσϧ d 0 100 τ β1M d d 0 100 d ࣄલ෼෍ͷύϥϝλ΋ ϑΟοΫε͞Ε͍ͯΔͷͰ ͜͜ͰऴΘΓ ࣄલ෼෍ͷύϥϝλ΋ ϑΟοΫε͞Ε͍ͯΔͷͰ ͜͜ͰऴΘΓ d
  28. d yi μi ʹ β0 + β1i Xi d 0

    100 τ β1M d d 0 100 d 完成 • わからないものは確率で • 確率分布のパラメータが 固定できるまで上に 30 σ d
  29. 31 ࣄલ෼෍Ͱͳ͍ ֬཰Ϟσϧͷͱ͜Ζ ʹ໬౓ 設計図からコードに起こす

  30. 32 ύϥϝλ͕ݻఆ͞Εͨ ֬཰ʹࣄલ෼෍ 設計図からコードに起こす

  31. 33 ߏ଄͕ೖͬͨͱ͜Ζ͸ USBOTGPSNFEQBSBNFUFSTϒϩοΫͰ هड़͢ΔͱεοΩϦ͢Δ

  32. 34 Ϟσϧʹؚ·ΕΔະ஌਺ʢΪϦγΞจࣈʣ ͕ਪఆ͢΂͖ύϥϝʔλ

  33. 35 σʔλ͸3ͱͷ૭ޱ

  34. 36 完成 ׳Εͯ͘Δͱ্͔Βॻ͘͜ͱ΋ Ͱ͖ΔΑ͏ʹͳΓ·͢ʂ

  35. 階層モデルもこわくない • 色々なところに分布を混ぜる階層モデルも,設計図があれば迷子になり ません • 逆にいうと,初心者は設計図がイメージできていないのに書こうとし て,変数間関係がわからなくなっちゃってる • 階層線形モデルのテキストを読むと,記号で色々説明してくれています が,図にしてみると整理しやすい

    • レベル1,レベル2とか といった文字・記号も図にしてみると簡単 • 図の描き方にはプレート表現もありますが,Kurshcke styleのほうが わかりやすい(と個人的には思っています) γ00 , τ10 37
  36. コード上でのテクニック • transformed parametersを駆使するようになると,よ く言われるのがこれ 38 • transformed parametersで作られた変数に対してサ ンプリング記法で表現するのが良くない。

    αϯϓϦϯάه๏ λʔήοτه๏ • 事後予測チェック,WAIC/LOOの計算などにも必要な書き 方なのでtarget+=で書く癖をつけよう
  37. • ゼロ過剰ポアソンとか,混合正規モデルなどデータ生成メカニ ズムの背景に質的(離散的・カテゴリ的)違いがあるモデルの 場合は,基本的にtarget+=記法になる • 質的に違うものを混ぜ合わせるというのは,言い換えると条 件分岐(if文)のようなもの。 • もしカテゴリ1なら→分布Aに従う •

    もしカテゴリ2なら→分布Bに従う 39 分布の混ぜ合わせ2 潜在クラスモデルの場合 θ ͜ͷJGͷ෼ذΛΧςΰϦΧϧ෼෍ͷύϥϝλʹΑͬͯදݱ͢Δ
  38. 40 分布の混ぜ合わせ2 潜在クラスモデルの場合 d yi μA σ μB σ θ

    1 − θ θ
  39. 41 d yi μA σ μB σ θ 1 −

    θ θ θ × Normal(μA , σ) (1 − θ) × Normal(μB , σ) ࠨϧʔτ ӈϧʔτ
  40. 42 θ × Normal(μA , σ) (1 − θ) ×

    Normal(μB , σ) • Stanの中では対数尤度,logをとった形で計算する log(θ) + log(Normal(μA , σ)) log(1 − θ) + log(Normal(μB , σ)) • normal_lpdfの形に書き換える log(theta)+normal_lpdf(y[i] | mu1 , sigma) log(1-theta)+normal_lpdf(y[I] | mu2 , sigma) • この二つの状態(左・右ルート)を足し合わせたものが結果の確率になる • →対数をとった表現にしているので,exp関数で元の確率に戻して から足し合わせる • →Stanの中では対数尤度で計算するので,logをとった形にする MPH TVN FYQ
  41. 43 log(theta)+normal_lpdf(y[i] | mu1 , sigma) log(1-theta)+normal_lpdf(y[I] | mu2 ,

    sigma) • この二つの状態(左・右ルート)を足し合わせたものが結果の確率になる • →対数をとった表現にしているので,exp関数で元の確率に戻して から足し合わせる • →Stanの中では対数尤度で計算するので,logをとった形にする MPH TVN FYQ log_sum_exp • log_sum_exp関数の()の中身は足し合わせるべきベクトル , target += log_sum_exp ৚݅ ৚݅ ৚݅/ ʜ
  42. 44 この表現力を手にいれると, あなたはもう中級者

  43. Stanの階段のぼる〜 • 離散分布は条件分岐と考えると「Aのときで,さらにBならこっち のルートで・・・」と離散分布を重ねていくことで色々な表現ができ るようになる→アヒル本11.4のLDA/CateCate分布 • transformの中で条件分岐ベクトルだけ書いて,modelブロック ではtarget+=だけになる,といった書き方も • さらに面倒な分岐をfunctionブロックを使って書き始めると

    上級者への道が・・・ • 混ぜ合わせ+MCMCによるラベルスイッチング問題などに直面す ると,stanのさまざまな型(ordered vectorなど)にも目が向 いてきます 45
  44. もう一つの中級者 • Rstanの初心者を脱出する際に必要なルートは「インストール の壁」 • バージョンが上がる,OSが変わる,チップが変わると結構あ ちこちで悲鳴が上がる。なかなか安定した環境を保持し続け るのは難しい • これはもう経験あるのみで,色々なケースでのノウハウを積

    み重ね,ググり続けるしかないです。 • 脱出(というか迂回)方法として,Dockerやcmdstanrに 乗り換えるというのもあり。 47
  45. 48 Stan Advent  Calendar2019で検索

  46. 49

  47. 50 Stan Advent  Calendar2020で検索

  48. Enjoy!