RStudioでRStanを実行する際のTips

この記事は，[Stan Advent Calender 2016](http://qiita.com/advent-calendar/2016/stan)の13日目の記事です。

## RStudioでStanを実行する

Stanを実行する環境としてはRやPythonなど色々あるかと思いますが，私の周りではもっぱらRStanが多く，またRStudioを利用している人が多い印象です。実際RStudioにはStanを実行するために色々なものが準備されているのですが，まだあまり広まっていないように感じます。

そこで本記事では，知っておくと便利なTipsをいくつかご紹介します。なお，一部は記事公開時点(2016/12/13)ではPreview版RStudioを必要とするものがあります。ご了承ください。

### stanファイルの編集

RStudioは実のところ色々なファイル形式に対応しており，**.stanにも対応**しています。しかし新規ファイル作成では`stan file`という項目はありません。なので以下のような手順を取ります:

1. Text fileを新規で作成
2. [File] - [SaveAs...]で，`kosaki.stan`と拡張子に`.stan`をつけて保存

これでRStudioはこのファイルをstanファイルとして認識し，そのように扱うようになります。

#### Stanのコードハイライトが有効になる

RStudioで`.stan`として認識させると，Stanのコードハイライトが有効になります:

![rstudio_stan01.png](https://qiita-image-store.s3.amazonaws.com/0/35118/4aeda752-7690-0c38-3e9a-a26beac5dd98.png)

Stanのコードを編集する上で必須と言えるでしょう。

#### Stanコードの文法チェックができる

`.stan`を開いているpane(前述の画像参照)では，右上に「**Check**」というボタンが出てきます。これをクリックすると，Stanコードのシンタックスチェックが行われます。結果はConsoleに表示され，問題ないならば以下のようなメッセージが出ます:

![rstudio_stan02.png](https://qiita-image-store.s3.amazonaws.com/0/35118/a82a2c85-1a0c-8f9c-c52a-0ed770896ca6.png)

もしシンタックスに問題がある場合，エラーを返すようになります。試しに一部セミコロンを取り去ってCheckすると，こうなります:

![rstudio_stan03.png](https://qiita-image-store.s3.amazonaws.com/0/35118/ba05cdee-4a07-1f39-5fab-e4c2e06efe24.png)

普段Rしか使わない人にとってはこの`;`を入れ忘れるというのはよくあるんじゃないのでしょうか。まずは一度この文法チェックをしてみるのをおすすめします。

#### コードスニペットが使える

RStudioにはスニペット機能[^1]があり，いろんな言語に対応しています。実はStanにも対応しており，`.stan`ファイル内ではStan用のスニペットが動くようになります。例えば，**`<lu`と入力してShift&Tabキー**を入力すると，以下のようになります:

![rstudio_stan04.png](https://qiita-image-store.s3.amazonaws.com/0/35118/64966c23-5465-872c-c28d-459a6c0b25a9.png)

[^1]: RStudioのスニペット機能には[こちらの記事](http://qiita.com/kazutan/items/4be49fbacb8c3d6c0f44#%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88%E6%A9%9F%E8%83%BD)で軽く紹介しています。詳しくはリンク先の記事およびそこで紹介している記事を参照してください。

この後は選択部分を編集してTabキー，選択部分を編集してTabキーと進めばあっという間に編集できるかと思います。Stan用のスニペット一覧を確認するには，RStudioのメニューの[Tools] - [Global Options...]をクリックし，ダイアログボックス左側の[Code]をクリックします:

![snippet_03.png](https://qiita-image-store.s3.amazonaws.com/0/35118/bf72994f-8bbf-b10a-989d-e0671605908a.png)

一番下の**Snippets**から，**Edit Snippets...**のボタンをクリックしてEdit Snippetsを呼び出して，Stanを選択してください:

![rstudio_stan05.png](https://qiita-image-store.s3.amazonaws.com/0/35118/8e804312-a6b5-f5b0-e34f-3617db1014fe.png)

### RmdファイルにStanコード直書き

Rでドキュメントを生成することを可能にするR Markdownは，他の言語エンジンも利用することができます。これについては本家の以下のサイトが参考になります:

[knitr Language Engines - RStudio](http://rmarkdown.rstudio.com/authoring_knitr_engines.html)

対応する言語にはStanも含まれており，上記Webページの[この場所](http://rmarkdown.rstudio.com/authoring_knitr_engines.html#stan)に説明があります。なお，記事作成時点(2016/12/13)において，**安定版(v1.0.44)では全体を一度にknitする場合のみ有効**です。しかしながら，**[Preview版](https://www.rstudio.com/products/rstudio/download/preview/)(執筆時でv1.0.136)ではstanチャンクの実行にも対応**しています。この記事ではPreview版であるv1.0.136を想定して説明します。

#### 基本的な使い方

上記公式Webページにあるように，`.stan`ファイルとして記述する内容を**stan**チャンクを埋め込めばOKです:

    ```{stan, output.var="kosaki"}
    parameters {
      real y[2]; 
    } 
    model {
      y[1] ~ normal(0, 1);
      y[2] ~ double_exponential(0, 2);
    } 
    ```

このチャンクオプションにある`output.var=`は必須で，指定した文字列で生成された`stanmodel`オブジェクトを格納させます。この場合，`kosaki`というオブジェクトが生成され，以降のrチャンクでそれを指定してサンプリングなどを実行することになります:

    ```{r}
    library(rstan)
    fit <- sampling(kosaki) 
    print(fit)
    ```

なお，このStanチャンク内ではStanのスニペットが有効です。これらを含むRmdファイルを`Knit`(あるいは`rmarkdown::render`)すれば，StanコードおよびRのコードに問題がなければ実行されるでしょう。試しに，以下のようなRmdファイルを準備してみます:

    ---
    title: "rmd_stan_test"
    output:
      html_document: default
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    ```
    
    ## Stan テスト。
    
    ```{stan, output.var="kosaki"}
    parameters {
      real y[2]; 
    } 
    model {
      y[1] ~ normal(0, 1);
      y[2] ~ double_exponential(0, 2);
    } 
    ```
    
    ```{r, warning=FALSE, message=FALSE, cache=TRUE}
    library(rstan)
    fit <- sampling(kosaki) 
    print(fit)
    ```

これを適当なファイル名で保存してKnitすると，以下のような感じになります:

![rstudio_stan06.png](https://qiita-image-store.s3.amazonaws.com/0/35118/3ebf51cc-216a-e341-1fd5-c6de1090ab65.png)


#### 注意事項

- Stanチャンクで`cache=TRUE`と指定すると，2回目以降でR Markdown側でエラーが発生し，cacheをクリアしないとうまくいかなくなる
- 全体をKnitすると毎回stanコードのコンパイルが実行されたりするので**かなり時間がかかる**

なので，手探りで色々やっていく場合，このままだと実用的ではないと思います[^2]。Stanによるモデリングは，結構色々と試しながら実行することを考えると，これは致命的です。そこで次の手を使います。

[^2]: R Markdownにはキャッシュ機能があるのですが，Stanエンジンの分はどうも毎回コンパイルを実行してしまい，これ自体はキャッシュとして残ってくれないっぽいです。もっと色々調べると解決策があるような気がしますが，そこまでの余裕もないですし，チャンク単体で実行していけば気にならないので放置することにしました…。

#### stanチャンク単体で実行

R Markdownはチャンク単体で実行することも可能です。これは**rチャンク以外でも有効**です。チャンクを単体で実行した場合，それらは`Global Environment`に入ります。なので気軽に再利用したりできますし，Rのコード評価に集中することができます。

「チャンクごとに実行(Run Current Chunk)」するには，チャンク部分右上にある**右向き三角形ボタンをクリック**すればOKです:

![rstudio_stan07.png](https://qiita-image-store.s3.amazonaws.com/0/35118/bbc269e2-6797-1386-a6ff-b01604f13f48.png)

また，その隣にある下向き矢印は，「そのチャンクより前にある全てのチャンクを実行(Run All Chunks Above)」するボタンです。なおRStudioのデフォルト設定では，実行結果をチャンクのすぐ下に表示するようになっています。これを邪魔に感じるようであれば，設定ボタンで変更できます:

![rstudio_stan08.png](https://qiita-image-store.s3.amazonaws.com/0/35118/966460ae-3639-7281-361a-fc475744bc2c.png)

ここで**Chunk Output in Console**を選択すれば，Consoleにだけ出力されるようになります。R Markdown全体の設定としてそのようにしたい場合は，[Tools] - [Global Options...]で，R Markdownの設定を変更してください:

![rstudio_stan09.png](https://qiita-image-store.s3.amazonaws.com/0/35118/481aaf26-4bdd-1c35-245a-2ae64b4897bd.png)

### R NotebookでStanコード直打ち

R NotebookもStan直打ちに対応しています[^3]。基本的な使い方は上述のR Markdownと同様です。ただ，R Notebookで**Preview**(Knitのところのボタン)を使用すると，Stanチャンク内のコードはドキュメントとしては表示されません[^4]。それ以外，つまりNotebook的な利用については基本問題なく動作しました。

[^3]: これもRStudio v1.0.44では未対応で，Preview版(v1.0.136)で動作確認しました。
[^4]: これはバグなのか何なのかはちょっとわからないです。とはいえR Notebookの内部を考えるとそれも仕方ないかなぁという気もしますが，未検証なので明言は避けます。

結構荒く説明したので，不明な点がありましたらこの記事のコメントや，執筆者のTwitterアカウント(@kazutan)にお問い合わせください。

**Enjoy!**