Posted by & filed under PC, コンピュータ関連, 分析, 未分類.


いいから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については…そのうちやります。

Leave a Reply

  • (will not be published)