統計分析、特に時系列分析についていろいろな手法を調べてると、状態空間モデルに辿り着くことが多いと思います。
状態空間モデルって何?という方はこちらの素晴らしいサイトをご参照ください。
(調べている間に何度も登場したはずです。)
Rで状態空間モデルのパラメータ推定をする場合、いくつかパッケージがあるのですが、dlm(Dynamic Linear Models)、KFAS(Kalman Filter and Smoother)等のライブラリを使用する方法と、Stanというソフトと組み合わせてMCMCサンプリングをするという方法があります。
前者はR Console等にinstall.packages("dlm")
でインストールし、library(dlm)
とすれば簡単に使用することができるのですが、後者は環境構築がやや面倒です。
で、Windowの環境によっては本やググって出てくるサイトに従って手順を進めてもうまくいかなかったりします。というか私が実際にそうで、自分のPCでは難なく環境構築できたのですが、会社のPCではかなり苦労しました。。。
先程のサイトの馬場先生はじめ多くの方々がMCMCを実行するまでの手順を公開されているのですが、結局私は日本語のページを参照するだけでは問題点が解決しなかったので、備忘の意味も込めて手順を残しておくことにします。
構築前の環境
はじめにOSとRのバージョンを記載しておきます。
- Windows10(64bit)
- R x64 3.5.3
PCのスペックはWindows10の場合、スタート→設定→システム→バージョン情報で確認できます。
RのバージョンはR Consoleに次のコマンドを入力することで確認できます。
R.version
で、Rがどこに保存されているかが重要なのですが、会社PCのRはインストール先が指定されており、
Pathには”スペース”が含まれていました。これがのちに悲劇を生むことに。。。
個人のPCの場合はRのインストール先を自由に選べるはずなので、C:/の直下に保存するか、Pathにスペースが
含まれない場所に保存することを強くお勧めします。
なお以下の手順でPathにスペースが含まれる場合も対応できるようになっているので、なんらかの
理由でそのような状態になってしまった場合はご参照ください。
Rtoolsのインストール
RでMCMCサンプリングをする場合には、rstanというライブラリを使用するのですが、これは単独では動かすことができません。
stanコードで書かれたモデルをコンパイルする必要があり、C++のコンパイラが含まれたRtoolsをインストールしなければなりません。
RtoolsはR内で動くlibraryではないため、R Consoleにコマンドを打ち込んでダウンロードするのではなく、こちらのリンクからダウンロードをします。
ただし、リンク先に赤字で記載のある通り、Rのバージョンに合ったものをダウンロードしてください。
私の場合はRのバージョンが3.5.3なので、Rtools35.exeをダウンロードしました。
(最初ちゃんと読んでいなくてRtool40をダウンロードしたうえ後述のPathを通してしまったので修正が面倒でした。。。)
インストール先ですが、こちらはRと違い自由に選べたので、C:/の直下に保存しました。多くの方がそうしているようです。
Pathを通す
さて、Rtoolsをインストールしたあとには必ず「Pathを通す」という作業が必要です。
これは、動かしたいソフトがどこにあるのかをPCに予め教えてあげるようなものです。
多くのサイトではインストール時にチェックボックスにチェックを入れることで自動的にPathを通してくれるということで詳しくは書かれていないようなのですが、Rtools35のバージョンではインストール時にチェックボックスがありませんでした。ちなみにRtools40でも同様でした。
そこで手動でPathを通します。先程のリンク先にも記載がありますが、以下では別の方法での手順を記載します。
- Windowsの検索バーで「環境変数の編集」と入力し、出てきたものをクリック
- ユーザー環境変数のPathをクリック
- 編集をクリック
- 新規をクリックし、「C:\Rtool\bin」を入力
- さらに新規をクリックし、「C:\Rtool\mingw_64\bin」を入力
- OKをクリック
これでPathが通ります。
Pathがきちんと通っているかはRで確認できます。
Sys.getenv("PATH")
返ってきた文字列に先程追加したPathが含まれていれば成功。
続いてPathの先のコンパイラを認識してくれているかを確認します。
system("g++ -v")
最後にgcc version x.x.xと返ってこれば成功。
なお、別でPythonを先にインストールしていると、別バージョンのgccコンパイラが入っており、Rがそっちを認識してしまう可能性があるそう。
その場合は不要なPathを削除する必要があるのですが、今回は発生しなかったので詳細はTJOさんのブログをご参照ください。
パッケージのインストール
続いて必要なパッケージをインストールします。
install.packages("rstan", dependencies = TRUE)
dependencies = TRUEにすることで依存関係のあるパッケージも一緒にインストールしてくれるので楽です。
動かしてみる
いよいよMCMCだ!ということで馬場先生のコードを真似して動かしてみるが。。。
Error in compileCode(f, code, language = language, verbose = verbose) : Compilation ERROR, function(s)/method(s) not created!
g++.exe: error: (保存先のパス)/R/R-3.5.3/library/StanHeaders/include/stan/math/prim/mat/fun/Eigen.hpp: No such file or directory
g++.exe: error: (保存先のパス)/R/R-3.5.3/library/StanHeaders/include: No such file or directory
g++.exe: error: (保存先のパス)/R/R-3.5.3/library/RcppEigen/include: No such file or directory make:
。。。なんで?
テストした時は問題なかったはずなのに。テストがうまくいけばOKてみんな言ってるのに。
どうやら保存先のパスがスペースの後から始まっているのを見る限りスペースのせいに見える。でもどう対処したらいいかわからない。
試行錯誤いろいろ
これはちゃんとTRUEで返ってくる。
pkgbuild::has_build_tools(debug = TRUE)
これもやってみました。ダメ。
yoshidk6.hatenablog.com
1年ほど前のtwitterで同じような問題を抱えている人がいたが結局解決したのだろうか。。。
最後の解決方法は草。でもこれが真理なんですかねえ。
Rおじさーーーん!
Error in compileCode(f, code, language = language, verbose = verbose) : Compilation ERROR, function(s)/method(s) not created! sh: g++: command not found make: *** [C:/PROGRA~1/R/R-36~1.0/etc/x64/Makeconf:215: file290011de6367.o] Error 127 https://t.co/bz12ragR6J— たけみわ (@takemiwa) May 30, 2019
あれもできたしこれも確認したのになぜ!と思って色々調べたが原因がわからない。このあたりから英語のページも読み漁るようになりました。
そして辿り着いたのかこのページ
パスにスペースがあって会社のルールで変えられないと。自分と全く同じ状況。
どうやらソースからインストールしなおしてみ?ということらしいです。
パッケージインストールとソースインストールの違いはこちらの方のご説明がわかりやすいです。
そして書かれている通りにやってみると。。。
Error in compileCode(f, code, language = language, verbose = verbose) : Compilation ERROR, function(s)/method(s) not created!
g++.exe: error: (保存先のパス)/R/R-3.5.3/library/StanHeaders/include/stan/math/prim/mat/fun/Eigen.hpp: No such file or directory
減った!
しかし残り一つが解消せず。ほかのサイトを漁ったりいろんなパッケージの削除とインストールを繰り返したりしていました。
解決
もう一度先程のサイトを目を皿にして読み込んでみると、

ん?古いバージョンを参照しないといけないのに最後に記載しているのをそのままやると最新になるような。。。
念のため、StanHeadersのバージョンを確認してみると、
packageVersion("StanHeaders") >"2.21.0"
あかんやん!
というわけで古いバージョンを指定したうえでソースファイルをダウンロードします。
install.packages("https://cran.r-project.org/src/contrib/Archive/StanHeaders/StanHeaders_2.19.2.tar.gz",repos=NULL,type="source")
動かしてみると。。。いけた!
まとめ
- フォルダパスにはスペースを含まないようにしましょう
- いろんなサイトを参考にしてちゃんと読みましょう
- Macを買いましょう
コメント