Rで状態空間モデル(環境構築編)

統計分析、特に時系列分析についていろいろな手法を調べてると、状態空間モデルに辿り着くことが多いと思います。

状態空間モデルって何?という方はこちらの素晴らしいサイトをご参照ください。
(調べている間に何度も登場したはずです。)

logics-of-blue.com

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を通します。先程のリンク先にも記載がありますが、以下では別の方法での手順を記載します。

  1. Windowsの検索バーで「環境変数の編集」と入力し、出てきたものをクリック
  2. ユーザー環境変数のPathをクリック
  3. 編集をクリック
  4. 新規をクリックし、「C:\Rtool\bin」を入力
  5. さらに新規をクリックし、「C:\Rtool\mingw_64\bin」を入力
  6. OKをクリック

これでPathが通ります。
Pathがきちんと通っているかはRで確認できます。

Sys.getenv("PATH")

返ってきた文字列に先程追加したPathが含まれていれば成功。
続いてPathの先のコンパイラを認識してくれているかを確認します。

system("g++ -v")

最後にgcc version x.x.xと返ってこれば成功。
なお、別でPythonを先にインストールしていると、別バージョンのgccコンパイラが入っており、Rがそっちを認識してしまう可能性があるそう。
その場合は不要なPathを削除する必要があるのですが、今回は発生しなかったので詳細はTJOさんのブログをご参照ください。

tjo.hatenablog.com

パッケージのインストール

続いて必要なパッケージをインストールします。

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で同じような問題を抱えている人がいたが結局解決したのだろうか。。。
最後の解決方法は草。でもこれが真理なんですかねえ。

あれもできたしこれも確認したのになぜ!と思って色々調べたが原因がわからない。このあたりから英語のページも読み漁るようになりました。

そして辿り着いたのかこのページ

discourse.mc-stan.org

github.com

パスにスペースがあって会社のルールで変えられないと。自分と全く同じ状況。

どうやらソースからインストールしなおしてみ?ということらしいです。

パッケージインストールとソースインストールの違いはこちらの方のご説明がわかりやすいです。

www.cloudnotes.tech

そして書かれている通りにやってみると。。。

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

減った!

しかし残り一つが解消せず。ほかのサイトを漁ったりいろんなパッケージの削除とインストールを繰り返したりしていました。

解決

もう一度先程のサイトを目を皿にして読み込んでみると、

f:id:dataspirits:20200612184327p:plain
神の投稿

ん?古いバージョンを参照しないといけないのに最後に記載しているのをそのままやると最新になるような。。。

念のため、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を買いましょう

コメント

運営者

データ分析やモデル等の仕事をしてる人々。週に1回程度のペースで金融や統計に関する記事を更新しています。
C++/Python/R/SAS/HTML/VBA/PHP/SQL

naruseをフォローする
タイトルとURLをコピーしました