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.

StanTutorial

14,058 views

Published on

StanTutorial

  1. 1. Stanチュートリアル @TeitoNakagawa 2013/10/13
  2. 2. イントロダクション
  3. 3. データ分析最大の問題・・・
  4. 4. そう、それは
  5. 5. モデリング
  6. 6. しかし、それが難しい
  7. 7. モデリングに伴う問題 柔軟なモデリン グが必要 個体差の あるデータ 少ない データ 上記のような制約でモデリングを諦めることも
  8. 8. 統計モデリング 銀の弾丸
  9. 9. BUGS/Stan • BUGS/Stan・・・MCMCを用いたベイズ推定に よるモデリングを行うためのドメイン固有言語 殺意しか湧かないWinBUGSのGUI
  10. 10. BUGS/Stan • BUGS/Stan・・・MCMCを用いたベイズ推定に よるモデリングを行うためのドメイン固有言語 殺意しか湧かないWinBUGSのGUI
  11. 11. MCMCを用いたベイズ推定による モデリングのイメージ データ:結果であり、 入手したもの 現実世界 モデル:確率分布で表された世界。 パラメータに基づき、サイコロが 振られて、データが発生する。 ドメイン知識:結果から 得られた仮定 パラメータ: 神のみぞ知る世界、 事象の背後に潜む数値 *イメージです
  12. 12. MCMCを用いたベイズ推定による モデリングのイメージ データ:モデルに投入。データ を発生させるパラメータをモデ ルで高く評価させる ベイズ推定 モデル:サイコロを振る(=MCMC) ことにより、データとドメイン知識を もっとも説明するパラメータを推定 BUGS/Stan パラメータ:ベイズ推定 の結果として知りたい事象 ドメイン知識:仮定を制約として モデルに組み込む。 *イメージです
  13. 13. わからない人はこちらを参照 https://skydrive.live.com/view.aspx?resid=FD448A567D4BC37E!1408&ci d=fd448a567d4bc37e&app=PowerPoint&authkey=!ALpj-TLdJhVUvPw
  14. 14. BUGSとStanどっちを使えばいいの? BUGS(WinBUGS*1) コンパイル不要 技術的に枯れていて、資料 も多い。 非手続き的なのでモデルの 記述量が少ない。 計算は遅い デバッグ画面があれ。 開発が終了している。 *1:JAGSは利用したことがありません。 Stan コンパイル後の計算が早い NUTSなので収束が早い データ型が豊富 手続き的なので動作が明瞭 デバッグがしやすい 公式ドキュメントの質が高い 変数にドット.を使えないなど、 Rとの親和性が悪い 手続き的なので書くのが難 しい
  15. 15. 【参考】香ばしいWinBUGSのTrap画面
  16. 16. 【参考】BUGS→Stanのパフォーマンス 890×517のデータを使用、パラメータ数は893のモデル WinBUGS Stanx4
  17. 17. 【参考】BUGSを使うメリット http://www.slideshare.net/berobero11/bugs-26159695
  18. 18. Stanチュートリアル
  19. 19. Stanって何? • StanはHMCをNUTSで実装したサンプラー – 現在も開発、更新が頻繁に行われている。 – Rのインターフェースがあり、使いやすい • とにかく早い – NUTS(HMC)を使用しているため、収束が早い – C++→実行ファイルに変換、計算が早い
  20. 20. Stanのサンプルコード – BUGSと似ているがより手続き的 # http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf # Page 3: Rats data { int<lower=0> N; int<lower=0> T; real x[T]; real y[N,T]; real xbar; } ... model { mu_alpha ~ normal(0, 100); mu_beta ~ normal(0, 100); sigmasq_y ~ inv_gamma(0.001, 0.001); From https://github.com/stan-dev/stan/tree/master/src/models/bugs_examples/vol1/rats
  21. 21. Stanチュートリアル 1. 2. 3. 4. インストールします。 データを用意します。 Stanファイルを記述します。 RからStanを実行します。
  22. 22. Stanチュートリアル 1. 2. 3. 4. インストールします。 データを用意します。 Stanファイルを記述します。 RからStanを実行します。
  23. 23. インストール方法(Windows). 1. Rtoolsをインストール・・・次へ、次へをクリッ クすると入ります。 2. RCppとinlineをインストール・・・PATHの順番 を必ず、RtoolsのPATHが先頭に来るようにし ましょう。 3. Rstanをインストール・・・Rのインストールコー ド実行すると、インストールされ ます。CRANには存在しないので 注意。 参考:Windows8にrstanをインストールする。 http://d.hatena.ne.jp/EulerDijkstra/20130825/1377445438
  24. 24. Stanチュートリアル 1. 2. 3. 4. インストールします。 データを用意します。 Stanファイルを記述します。 RからStanを実行します。
  25. 25. ラットデータ • WinBUGS example volume Iに 入っているサンプルデータ (http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf) • • • • Gelfand et al (1990) 週別の生後間もないラットの体重のモデル 行:個別のラット(N=30) 列:体重計測日(M=5) From http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf
  26. 26. データを用意します。 rats.data.R N <-30 T <-5 y <-structure(c(151, 145, 147, 155, 135, 159, 141, 159, 177, 134, 160, 143, 154, 171, 163, 160, 142, 156, 157, 152, 154, 139, 146, 157, 132, 160, 169, 157, 137, 153, 199, 199, 214, 200, 188, 210, 189, 201, 236, 182, 208, 188, 200, 221, 216, 207, 187, 203, 212, 203, 205, 190, 191, 211, 185, 207, 216, 205, 180, 200, 246, 249, 263, 237, 230, 252, 231, 248, 285, 220, 261, 220, 244, 270, 242, 248, 234, 243, 259, 246, 253, 225, 229, 250, 237, 257, 261, 248, 219, 244, 283, 293, 312, 272, 280, 298, 275, 297, 350, 260, 313, 273, 289, 326, 281, 288, 280, 283, 307, 286, 298, 267, 272, 285, 286, 303, 295, 289, 258, 286, 320, 354, 328, 297, 323, 331, 305, 338, 376, 296, 352, 314, 325, 358, 312, 324, 316, 317, 336, 321, 334, 302, 302, 323, 331, 345, 333, 316, 291, 324), .Dim = c(30, 5)) x <- c(8.0, 15.0, 22.0, 29.0, 36.0) ファイルの場所 xbar <-22.0 <Rのライブラリーインストール先>rstan¥include¥ stansrc¥models¥bugs_examples¥vol1¥rats
  27. 27. Stanチュートリアル 1. 2. 3. 4. インストールします。 データを用意します。 Stanファイルを記述します。 RからStanを実行します。
  28. 28. ラットモデル • 個体差と時間による成長を取り入れた階層ベイズモ デル Yij : 個体iのj日目の観測データ x j :日数 xbar :日数中央値( 22 ) 日 知りたいの はこれ!  i : 個体iの切片  i : 個体iの日数係数  : 全個体共通のバラツキ From http://www.mrc-bsu.cam.ac.uk/bugs/winbugs/Vol1.pdf
  29. 29. Stanプログラムはブロックからなる • Stanの骨子となるプログラム • modelブロック以外はオプショナル この順は 固定 data { model { ... declarations ... ... declarations ... statements ... } } transformed data { generated quantities { ... declarations ... statements ...... declarations ... statements ... } } parameters { ... declarations ... } transformed parameters { ... declarations ... statements ... }
  30. 30. Stan Program has specific blocks. data • 入力データの宣言、デー タは最初にロードされる transformed data • データに対してStan側で 変換を行う parameters • 結果として出力するパラ メータを宣言する。
  31. 31. dataブロック 先ほどのデータファイルの変数名と一致している。 N=個体数、T=日付の数 X=日数、Y=観測値 Xbar=日数の中央値 ベクトルではなく、配列
  32. 32. parametersブロック 個体差の配列を宣言 alpha=出生体重 beta=日数の効果 個体差の配列を宣言 各パラメー タの分散
  33. 33. Stan Program has specific blocks. Transformed • パラメータを変換する Parameters Model Generated Quantities • モデル記述部、必須 • 全ての変数を参照可能。1 サンプルにつき実行される。
  34. 34. transfromed parametersブロック transformed parameters { 分散を標準偏差 real<lower=0> sigma_y; // sigma in original… に変換 real<lower=0> sigma_alpha; real<lower=0> sigma_beta; sigma_y <- sqrt(sigmasq_y); sigma_alpha <- sqrt(sigmasq_alpha); sigma_beta <- sqrt(sigmasq_beta); }
  35. 35. modelブロック model { 超パラメータを mu_alpha ~ normal(0, 100); サンプリング mu_beta ~ normal(0, 100); sigmasq_y ~ inv_gamma(0.001, 0.001); sigmasq_alpha ~ inv_gamma(0.001, 0.001); sigmasq_beta ~ inv_gamma(0.001, 0.001); alpha ~ normal(mu_alpha, sigma_alpha); // vectorized 超パラメータを beta~ normal(mu_beta, sigma_beta); // vectorized 用いてパラメータ for (n in 1:N) をサンプリング for (t in 1:T) y[n,t] ~ normal(alpha[n] + beta[n] * (x[t] - xbar), sigma_y); } 個体差を含む体重に誤差を加えてサンプリング
  36. 36. Stanチュートリアル 1. 2. 3. 4. インストールします。 データを用意します。 Stanファイルを記述します。 RからStanを実行します。
  37. 37. RStan • Rstan・・・RのStanインターフェース – C++への変換、コンパイルから、実行までを担当 – 結果はstanfit関数に格納 – 可視化の関数あり Rstanまわりの構造 stan () stan () Stan code stanc() C++ code plot() exe stan_model() S4:stanfit sampling() traceplot() extract()
  38. 38. Rでの実行 #set to dir which contains source file STAN_HOME<-<STAN_HOME> dirpath<-paste0(STAN_HOME, path_to_dir) #load data to list:dat データはリス source(paste0(dirpath, "/rats.data.R")) ト形式でStan dat<-list(y=y, x=x, xbar=xbar, N=N, T=T) に渡せる。 #fit1:to simulate the model as one liner fit1 <- stan(file = paste0(dirpath, "/rats.stan"), data = dat, iter = 1000, chains = 4) apply(extract(fit1)$alpha,2, median) Stanfitクラス、Stanでの実行結果が返される
  39. 39. plot(stanfit) パラメータ別に値を確認 可能 Rhatは色で確認
  40. 40. traceplot(stanfit) それぞれのチェインのふ るまいを確認可能
  41. 41. 前回のモデルを利用 Once a model is fitted, we can use the fitted result as an input to fit the model with other data or settings. This would save us time of compiling the C++ code for the model https://code.google.com/p/stan/wiki/RStanGettingStarted #fit again using the previous fit result fit3<-stan(fit=fit1, data = dat, iter = 400, chains = 4)
  42. 42. Rからの並列計算 #parallel processing of library(doSNOW) library(foreach) cl<-makeCluster(4) registerDoSNOW(cl) doSNOWとforeachを使用 4パラで計算 #parallel processing each chain of stan sflist1<-foreach(i=1:10,.packages='rstan') %dopar% { stan(fit = fit1, data=dat, chains = 1, chain_id = i, refresh = -1) } #merging the chains f3<-sflist2stanfit(sflist1) foreachで並列処理、 Stanfitクラスのリストを取得する。 Sflist2stanfitでリストをマージする。
  43. 43. 結果
  44. 44. EOF

×