PsyStat.

Just for fun.

【Tips】cmdstanr使うときの諸々

こんにちは。

自分用に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

qiita.com

096c638c0d86795be13

 

(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