RStanの導入 &
基本的な使い方
小杉考司(山口大学教育学部)
自己紹介
• 小杉考司(こすぎこうじ)
• 山口大学教育学部
• 専門;数理社会心理学
• kosugi@yamaguchi-u.ac.jp
• Twitter; @kosugitti
お品書き
• RStanのインストール
• RStanをつかってみましょう
• 実践!世界一,二番目に簡単なRStanコード
対象
• ベイズ推定/MCMCを使ってみたいなぁと最近思い
始めた人
• コンピュータプログラミングは敷居が高いと思うん
だけど,R言語ぐらい(の難易度)なら頑張って書い
てみようと思っている人
MCMC使ってみたい!
• 商用ソフトの一機能として;Amos, Mplus
• BUGS(WinBUGS,OpenBUGS,JAGS)
• Bayesian inference Using Gibbs Sampling
• ギブスサンプリングを使ったベイズ推定
• 残念ながら開発が終わっちゃったみたい
Stan登場
• ハミルトニアン・モンテカルロ法,
Not-U-Turnテクニックなど新しい手法
を取り入れたMCMCエンジン
• 高速で収束しやすいのが売り
スタニスワフ・マルチン・ウラム
(Stanistaw Marcin Ulam,1909-1984)
モンテカルロ法を考案(命名はノイマン)
Stanの特徴
• コンパイル後の計算が速い
• NUTSなので収束が速い
• 手続き型でわかりやすい
• 公式マニュアルが結構丁寧
• 様々な環境に対応
• RStan,PyStan,CmdStan,MatlabStan,Stan.jl…いずれstataにも
Stanの特徴
• コンパイル後の計算が速い,とは
!
人間がわかる
言葉
機械がわかる言葉に
翻訳=コンパイル
ネイティブなので
理解が早いです
∼
Stanの特徴
∼
RStanの導入
• パッケージとしてCRANからダウンロード・・・と
行けるようになったらいいんだけど,まだ(́Д` )
• でもたった3行のコードを走らせるだけで入る。
• ただし,C++環境も同時に用意しなければならない
Rstanのインストール
必要なルートを見ててね
C++導入部Rは導入済み RStanへ
RStan導入
∼Windows編∼
• RtoolsをRと合わせてインストールしておく必要が
あります。
• http://cran.r-project.org/bin/windows/Rtools/
• Rのバージョンに合わせたものをダウンロードして
おくこと!
RStan導入
∼Windows編∼
• Rtoolsをインストールするとき,「パス」の編集の
ステップに注意。
C++コンパイラがRtoolsに含
まれていますが,「パスの編集」
の時にチェックが入ってないと
動かなくなっちゃいます。
RStan導入
∼Windows編∼
• Rtoolsがちゃんと入ったかどうかのチェックをして
おくと万全!
>Sys.getenv(‘PATH’)
>system(‘g++ -v’) >system(‘where make’)
RStan導入
∼Mac編∼
• Rは入っているものとして
• C++環境はXcodeと呼ばれるツールにあります
• OS X 10.9 Marvericks ,10.8 Mountain Lion
• App Storeで「Xcode」を検索してダウンロード&イ
ンストール
• OS X 10.7 Lion , 10.6 Snow Leopard
• Apple Developerに登録(無料)して,Xcodeと
Command-Line Toolsをダウンロード&インストール
RStan導入
∼Luinux編∼
• sudo apt-get install build-essential
ここからコードは3行
• Sys.setenv(MAKEFLAGS = "-j4")
• source('http://mc-stan.org/rstan/install.R',
echo = TRUE, max.deparse.length = 2000)
• install_rstan()
のサイトからコピペしたほうが早い
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started
ここからコードは3行
• インストールには少し時間(5∼30分ぐらい?)が
かかります。
• これは各環境でRStanをコンパイルしながら進むか
らです。
• Macで警告が出ることがありますが,「この機能は
使ってないから問題ないよ」by作者とのこと。
インストールが終わったら
• 一旦Rを終了→再起動して使います。
• あとは
RStanを
つかってみましょう
サンプルを見てみる
• まずはStan公式サイトにある公式サンプルコード,
eight schoolsをやってみましょう。
• 中身の説明はあとまわしで,まずRStanの挙動をみ
てみたいとおもいます。
八学校
このコードをメモ帳に
Copy&Pasteし,
8schools.stan という
ファイル名で保存
このコードを  で実行
八学校
何かじーっとしてると思ったら・・・
八学校
なんかいっぱい出た
で,何が起こったの?
• 結果を確認してみる。
• 平均値,パーセンタイル,Rhatなどが出る。
で,何が起こったの?
• >traceplot(fit,ask=T)
で,何が起こったの?
• >plot(fit)
の使い方
おちついて見てみよう
• 上の部分は,リスト型のデータを作っているだけ
• 下の部分がstanという関数でstanを呼んでいる
おちついて見てみよう
• さらによくみると,stan関数には
• stanファイル
• データ   
• iter   
• chains
• を渡している
←おそらくstanのひみつ
←1000サンプリング(反復回数)
←さっき見たN=8のデータセット
←4セットやる
おちついて見てみよう
←1000回サンプリング
←4セット目
Warmup=Burnin
デフォルトでは
サンプリング回数の
半分を当てる
stanファイルの構成
四つのセクションに分かれている
stanファイルの構成
データセクション
外部から受け取るデータに対応
int(整数型)や real(実数型)などを指定
<lower=0>は非負の数,という指定(メモリ節約)
大かっこ[]はベクトルであることとそのサイズを意味する。
stanファイルの構成
パラメタセクション
今から組みたいモデルで使うパラメタを宣言
実数型とか,非負であるとかの指定ができる。
ベクトルで宣言したほうが効率的(後述)。
ここではmuとtauとetaを使う,としている。
stanファイルの構成
モデルセクション
パラメタとその変換セクションで宣言したもので
モデルを書く。
etaは平均0分散1の正規分布に従う,とある。
データyは平均thetaと分散sigmaに従う。
theta?
stanファイルの構成
パラメタ変換セクション
データとパラメタの橋渡し。
今回はthetaというパラメタを新しく作っている。
それは(mu+tau*eta[j])の別名。
これを直接モデルに書いてもいいけど,わかりやすくするた
めに書き直している。
 for文は反復を意味するC言語的表現。
stanファイルの構成
モデルと分布
ここで
残差が正規分布する,ということに注目すると
左側のところは平均に関するモデルなんだから
モデルと分布
ほぼそのまま書いている
丁寧に全部書いたらこうなる
モデルと分布
j回同じ式を繰り返すのは
無駄なので省略(ベクトル化)
ここがなんか長いのでtheta
にまとめちゃった
Stanの文法
• ブロックを中かっこ{}でくくる
• ブロックは6つ。全部なくてもいいけど,順番を変
えちゃダメ。
• data/transformed data
• parameters/transformed parameters
• model
• generated quantities
• コードの終わりはセミコロン;で
Stanの文法
• data{} / transformed data{}セクション
• 外部から読み込むデータの型やサイズを宣言
• 以後の分析でデータを書き換えるのがtransdormed
dataセクション
• 例えばローデータを読み込んで中でCov行列に変え
てから使ったりできる。
Stanの文法
• parameters/transformed parametersセクション
• 推定するパラメタの宣言
• モデルでパラメタを書き換えるのがtransdormed
parameterセクション
Stanの文法
• modelセクション
• これがないと始まらない
• generated quantities
• 推定値を変換して使いたい数字にして出力
• 例)項目反応理論の項目母数の形に変えるなど
Stanの文法;宣言
• 整数型は int,実数型はreal
• <lower=0>や<upper=1>などで制限をかけられる
• real<lower=0,upper=1> eta;
• ベクトルや行列で宣言することもできる
• vector<lower=0>[3] y;
• matrix[M,A] L;
• vector[A] F[N];
詳しくはstan-reference2.6.0.pdfをみてね
Stanの文法;文
• 使える確率分布の一例
• 正規分布;y~normal(mu,sigma);
• コーシー分布;y~cauchy(mu,sigma);
• 二項分布;y~binominal(N,theta);
• 逆ガンマ分布;y~inv_gamma(alpha,beta);
詳しくはstan-reference2.6.0.pdfをみてね
RでStanを使うとき
• Rの文中にstanコードを書き入れてもいい。
∼ 中略 ∼
クォーテーションで括る
stan関数にコードを引き渡す時の書き方
RでStanを使うとき
• parallelパッケージで並列化も(高速化するかな?)
8コア使った4鎖の例(Mac/Linux)
詳しくは公式サイトに
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started
※Windowsでは書き方が少し異なります
実践!
世界一,二番目に簡単なRStanコード
分布で考える
• 従来型の統計をやってきた人にとって違和感を覚え
る最初のポイント
• パラメータが分布する?
• モデルがどんな分布を仮定するか誰も教えてく
れなかった(どうせ正規分布なんでしょ?)
頻度論vsベイズ
(c)岡田先生
頻度論 ベイズ
母数θ 定数 確率変数
データy 確率変数 定数
分布で遊んでみたら
わかりやすいかも
世界一簡単なrstanコード
•   には様々な分布に基づいて乱数を発生させる関
数が用意されている。
• 分布に基づいて発生させた乱数データで,stanが分
布を推定するかどうか確かめるという遊び。
http://kosugitti.net/archives/4823
世界一簡単なrstanコード
rstanを読み込みます
平均mu,分散sigの正規乱数に従う
データをn個つくります。
http://kosugitti.net/archives/4823
世界一簡単なrstanコード
T個のデータを読み込み,
Nとします。
推定したいパラメタは
平均と分散です。
分散は非負です。
データは正規分布,
分散はコーシーに従います
http://kosugitti.net/archives/4823
世界一簡単なrstanコード
データをリストで渡します
1000回サンプリングを
4セットやります。
世界一簡単なrstanコード
データ通りにでてます。
二番目に簡単なrstanコード
http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125
二番目に簡単なrstanコード
http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125
二番目に簡単なrstanコード
http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125
最尤推定との比較
Tips
• alpha,betaに事前分布を置いてやるとなお良い
• stanは明示的に事前分布を指定しないと,一様
分布を当てはめる
慣れてきたでしょうか?
世界一簡単な
収束しないrstanコード
• 逆にどういうことをしたら収束しないのか?という
のを知るのもいい勉強になる。
http://goo.gl/ZafBgX
例1
世界一簡単な
収束しないrstanコード
http://goo.gl/ZafBgX
例2
stanの恩恵
• 分布を考える,初期値をうまく置くなど,確かにコ
ツがいることは否定できない。
• しかし,考えることがかなり少なくて済むようになっ
たこと喜ぼう。
• stanは対数尤度関数を書かなくても良い!
ex)回帰分析の最尤法
http://goo.gl/5LY9N9
NY
i=1
1
p
2⇡ 2
exp(
ei
2 2
)
N
2
log(2⇡ 2
)
1
2 2
NX
i=1
e2
i
尤度
対数尤度
そのまま
書ける
書きたくない
• これで許してくれる
これはすごいことです。
Enjoy ! and
ねえちゃん,明日って,今さ!

R stan導入公開版