Stanの裏でRを回す

Who are you?

どうも。
とおりすがりの Stan User です。

こちらは、Stan Advent Calendar の13日目の記事になります。
Stan Advent Calendarもいよいよ後半戦ですね!!
気付いたら12月も半分。。。
年内の仕事をどんどん片付けましょう(論文かかなきゃ…)

お詫び

今日はお前なにするっていってたっけ?って話ですよね
階層IRTとBi-factor IRTやるって言ってました

はい、すみません。時間がなかったのと、関連する論文読んでたらどんどん面白くなって 深みにはまって できませんでした。。。
モデルはほぼ書けているので、お正月(俺基準)までに別途執筆できればと思っています。

書こうとしていたのは、次の因子分析モデルをIRTモデルにしたものをご紹介する予定でした。

モデル1

*上記を作るにあたり、リンク(pdf)のサイト等を参考にさせていただきました。

また、このbi-fator modelをより一般化したモデルであるtwo-tierモデルも少し解説できればと考えています(実装するかはわかりませんが)。

モデル2

モデル3

本日のテーマ

話を戻して、ここからは本題である「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」タブができていると思います。

jobs02

この「Jobs Pane」を開いてみてください。

jobs03

当然、まだ何も命令していないので、Jobsが動いていません。

では、適当にRスクリプト(demo.r)を用意してください。

そしたら、みなさんのJobsを動かしたいと思います。
先ほどのJobsタブの「Start Local Job」をクリックしてください。
以下の画面が表示されると思います。

jobs04

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を押しましょう。ポチッとな

jobs05

demo.Rの左にある“←”を押すことで一つ画面を戻すことができます。
戻ると以下の画面になります。

jobs06

無事、実行されたようです。
複数のjobを実行するとどれが進行中で、終了しているかを確認することができます。

ただ、“x <- 1 + 1”はどこに行ったのでしょうか?
実は、今回の結果はどこにも保存されていません。
では、実行結果を保存するにはどうすれば良いでしょうか?

ポイントは「Environment」をいじることで解決します。

jobs07

To global environmentについて

  • 以下の設定で先ほどのdemo.rを実行してみてください。
    • Run job with copy of global environmentに チェックしない 
    • Copy job resultsを To global environment に変更する

RStudioの「Environment」タブに見てください。

jobs08

x <- 1 + 1 の実行結果が無事保存されていることがわかります。
あれ?でも、元々、xというオブジェクトに別の値が入っていたらどうなるのでしょうか?
では、やってみましょう。

Jobsとは別に以下を事前にRで実行してください。

以上を実行したときの「Environment」タブはこんな感じになっているはずです。

jobs09

xには10が入っていますね。

  • そして、改めて、以下の設定で先ほどのdemo.rを実行してみてください。
    • Run job with copy of global environmentに チェックしない 
    • Copy job resultsを To global environment に変更する

RStudioの「Environment」タブに見てください。

jobs08

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 に変更する

jobs10

Rstudioの「Environment」タブを見てみてください。

jobs11

謎のオブジェクトが保存されています。
demo_resultsというEnvironment型のオブジェクトです。

R初心者の僕にはEnvironment型のオブジェクトが何かわかりませんが、とりあえず何か保存されているようです。
実は、この中にxが保存されています。
取り出し方は、以下です。

jobs12

そうです。普通に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に以下を実行してください。

こんな感じになっていれば準備完了です。

jobs13

そして、上記とは別にdemo2.Rを用意してください。
このRスクリプトはxがないと実行されずエラーが吐かれます。

  • では、次の設定で実行してみましょう。
    • Run job with copy of global environmentに チェックする 
    • Copy job resultsを To global environment に変更する

jobs14

うまくいくと、RStudioの「Environment」タブにyが増えています。
xにもともと入っていた10を用いて、yにx+1の11が代入されていることがわかると思います。

jobs15

つまり、これを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で保存することも可能ですね。
書くの忘れてたので追記しました。

Daiki Hojo

2018-12-13