r stan導入公開版

Post on 15-Jul-2015

4.583 Views

Category:

Education

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

1p2⇡�2

exp(� ei

2�2)

N

2

log(2⇡�2)� 1

2�2

NX

i=1

e2i

尤度

対数尤度

そのまま 書ける

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

これはすごいことです。

Enjoy ! and

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

top related