こんにちは。
自分用にcmdstanrを使うときの諸々のTipsを随時更新していきます。
環境
WindowsからWSLでRstudio Serverからcmdstanrを動かすことを想定。
普段はrstanを使用。
cmdstanrのiterationの指定がrstanと異なる
rstanは、warmupを含む反復回数をiterとして指定
cmdstanrは、warmupを含まない(after warmup)をnum_sumplesとして指定(JAGS等と同一)
cmdstanrの推定結果(stan_csv)の保存先を変えたい
cmdstanrのsample()のオプションでoutput_dirを指定する
WindowsとWSL間でファイルのやりとりがしたい
cmdstanrそのものと関係ありませんが、次の記事を参考にしました。
https://qiita.com/quzq/items/1
(Windows → WSL) のやりとりをしたい
想定例:WSLに保存した分析結果にアクセスしたい
以下のパスからアクセス可能。
//wsl$
なので、WSLのRstudio Server内のファイルへのアクセスは例えば以下から。
//wsl$/Ubuntu-18.04/home/rstudio
(WSL → Windows) のやりとりをしたい
想定例:WSLのRstudio Serverでの分析結果を直接Windowsに保存したい
以下のパス指定で可能(dドライブへのパスの場合)
/mnt/d/
例えば、デスクトップにggplotの図を保存したい。
ggsave(filename = "/mnt/c/Users/dhojo/Desktop/demo.png")
※指定の際のポイントは、ドライブの文字は小文字じゃないとうまくいかない
※先述のoutput_dirと組み合わせれば、推定結果をWindowsに保存可能だと。
デフォルトでwarmup情報は保持されない。
save_warmup = FALSEがデフォルトなので、必要に応じてこのオプションをTRUEとする。
vbの動作方法
コンパイルしたモデルのオブジェクトにvariationalをつける
例
model <- cmdstanr::cmdstan_model("demo.stan")
fit_vb <- model$variational
== 2020/04/29 追加 ==
MCMCサンプルを取り出したい(rstan::extractをしたい)
$draws()で取り出せる。
fit$draws
> fit$draws() # A draws_array: 250 iterations, 4 chains, and 641 variables , , variable = lp__ chain iteration 1 2 3 4 1 -3790 -3797 -3837 -3816 2 -3786 -3786 -3813 -3784 3 -3794 -3788 -3809 -3781 4 -3822 -3789 -3803 -3781 5 -3828 -3811 -3798 -3805 , , variable = theta[1,1] chain iteration 1 2 3 4 1 0.725 0.448 0.849 1.06 2 0.261 -0.176 0.625 0.12
...
fit.vb$draws> fit_vb$draws() # A draws_matrix: 1000 draws, and 642 variables variable draw lp__ lp_approx__ theta[1,1] theta[2,1] theta[3,1] theta[4,1] 1 -3936 -306 -0.101 0.657 -0.095 -1.08 2 -3861 -240 0.218 -0.866 0.602 0.55 3 -3890 -260 0.390 0.189 0.865 -0.46 4 -3896 -268 -0.462 -1.276 -0.112 -0.23 5 -3910 -274 -0.179 -1.564 0.194 0.72 6 -3906 -281 0.167 -0.087 -0.710 -0.85 7 -3909 -271 0.453 -0.735 -0.389 -1.21
...
==2020/05/01追記==
bridgesamplingパッケージを使いたい
現状、cmdstanrのオブジェクトそのままでは使えない?と思うので、
以下の要領で使えるようにする。
1.warmup情報を保存しておく
上記に書いたとおり、warmup保存オプションを書いておく。
> save_warmup = TRUE
2.rstan::stan()でモデルを空回しする
1.の準備を行っても、「モデルが妥当ではない」という旨のエラーをはかれるので、
## 事前に
## fit_cmdstan <- rstan::read_stan_csv(fit$output_files())
## をしておく。
fit_rstan <- rstan::stan("hoge.stan",data,iter=0)
bridgesampling::bridge_sampler(fit_cmdstan,fit_rstan)
これで一応回る。
ただ、これだと結局rstanでモデルのコンパイルをすることになります笑
まぁ、モデル評価の時ぐらいはコンパイル時間を待ちましょうかね!
また、随時追加します。
参考:
https://qiita.com/quzq/items/1096c638c0d86795be13
https://mc-stan.org/cmdstanr/reference/cmdstanr-package.html