知らない人には何のこっちゃというタイトルでしょうが、端的に表現するとこうなります。
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!
2件のコメント
コメントは受け付けていません。