R stan導入公開版

73
RStanの導入 & 基本的な使い方 小杉考司(山口大学教育学部)
  • Upload

    -
  • Category

    Education

  • view

    4.585
  • download

    5

Transcript of R stan導入公開版

Page 1: R stan導入公開版

RStanの導入 & 基本的な使い方

小杉考司(山口大学教育学部)

Page 2: R stan導入公開版

自己紹介• 小杉考司(こすぎこうじ)

• 山口大学教育学部

• 専門;数理社会心理学

[email protected]

• Twitter; @kosugitti

Page 3: R stan導入公開版

お品書き

• RStanのインストール

• RStanをつかってみましょう

• 実践!世界一,二番目に簡単なRStanコード

Page 4: R stan導入公開版

対象

• ベイズ推定/MCMCを使ってみたいなぁと最近思い始めた人

• コンピュータプログラミングは敷居が高いと思うんだけど,R言語ぐらい(の難易度)なら頑張って書いてみようと思っている人

Page 5: R stan導入公開版

MCMC使ってみたい!• 商用ソフトの一機能として;Amos, Mplus

• BUGS(WinBUGS,OpenBUGS,JAGS)

• Bayesian inference Using Gibbs Sampling • ギブスサンプリングを使ったベイズ推定

• 残念ながら開発が終わっちゃったみたい

Page 6: R stan導入公開版

Stan登場

• ハミルトニアン・モンテカルロ法,Not-U-Turnテクニックなど新しい手法を取り入れたMCMCエンジン

• 高速で収束しやすいのが売り

スタニスワフ・マルチン・ウラム (Stanistaw Marcin Ulam,1909-1984) モンテカルロ法を考案(命名はノイマン)

Page 7: R stan導入公開版

Stanの特徴• コンパイル後の計算が速い

• NUTSなので収束が速い

• 手続き型でわかりやすい

• 公式マニュアルが結構丁寧

• 様々な環境に対応 • RStan,PyStan,CmdStan,MatlabStan,Stan.jl…いずれstataにも

Page 8: R stan導入公開版

Stanの特徴• コンパイル後の計算が速い,とは

!

人間がわかる 言葉

機械がわかる言葉に 翻訳=コンパイル

ネイティブなので 理解が早いです

Page 9: R stan導入公開版

Stanの特徴

Page 10: R stan導入公開版

RStanの導入

• パッケージとしてCRANからダウンロード・・・と行けるようになったらいいんだけど,まだ(́Д` )

• でもたった3行のコードを走らせるだけで入る。

• ただし,C++環境も同時に用意しなければならない

Page 11: R stan導入公開版

Rstanのインストール

Page 12: R stan導入公開版

必要なルートを見ててね

C++導入部Rは導入済み RStanへ

Page 13: R stan導入公開版

RStan導入 ~Windows編~

• RtoolsをRと合わせてインストールしておく必要があります。

• http://cran.r-project.org/bin/windows/Rtools/

• Rのバージョンに合わせたものをダウンロードしておくこと!

Page 14: R stan導入公開版

RStan導入 ~Windows編~

• Rtoolsをインストールするとき,「パス」の編集のステップに注意。

C++コンパイラがRtoolsに含まれていますが,「パスの編集」の時にチェックが入ってないと動かなくなっちゃいます。

Page 15: R stan導入公開版

RStan導入 ~Windows編~

• Rtoolsがちゃんと入ったかどうかのチェックをしておくと万全!>Sys.getenv(‘PATH’)

>system(‘g++ -v’) >system(‘where make’)

Page 16: R stan導入公開版

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をダウンロード&インストール

Page 17: R stan導入公開版

RStan導入 ~Luinux編~

• sudo apt-get install build-essential

Page 18: R stan導入公開版

ここからコードは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

Page 19: R stan導入公開版

ここからコードは3行• インストールには少し時間(5~30分ぐらい?)がかかります。

• これは各環境でRStanをコンパイルしながら進むからです。

• Macで警告が出ることがありますが,「この機能は使ってないから問題ないよ」by作者とのこと。

Page 20: R stan導入公開版

インストールが終わったら

• 一旦Rを終了→再起動して使います。

• あとは

Page 21: R stan導入公開版

RStanを つかってみましょう

Page 22: R stan導入公開版

サンプルを見てみる

• まずはStan公式サイトにある公式サンプルコード,eight schoolsをやってみましょう。

• 中身の説明はあとまわしで,まずRStanの挙動をみてみたいとおもいます。

Page 23: R stan導入公開版

八学校このコードをメモ帳に Copy&Pasteし,

‘8schools.stan’という ファイル名で保存

このコードを  で実行

Page 24: R stan導入公開版

八学校

何かじーっとしてると思ったら・・・

Page 25: R stan導入公開版

八学校

なんかいっぱい出た

Page 26: R stan導入公開版

で,何が起こったの?• 結果を確認してみる。

• 平均値,パーセンタイル,Rhatなどが出る。

Page 27: R stan導入公開版

で,何が起こったの?• >traceplot(fit,ask=T)

Page 28: R stan導入公開版

で,何が起こったの?• >plot(fit)

Page 29: R stan導入公開版

の使い方

Page 30: R stan導入公開版

おちついて見てみよう

• 上の部分は,リスト型のデータを作っているだけ

• 下の部分がstanという関数でstanを呼んでいる

Page 31: R stan導入公開版

おちついて見てみよう

• さらによくみると,stan関数には • stanファイル • データ    • iter    • chains

• を渡している

←おそらくstanのひみつ

←1000サンプリング(反復回数)←さっき見たN=8のデータセット

←4セットやる

Page 32: R stan導入公開版

おちついて見てみよう

←1000回サンプリング

←4セット目Warmup=Burnin

デフォルトでは サンプリング回数の 半分を当てる

Page 33: R stan導入公開版

stanファイルの構成

四つのセクションに分かれている

Page 34: R stan導入公開版

stanファイルの構成

データセクション外部から受け取るデータに対応

int(整数型)や real(実数型)などを指定 <lower=0>は非負の数,という指定(メモリ節約) 大かっこ[]はベクトルであることとそのサイズを意味する。

Page 35: R stan導入公開版

stanファイルの構成

パラメタセクション

今から組みたいモデルで使うパラメタを宣言 実数型とか,非負であるとかの指定ができる。 ベクトルで宣言したほうが効率的(後述)。 ここではmuとtauとetaを使う,としている。

Page 36: R stan導入公開版

stanファイルの構成

モデルセクションパラメタとその変換セクションで宣言したもので モデルを書く。

etaは平均0分散1の正規分布に従う,とある。 データyは平均thetaと分散sigmaに従う。 theta?

Page 37: R stan導入公開版

stanファイルの構成

パラメタ変換セクションデータとパラメタの橋渡し。 今回はthetaというパラメタを新しく作っている。 それは(mu+tau*eta[j])の別名。

これを直接モデルに書いてもいいけど,わかりやすくするために書き直している。  for文は反復を意味するC言語的表現。

Page 38: R stan導入公開版

stanファイルの構成

Page 39: R stan導入公開版

モデルと分布ここで

残差が正規分布する,ということに注目すると

左側のところは平均に関するモデルなんだから

Page 40: R stan導入公開版

モデルと分布

ほぼそのまま書いている

丁寧に全部書いたらこうなる

Page 41: R stan導入公開版

モデルと分布j回同じ式を繰り返すのは

無駄なので省略(ベクトル化)

ここがなんか長いのでtheta にまとめちゃった

Page 42: R stan導入公開版

Stanの文法• ブロックを中かっこ{}でくくる

• ブロックは6つ。全部なくてもいいけど,順番を変えちゃダメ。

• data/transformed data • parameters/transformed parameters • model • generated quantities

• コードの終わりはセミコロン;で

Page 43: R stan導入公開版

Stanの文法• data{} / transformed data{}セクション

• 外部から読み込むデータの型やサイズを宣言

• 以後の分析でデータを書き換えるのがtransdormed dataセクション • 例えばローデータを読み込んで中でCov行列に変えてから使ったりできる。

Page 44: R stan導入公開版

Stanの文法• parameters/transformed parametersセクション

• 推定するパラメタの宣言

• モデルでパラメタを書き換えるのがtransdormed parameterセクション

Page 45: R stan導入公開版

Stanの文法

• modelセクション • これがないと始まらない

• generated quantities • 推定値を変換して使いたい数字にして出力

• 例)項目反応理論の項目母数の形に変えるなど

Page 46: R stan導入公開版

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をみてね

Page 47: R stan導入公開版

Stanの文法;文• 使える確率分布の一例

• 正規分布;y~normal(mu,sigma);

• コーシー分布;y~cauchy(mu,sigma);

• 二項分布;y~binominal(N,theta);

• 逆ガンマ分布;y~inv_gamma(alpha,beta);

詳しくはstan-reference2.6.0.pdfをみてね

Page 48: R stan導入公開版

RでStanを使うとき• Rの文中にstanコードを書き入れてもいい。

~ 中略 ~

クォーテーションで括る

stan関数にコードを引き渡す時の書き方

Page 49: R stan導入公開版

RでStanを使うとき• parallelパッケージで並列化も(高速化するかな?)

8コア使った4鎖の例(Mac/Linux)

詳しくは公式サイトにhttps://github.com/stan-dev/rstan/wiki/RStan-Getting-Started

※Windowsでは書き方が少し異なります

Page 50: R stan導入公開版

実践! 世界一,二番目に簡単なRStanコード

Page 51: R stan導入公開版

分布で考える

• 従来型の統計をやってきた人にとって違和感を覚える最初のポイント

• パラメータが分布する?

• モデルがどんな分布を仮定するか誰も教えてくれなかった(どうせ正規分布なんでしょ?)

Page 52: R stan導入公開版

頻度論vsベイズ(c)岡田先生

頻度論 ベイズ

母数θ 定数 確率変数

データy 確率変数 定数

Page 53: R stan導入公開版

分布で遊んでみたら わかりやすいかも

Page 54: R stan導入公開版

世界一簡単なrstanコード

•   には様々な分布に基づいて乱数を発生させる関数が用意されている。

• 分布に基づいて発生させた乱数データで,stanが分布を推定するかどうか確かめるという遊び。

Page 55: R stan導入公開版

http://kosugitti.net/archives/4823

世界一簡単なrstanコードrstanを読み込みます

平均mu,分散sigの正規乱数に従う データをn個つくります。

Page 56: R stan導入公開版

http://kosugitti.net/archives/4823

世界一簡単なrstanコードT個のデータを読み込み,

Nとします。

推定したいパラメタは 平均と分散です。 分散は非負です。

データは正規分布, 分散はコーシーに従います

Page 57: R stan導入公開版

http://kosugitti.net/archives/4823

世界一簡単なrstanコードデータをリストで渡します

1000回サンプリングを 4セットやります。

Page 58: R stan導入公開版
Page 59: R stan導入公開版

世界一簡単なrstanコード

データ通りにでてます。

Page 60: R stan導入公開版

二番目に簡単なrstanコード

http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125

Page 61: R stan導入公開版

二番目に簡単なrstanコード

http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125

Page 62: R stan導入公開版

二番目に簡単なrstanコード

http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125

Page 63: R stan導入公開版
Page 64: R stan導入公開版

最尤推定との比較

Page 65: R stan導入公開版

Tips• alpha,betaに事前分布を置いてやるとなお良い

• stanは明示的に事前分布を指定しないと,一様分布を当てはめる

Page 66: R stan導入公開版

慣れてきたでしょうか?

Page 67: R stan導入公開版

世界一簡単な 収束しないrstanコード

• 逆にどういうことをしたら収束しないのか?というのを知るのもいい勉強になる。

http://goo.gl/ZafBgX

例1

Page 68: R stan導入公開版

世界一簡単な 収束しないrstanコード

http://goo.gl/ZafBgX

例2

Page 69: R stan導入公開版
Page 70: R stan導入公開版

stanの恩恵

• 分布を考える,初期値をうまく置くなど,確かにコツがいることは否定できない。

• しかし,考えることがかなり少なくて済むようになったこと喜ぼう。

• stanは対数尤度関数を書かなくても良い!

Page 71: R stan導入公開版

ex)回帰分析の最尤法

http://goo.gl/5LY9N9

NY

i=1

1p2⇡�2

exp(� ei

2�2)

N

2

log(2⇡�2)� 1

2�2

NX

i=1

e2i

尤度

対数尤度

そのまま 書ける

Page 72: R stan導入公開版

書きたくない• これで許してくれる

これはすごいことです。

Page 73: R stan導入公開版

Enjoy ! and

“ねえちゃん,明日って,今さ!”