RでStanを始めてみる


このエントリーをはてなブックマークに追加

Logics of Blue | 統計分析や統計的予測・意思決定理論など

統計学の勉強をしていて次に下記をやることに

Stanによるベイズ推定の基礎 | Logics of Blue

RからStanを使う例なのだが、Stanの導入が必要らしいのでインストールしてちょっと動かすまでやってみた

2017年11月現在で、構築した環境はMacでおこなった

  • Mac OSX Sierra 10.12.6
  • R version 3.3.3 (2017-03-06)



Stanのインストール


Stan本体が必要なのでインストールする

公式の日本語訳があるので参考にした(一部英語しか情報がない部分もある)

RStan Getting Started (Japanese) · stan-dev/rstan Wiki

R studioは以前ダウンロードしていたので説明割愛

R言語と統計学学習メモ | ぬわーーーーーーー!!!

使用しているRのバージョンをR studioのコンソールで確認, バージョン 3.3.3 みたい
(3.0.2より古いと、RStanがそもそも使えないらしい)

1
2
3
4
5
6
7
8
9
10
11
12
13
> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.6
locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_3.3.3

で、それ以外に必要なのが g++ のコンパイラ

Macだとデフォルトで入ってるはず(たぶん)

ためしに、Rからg++が呼び出せるかやってみる

1
2
3
4
5
6
7
> system('g++ -v')
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

これたぶんターミナルでやった結果と同じなので大丈夫っぽい

1
2
3
4
5
6
7
$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin


とりあえず必要なものはそろってるみたいなので次に進む


コンパイラのカスタマイズ


必須ではないが、RStanを使う時にコンパイラのカスタマイズを行っていると

速度が早くなる?などするので推奨設定らしい

方法は Installing RStan on Mac or Linux · stan-dev/rstan Wiki 参照

途中わからなかったので下記も参考に

Google Cloud PlatformのRにRStanをインストールする - yoshidk6’s blog


適当なディレクトリに下記Rファイルを作る

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR)) dir.create(dotR)
M <- file.path(dotR, "Makevars")
if (!file.exists(M)) file.create(M)
cat("\nCXXFLAGS=-O3 -mtune=native -march=native -Wno-unused-variable -Wno-unused-function",
file = M, sep = "\n", append = TRUE)
# Macの場合でg++のバージョンが4.9以上だったら下記も必要, 自分は4.2.1だったのでコメントアウトした
# cat("\nCXXFLAGS+=-flto -ffat-lto-objects -Wno-unused-local-typedefs",
# file = M, sep = "\n", append = TRUE)
# 下記はc++がインストールされていない場合は実行する、自分は不要だったのでコメントアウトした
# cat("\nCC=clang", "CXX=clang++ -arch x86_64 -ftemplate-depth-256",
# file = M, sep = "\n", append = TRUE)
# g++ version6以上で、Stanに関係ないwarningを無効にしたい場合は実行する、とりあえず実行してみた
cat("\nCXXFLAGS += -Wno-ignored-attributes -Wno-deprecated-declarations",
file = M, sep = "\n", append = TRUE)


実行すると .R ディレクトリが HOME ディレクトリに作成されて、中に Makevars ファイルが作成される

ターミナルで確認できる

1
2
3
4
5
$ cat ~/.R/Makevars
CXXFLAGS=-O3 -mtune=native -march=native -Wno-unused-variable -Wno-unused-function
CXXFLAGS += -Wno-ignored-attributes -Wno-deprecated-declarations

ということはなんか設定が間違っててもこのファイルを削除すればよいだけっぽい


設定が出来たので次にRStanをインストールする


RStanのインストール


以下のコマンドをRstudioのコンソールで実行する

1
> install.packages('rstan', repos='https://cloud.r-project.org/', dependencies=TRUE)

うまくいったっぽい

万が一うまくいかない場合はソースからインストールも試してみるとよいかもとのこと、自分は下記は実行しなかったが

念のため記載しておく

1
2
3
# 注:以下の「4」をビルドに使いたいコア数に置き換えてください
> Sys.setenv(MAKEFLAGS = "-j4")
> install.packages("rstan", type = "source")

インストールしたらRを再起動する


再起動後、以下コードが動くかRstudioのコンソールで試してみる

1
2
3
4
5
6
7
8
fx <- inline::cxxfunction( signature(x = "integer", y = "numeric" ) , '
return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ;
')
fx( 2L, 5 ) # 10になるはずです
# 以下が出力されたら成功
# [1] 10

動いた!

動くみたいなので、ライブラリの読み込みやってみても大丈夫そう、コンソールで試すと以下のようになった


1
2
3
4
5
6
7
> library(rstan)
要求されたパッケージ ggplot2 をロード中です
要求されたパッケージ StanHeaders をロード中です
rstan (Version 2.16.2, packaged: 2017-07-03 09:24:58 UTC, GitRev: 2e1f913d3ca3)
For execution on a local, multicore CPU with excess RAM we recommend calling
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())


これでRStanを使う準備は整った



実際に使ってみる


公式のインストールの続きに簡単なデモもあったのでやってみる

stanファイルを使う、コーディングはsublime textで行った

dougalsutherland/sublime-stan: Syntax definition for the Stan modeling language in Sublime Text

以下stanファイルを `8schools.stan` の名前で 適当なディレクトリに作成した

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
data {
int<lower=0> J; // 学校の数
real y[J]; // 推定されている教育の効果
real<lower=0> sigma[J]; // 教育の効果の標準誤差
}
parameters {
real mu;
real<lower=0> tau;
real eta[J];
}
transformed parameters {
real theta[J];
for (j in 1:J)
theta[j] = mu + tau * eta[j];
}
model {
target += normal_lpdf(eta | 0, 1);
target += normal_lpdf(y | theta, sigma);
}


Rのコードは下記、10行目の fit <- stan(file = '/path/to/8schools.stan', data = schools_dat, iter = 1000, chains = 4)

の部分の 8schools.stan があるファイルのパスは自分で設置したディレクトリを指定すること

わからなかったら、stanファイルもRのファイルもデスクトップに設置して

file = '~/Desktop/8schools.stan' とすればよいかと

1
2
3
4
5
6
7
8
9
10
library(rstan)
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())
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 <- stan(file = '/path/to/8schools.stan', data = schools_dat, iter = 1000, chains = 4)


この時点では実行してみると下記警告が出るけどなんかよくわからないのと一応動くのでこの時点では無視

1
2
3
4
警告メッセージ:
1: There were 1 divergent transitions after warmup. Increasing adapt_delta above 0.8 may help. See
http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
2: Examine the pairs() plot to diagnose sampling problems


ここまできたらとりあえずplotpairs で可視化できる

1
2
> plot(fit)
> pairs(fit, pars = c("mu", "tau", "lp__"))

図示まで出来たら成功、あとは色々使ってみる


このエントリーをはてなブックマークに追加