いいからMCMCだ!!
というわけで、R上でMCMCを実行したいと思ったのでやってみました。
なんか入れるのが難しいって聞いていたけどものすごくあっさりだったので拍子抜けです。
環境
- OS: Ubuntu14.04
- R: 3.1.0
- RStan: 2.2.0
参考サイト
基本的にRStan Getting Startedの情報で大丈夫です。Macでのインストールについては、小杉先生のブログのこちらの記事に詳しく記載してあります。
事前の注意点
- C++コンパイラ
- Stanはマシン内にC++コンパイラが必要です。Ubuntu14.04ならば多分大丈夫。もしないならUbuntuに
build-essential
をaptしてください。 - Rのバージョン
- R2.15.1以降に対応しているので、これより以前のバージョンだったらあげておく。
- Rのパッケージ
- Rの’inline’パッケージと’Rcpp’パッケージが必要です。特にRcppパッケージは最新のバージョンにアップデートしてください。どうもインストールに躓いている人の多くはこのあたりです。
必要パッケージのインストール
Rを起動して、上述の2つのパッケージをインストールしてください
install.packages('inline')
install.packages('Rcpp')
RcppパッケージはRでC++を読むためのもので、これを入れておくとdplyrパッケージなどもインストールできるようになります。ただし、Rcppパッケージが古いままだといろいろうまく行かない場面が出てくるので、パッケージ管理はちゃんとしましょう。なおRStan2.2.0はRcppの0.10.3より下のバージョンではうまく行かないようです。
C++コンパイラの動作確認
R上でC++コンパイラが動作するかどうかをチェックしてください。ここではRStan Getting Startedに記載されていたテストコードを貼り付けておきます。
# 必要なパッケージの読み込み
library(inline)
library(Rcpp)
# C++のコードをsrcに格納
src <- '
std::vector s;
s.push_back("hello");
s.push_back("world");
return Rcpp::wrap(s);
'
# 実行させる
hellofun <- cxxfunction(body = src, includes = '', plugin = 'Rcpp', verbose = FALSE)
cat(hellofun(), '\n')
実のところC++おべんきょしてないので中身はあまり把握できてないです…が、大体の内容はつかめるはずです。これを実行してHello world
が出たらOKです。次に行きましょう。
RStanのインストール
以下のことを確認・実行していきましょう。
古いrstanパッケージを除く
もし古いrstanパッケージを入れている場合には、それを取り除く必要があります。以下のコードを実行してください。
library(rstan)
set_cppo('fast') # モード切り替え
detach("package:rstan", unload = TRUE)
remove.packages('rstan')
もしrstanをまだ入れたことがないというケースでしたら、ここは飛ばして次へ。
RStanのインストール
2014年6月12日現在、CRANにはRStanがありませんので、ソースコードをオンラインで取得してインストールする必要があります。以下のコードを実行してください。
options(repos = c(getOption("repos"), rstan = "http://wiki.rstan-repo.googlecode.com/git/"))
install.packages('rstan', type = 'source')
最近はパッケージのコードをgitで管理するってパターン多いですね。完了にはちょっと時間かかりますが我慢してください。このくらい我慢できなくてはMCMCは耐えられないと思います。
RStanの実行テスト
インストールが完了したら実行してみましょう。
rstan最適化レベルの設定
rstanにはモードがあるようで、それを切り替えるのがrstanパッケージのset_cppo()関数のようです。コード実行時にはfast
モードでするといいようです。切り替えるには以下のコードを実行します。
library(rstan)
set_cppo("fast")
また、デバックを簡単にするには、debug
モードがいいようです。切り替えるには以下のコードを実行します。
library(rstan)
set_cppo('debug')
基本的にはfast
モードでいいようです。なお、一度モードを切り替えたら、他のモードに切り替えない限りそのモードが有効になっているそうです。だからdebug
モードからfast
モードへ戻すのを忘れないように、とのことです。詳しくはStanの(分厚い)ドキュメントを参照してください。
テストコードの実行
テストコードとして、RStan Getting StartedのExample1を実行してみます。
# stanのモデルコードを記述してschools_codeへ格納
schools_code <- '
data {
int J; // number of schools
real y[J]; // estimated treatment effects
real sigma[J]; // s.e. of effect estimates
}
parameters {
real mu;
real tau;
real eta[J];
}
transformed parameters {
real theta[J];
for (j in 1:J)
theta[j] <- mu + tau * eta[j];
}
model {
eta ~ normal(0, 1);
y ~ normal(theta, sigma);
}
'
# 使用するサンプルデータをschools_datへ格納
schools_dat <- list(J = 8,
y = c(28, 8, -3, 7, -1, 1, 18, 12),
sigma = c(15, 10, 16, 11, 9, 11, 10, 18))
# モデルコードを元にデータから実行し、結果をfitに入れる
fit <- stan(model_code = schools_code, data = schools_dat,
iter = 1000, chains = 4)
これで実行されます。出力はfit
に格納されているので、内容は確認してください。
さいごに
これはあくまでUbuntuでの導入方法です…が、基本的にMacでもWinでも同じような流れとなります。ポイントはC++コンパイラで、これがRから回せればクリアとなります。Macでのインストールについては、小杉先生のブログのこちらの記事に詳しく記載してあります。Windowsについては…そのうちやります。