RStan on Windowsをはじめよう

Table of Contents

Stanについて

Stanは統計モデリングでの活用を目的とした確率的プログラミング言語です.RStanはStanのR用のパッケージで,他にPython用のパッケージである,PyStanもあります.Googleで検索ヒット件数を確認すると,2018年1月23日現在で,RStanが34,700件,PyStanが8,180件とRStanの方が情報が多そうです.また,参考図書として,松浦(2016)「StanとRでベイズ統計モデリング(共立出版)」が秀逸で(ここで紹介),サポートページではコードや結果がダウンロードできますので,RStanの方が敷居が低そうです.もっとも,Stanコード自体は共通ですので,PyStanへの移行も難しくないのではないかと思われます.
Stan以外の確率的プログラミング言語にはWinBUGS(Windows専用),JAGS等があるようで,これらの方が古くからあり,ユーザも多いようです.この中で,Stanは比較的新しいもので,現在も精力的に開発が進められているようです.個人的には比較検討をしたことがないのですが,松浦(2016)を読んだ印象から,Stanを始めてみることにしました.なお,確率的プログラミング言語を一つ覚えれば他への移行は容易のようです.

RStan on Windowsのインストール

RStanのインストール情報は本家のサイトを参考にするとよいでしょう.R for Windowsの最新版がインストールされていることを前提とします.
RStudio Desktop Open sourceのインストーラーをこちらからダウンロードし,ダブルクリックでデフォルトのままインストールします.

Rtoolsのインストール

RStanでは統計モデルをC++でコンパイルするため,C++コンパイラが必要で,WindowsではRtoolsを使います.最新のR 3.4.3 for Windowsをインストールしましたので,本家のサイトからこれをサポートしている(要は最新の)ものをダウンロードしましょう.
続いてダブルクリックでインストールを開始します.途中で追加タスクの選択が現れますが,これはRからC++コンパイラを使えるようにするため,PATHを追加するものです.下図のようにチェックを入れます.

インストールが終わりましたら,Rからg++を呼び出せるか,チェックします.Rを起動し,Rコンソールで[cci]system('g++ -v')[/cci]のように入力します.すると,多くのPATHが表示され,最後にgccのバージョンが表示されれば成功です.
[cc]
> system('g++ -v')
Using built-in specs.
COLLECT_GCC=c:\Rtools\mingw_32\bin\G__~1.EXE
COLLECT_LTO_WRAPPER=c:/Rtools/mingw_32/bin/../libexec/gcc/i686-w64-mingw32/4.9.3/lto-wrapper.exe
Target: i686-w64-mingw32

途中省略

gcc version 4.9.3 (i686-posix-dwarf, Built by MinGW-W64 project)
[/cc]

RStanのインストール

Rを起動し,R Consoleで以下のように入力し,実行します.
[cc]
> install.packages('rstan', repos='https://cloud.r-project.org/', dependencies=TRUE)
[/cc]
これは多少時間がかかります.終わったら,Rを再起動し,以下を実行して,C++が動くことを確認します.
[cc]
> fx <- inline::cxxfunction( signature(x = "integer", y = "numeric" ) , ' return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ; ') > fx( 2L, 5 ) # 10になるはずです
[1] 10
[/cc]
うまくいきました.
ちなみにパッケージxxxを削除する方法は以下の通りです.
[cc]
> remove.packages("xxx")
[/cc]

RStanの使用方法

本家のRStan Getting Started(の和訳)に従って,試していきます.

RStanのload

パッケージ名はすべて小文字で「rstan」です.[cci]library(rstan)[/cci]でrstanをloadします.
[cc]
> library(rstan)
[/cc]
load時のメッセージの通り,マルチコアCPUで(だいたいそうですね),十分なメモリがあるなら,以下のようにするのが推奨されています.しかし,デバッグが難しくなることもあるようですので,高速化が必要になったときに適用するのがよいでしょう.
[cc]
> options(mc.cores = parallel::detectCores())
[/cc]
Stanコードに変更がないときに再コンパイルを抑制するため,以下が推奨されています.
[cc]
> rstan_options(auto_write = TRUE)
[/cc]
実際,コンパイルにはかなり時間がかかりますので,これは重要です.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください