OS X 10.9.2のR3.1.0にrstan2.2.0を入れる

知らない人には何のこっちゃというタイトルでしょうが、端的に表現するとこうなります。

R3.1.0 Spring Danceがさる4/10に公開されて,喜び勇んでいれたはいいけど,そこそこでかいアップデートなのでパッケージの入れ直しが必要なのです。で,MCMCに必要なStanをRからあつかうrstanパッケージをインストールしよう,というところで今日は色々時間がかかってしまった。でも問題解決したので,備忘録代わりに記録しておきます。

 

まず,rstanパッケージを入れるには,普通にCRANから選んでいれるんじゃなくて、自分の環境でソースファイルからくみ上げないと行けない,というのが現状。そのうちバイナリも提供してくれるかもしれないけど,今しばらくはそうならないので,頑張っていれるしかない。ちなみに,そのために準備するものとしてC++コンパイラが必要で,マカーはXcodeとXcode  Comman Line Toolsも必要。XcodeはApp Storeから,Command Line Toolsのいれかたはこちらのサイトを参照するといいです。

当方,OS X 10.9.2,Xcodeもこないだアップデートがあって,今試した環境はXcode 5.1.1です。

インストールの詳しい方法は,Stanのホームページから Download and Get Startedへ移動して,中に書いてあるのをしっかり読んで追いかければオッケー。

なんだけど,ちょっとトラップが。これはRの方の話なんだけど,rstanにはRcppとinlineパッケージもいるので,この二つをCRANからとってこないといけない。普通にinstall.packagesで行きたいところなんだけど,実はこの後のrstanのコードをコンパイルするときにRcppの挙動が問題になるようで,Rcppパッケージもソースから,自分の環境でコンパイルしないといけない(これをせずにやるとRが飛んでいくようになってしまう)。これは多分R3.1.0とRcppパッケージの間の問題なので,そのうち解決されるようになるかも,だけど,4/16のrstanMLでのやり取りではRcppを自分でコンパイルしたらいけるぜー,としか書いてない(明確な解決法の指示がない)ので,今しばらくは従うべし。

ソースからインストールしたことなんかねえよ,という人でも(Xcode等の環境を整えた上で)R上で

install.packages("Rcpp",type="source")

とするだけだから,そんなに心配しなくていいよー(というかこの後の方が面倒だw)。

Rcpp,inlineライブラリとCコンパイラがちゃんと整っているかどうかを確認するためには,次のコードを実行すればよい(とrstanのサイトにも書いてある)。

library(inline)
library(Rcpp)
src <- '
std::vector<std::string> 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')

これでhello worldとコンソールに示されたら、準備OKってことです。

ちなみに,既にrstanパッケージがあって,書き換える・やり直す場合は,次の数行を実行しておきましょうぞ。これで取り外せますからな。

library(rstan)
set_cppo('fast')
detach("package:rstan", unload = TRUE)
remove.packages('rstan')

さて,ここからrstanパッケージを作っていきたいんだけど,環境を整えるファイル,Makevarsを”~/.R/”に作らないといけない。一般的なユーザーにとっては,不可視フォルダからテキストファイルを作らないといけないので,少しハードルが高く感じるかも。私はMagicanというmac環境を整えるアプリを愛用していて,このソフトの「パラメタ>Finder」から不可視ファイルの表示,Rootからの表示にチェックを入れて,見えないところも見えるようにし,ルートディレクトリのすぐ下に.Rフォルダ,その中にエディタmiでMakevarsファイルを作る・・・という手法でやりました。

でも,これも簡略化されたやり方があって,上のやり方がよくわかんない,という人はR上で

if (!file.exists("~/.R/Makevars")) {
cat('CXX=g++ -arch x86_64 -ftemplate-depth-256 -stdlib=libstdc++\n
CXXFLAGS="-mtune=native -O3 -Wall -pedantic -Wconversion"\n',
file="~/.R/Makevars");
} else {
file.show("~/.R/Makevars");
}

とすればいいです。これはRがその場所に設定ファイルを作るプログラムになってます。もし既にMakevarsファイルがあったら,その内容が表示される仕組み。

このファイルを作り終わったら、後は簡単で,次の二行を実行するとなにやら色々作業が始まるのでlす。

options(repos = c(getOption("repos"), rstan = "http://wiki.rstan-repo.googlecode.com/git/"))
install.packages('rstan', type = 'source')

ネットからソースコードをとってきてコンパイルするので,ネット環境は必須ね。しかも,作成にはちょっとばかり時間がかかるし,その中で合計6つぐらいの警告が赤字で出るから、大丈夫かよこれ、と思いながら進めることになります。でも,警告なので多分大丈夫で,最後に「DONE(rstan)」と出ればパッケージができたってこと!

あとは一旦Rの再起動をして,eight schoolsなどのサンプルコードを走らせてみたらいいんじゃないかな。多分,ベクトル演算で素早くなったMCMCの世界がやってきます。

ミソはRcppも自分でコンパイルする必要がある,ってところだったよ。それを知らなかったから,rstanは作れるんだけどサンプルコードを走らせている最中に飛んでいくとか,「EXPECTATION FAILURE LOCATION:」ってエラーが出て,もう何度か泣きそうになりました。

まだrstanを使ってみようと思っているMac Userは国内では少ないだろうけど,何かの足しになるかと思って記事にしました。

 

追伸 なんでrstanを入れたかというと,「ベイズ推定による多変量解析入門」ってので話す必要があって,MCMCpackだけじゃ面白くないかもな,とちょっと思ったからです。研究会の方も,よろしければご参加どうぞ。

さらに追記)2014.06.15 Ubuntu14.04に入れたい場合はこちらの記事をどうぞ。Thank you @kaztan!

日記
安定した環境を!

MacOS新しいのが出ましたね。Catalina ですか。Sidecarを試してみたくて、自宅のマシ …

日記
教え子の結婚式でした

山大の頃の院生さん、卒業(修了)してから音沙汰がなかったが、ある日突然メールしてきて「結婚するので式 …

日記
息子の期待値

息子は小学5年生である。お小遣いは500円/月である。 iPhoneアプリで「ルーレット」というのが …