Stanの裏でRを回す
RStudio Jobs Paneについて
Who are you?
どうも。
とおりすがりの Stan User です。
こちらは、Stan Advent Calendar の13日目の記事になります。
Stan Advent Calendarもいよいよ後半戦ですね!!
気付いたら12月も半分。。。
年内の仕事をどんどん片付けましょう(論文かかなきゃ…)
お詫び
今日はお前なにするっていってたっけ?って話ですよね
階層IRTとBi-factor IRTやるって言ってました
はい、すみません。時間がなかったのと、関連する論文読んでたらどんどん面白くなって 深みにはまって できませんでした。。。
モデルはほぼ書けているので、お正月(俺基準)までに別途執筆できればと思っています。
書こうとしていたのは、次の因子分析モデルをIRTモデルにしたものをご紹介する予定でした。
*上記を作るにあたり、リンク(pdf)のサイト等を参考にさせていただきました。
また、このbi-fator modelをより一般化したモデルであるtwo-tierモデルも少し解説できればと考えています(実装するかはわかりませんが)。
- 参考文献:
- Hill, C.D. (2006). Two models for longitudinal item response data. Unpublished doctoral dissertation, Department ofPsychology, University of North Carolina at Chapel Hill.
- Cai, L. I. (2010). A TWO-TIER FULL-INFORMATION ITEM FACTOR ANALYSIS MODEL WITH APPLICATIONS. PSYCHOMETRIKA, 75(4), 581–612. (https://doi.org/10.1007/S11336-010-9178-0)
- Handbook of Item Response Theory Modeling: Applications to Typical Performance Assessment (Multivariate Applications Series) (English Edition) の9–10章(おすすめ) (https://www.amazon.co.jp/dp/B00PWAKEJK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
本日のテーマ
話を戻して、ここからは本題である「Stanの裏でRを回す」についてです。
そもそもStan(rstan)の裏ではc++が動いていて、何を言っているんだという感じですが、
あなたはStanを回しているとき何をしていますか?(唐突)
僕はStanを書いています。
モデルを探索的に考えているとき、Stanを回し始めると
「あーこのパラメータをこう変えたらどうなるんだろう。この事前分布ならどうだろう。
そのためにデータをもう一度可視化して、それを踏まえてモデル書き換えたの準備しておくか。
でも、Stanが回っていて終わるまでR実行できないしどうしよう。よし、雪見だいふく食べるか。」みたいな状況はよくあると思います。
これは、全世界70億人のStan Userが一度は考えたことがある問題です。
そこで便利なのがRStudioの「Jobs Pane」です!
Rstudio Jobs Pane
RStudio Jobs Paneとは、Rのコンソールとは別に(の後ろで)Rスクリプトを実行できる機能です。
こちらを応用することでStanを回しつつRを操作することが可能です。
Rstudio Jobs Paneを使うための準備
現在(2018/12/13)、Jobs Paneを使うには、Rstudioのpreview版を導入する必要があります。
preview版とは、近日リリースされるRstudioの次のバージョンであり、超最新版です。
動作自体は通常のRstudioと相違なく、安定して動作するので特に心配する必要はありません。
まず、ご自分のOSに合わせて、Rstudio previewをダウンロード、インストールしてください。
Rstudio Jobs Paneを使う
起動するといつもと変わらないRStudioが立ち上がります。
Console画面に注目してみてください。
おそらく、ここに「Jobs」タブができていると思います。
この「Jobs Pane」を開いてみてください。
当然、まだ何も命令していないので、Jobsが動いていません。
では、適当にRスクリプト(demo.r)を用意してください。
そしたら、みなさんのJobsを動かしたいと思います。
先ほどのJobsタブの「Start Local Job」をクリックしてください。
以下の画面が表示されると思います。
Jobsの画面構造は次のようになっていますね。
- Script Paths
- R script
- Working Directory
- Environment
- Run job with copy of global environment
- Copy job results:
- (Don’t copy)
- To global environment
- To results object in global environment
まずは、動かしてみましょう。
R Scriptの方に先ほど用意したdemo.R(もしくは実行したい.Rファイル)を指定して、
Working Directoryも設定してください。
そして、Environmentの方は何もいじらずにStartを押しましょう。ポチッとな
demo.Rの左にある“←”を押すことで一つ画面を戻すことができます。
戻ると以下の画面になります。
無事、実行されたようです。
複数のjobを実行するとどれが進行中で、終了しているかを確認することができます。
ただ、“x <- 1 + 1”はどこに行ったのでしょうか?
実は、今回の結果はどこにも保存されていません。
では、実行結果を保存するにはどうすれば良いでしょうか?
ポイントは「Environment」をいじることで解決します。
To global environmentについて
- 以下の設定で先ほどのdemo.rを実行してみてください。
- Run job with copy of global environmentに チェックしない
- Copy job resultsを To global environment に変更する
- Run job with copy of global environmentに チェックしない
RStudioの「Environment」タブに見てください。
x <- 1 + 1 の実行結果が無事保存されていることがわかります。
あれ?でも、元々、xというオブジェクトに別の値が入っていたらどうなるのでしょうか?
では、やってみましょう。
Jobsとは別に以下を事前にRで実行してください。
以上を実行したときの「Environment」タブはこんな感じになっているはずです。
xには10が入っていますね。
- そして、改めて、以下の設定で先ほどのdemo.rを実行してみてください。
- Run job with copy of global environmentに チェックしない
- Copy job resultsを To global environment に変更する
- Run job with copy of global environmentに チェックしない
RStudioの「Environment」タブに見てください。
xには2が入っていることがわかります。
つまり、 xが上書きされた ことがわかります。
また、別途事前にyというオブジェクトがあった場合、demo.rにyに関する記述はないのでyは上書きされません。
まとめると、
Copy job resultsを To global environment にすると、Jobの実行結果をEnvironmentに保存されるが、すでにあるオブジェクトについては上書きされる。
ということになります。
To results object in global environmentについて
では、Copy job resultsの To results object in global environment は何を行うのでしょうか?
先ほどとの違いを見比べましょう
まず、Rstudioの「Environment」を綺麗にしてください。
(rm(list=ls())を実行するか、箒ボタンを押して綺麗にしてください。)
- そして、以下の設定で先ほどのdemo.rを実行してみてください。
- Run job with copy of global environmentに チェックしない
- Copy job resultsを To results object in global environment に変更する
- Run job with copy of global environmentに チェックしない
Rstudioの「Environment」タブを見てみてください。
謎のオブジェクトが保存されています。
demo_resultsというEnvironment型のオブジェクトです。
R初心者の僕にはEnvironment型のオブジェクトが何かわかりませんが、とりあえず何か保存されているようです。
実は、この中にxが保存されています。
取り出し方は、以下です。
そうです。普通にRで用いる $ を使ってxをとってくることができます。
簡単ですね。
Jobsで複数のオブジェクトを保存するようなRスクリプトを書いている場合、同様に $ をつけることで取ってくることができます。
Run job with copy of global environmentについて
まだよくわかっていない欄があります。
そうです。 Run job with copy of global environment についてです。
これは、事前にRに実行してある変数を使うかどうかです。
Stanでモデルを回す際に、以下の手順が基本だと思います。
1. data 読み込み
2. モデルコンパイル
3. Stan実行
しかし、Jobとしたいのは、2,3のみだと思います。
そんなときに便利なのが Run job with copy of global environment です。
では、簡単な例でやってみましょう
先ほどと同じように事前にRに以下を実行してください。
こんな感じになっていれば準備完了です。
そして、上記とは別にdemo2.Rを用意してください。
このRスクリプトはxがないと実行されずエラーが吐かれます。
- では、次の設定で実行してみましょう。
- Run job with copy of global environmentに チェックする
- Copy job resultsを To global environment に変更する
- Run job with copy of global environmentに チェックする
うまくいくと、RStudioの「Environment」タブにyが増えています。
xにもともと入っていた10を用いて、yにx+1の11が代入されていることがわかると思います。
つまり、これをStanに用いれば、
1. 事前にRでデータ読み込む
2. 1.を使ってモデルAを回す。
3. 1.を使ってモデルBを回す。
4. 1.を使ってモデルCを回す。
5. 1.を使ってモデルDを回す。
...
ということができます(もちろんPC重くなるけどね)。
これぞ、まさにEndless Stan!!(*´Д`)ハァハァ
まとめ
RStudio Preview版のJobs Paneを用いるとStanを回しながら、Rを動かすことができる。
そして、分析が終わった段階で「Environment」タブに入るのでとても便利!!
実は、このpreview版はStanに関して便利な機能がほかにも搭載されています。
- 新しいスクリプトを作成する際に、Stanファイルのテンプレが追加されている。
- stanコードを書いている途中で;が抜けている等の指摘をしてくれるので楽。
これは、今すぐRStudio Preview版にアップデートするしかないですね!!!
Enjoy!!!
追記
Rスクリプトの最後にsave()を書いておくことで、.Rdataで保存することも可能ですね。
書くの忘れてたので追記しました。