Criterion)というものがよく使われますが、stanを用いてモデリングした場合にはAICを計算することができません。Criterion、広く使える情報量規準)はAICをより一般化したものとして定義され、MCMCによる事後分布から計算することができます。現在のところ{rstan}では直接WAICを計算することができませんが、{loo}というパッケージを用いることでWAICを得ることができます。この記事では、stanの結果からWAICを計算により求め、それがlooの結果と一致することを確認します。WAICの定義まず始めにWAICの定義を確認しましょう*1。WAICは以下のように定義されます:ここでであり、またです。それぞれ観測値iの事後分布から得られる対数尤度の平均および対数尤度の分散を表してます。lppdはlog-pointwise-predictive-densityです。シミュレーション簡単な数値例を発生させ、そのWAICを計算してみましょう。パラメータの推定には当然ながら{rstan}を利用します。データフレーム回帰係数1.2、誤差標準偏差2として発生させたデータに対し、{rstan}を用いて線形回帰モデルを当てはめてみましょう。いつものように{rstan}をロードします。parallel::detectCores())stanに渡すデータを以下のように定義します。今回の例では単純な線形モデルを用いているので、渡すパラメータもほとんどありません。D$Y)定義したdat_stanをstanに渡し、フィッティングします。1234)ここでWAIC.stanの内容は以下の通りです。1.000839色々と書いてあって情報が多いので、必要なところを抜き出しましょう。真の回帰係数および誤差標準偏差はそれぞれ1.2と2でした。1.957092回帰係数が少し低いようですが、まぁ良しとしましょう。WAICの計算それではこの結果を用いて、WAICを計算してみましょう。sampleを得ます。sampleとして保存されています。post_samples$sigma)}となります。sum(log(colMeans(tmp)))で得られます。var))として求められます。420.4523であり、非常に近い値となります。パッケージ{loo}を使ってWAICを求める。今度は上記の行程で求めた数値をパッケージで得た値と比較してみましょう。WAICの計算には{loo}を用います。quantitiesブロックを追加しておく必要があります。以下をmodelブロックの後に追加します。sigma);}normal_lpdfというのはRで言うところのdnormですね。このスクリプトをWAIC_02.stanとして保存し、stanを実行します。1234)結果は以下のようになります。前の結果と同じであることを確認してください。同じ値が得られていますね!終わりに分析内容は以上となります。この記事ではWAICの定義を確認した上で、その計算のための方法を示し、既存のパッケージによる数値と一致することを確かめました。WAICは階層モデルのような複雑なものであっても適用可能で、stanを使っていく上では抑えておきたい指標なので今後も勉強を続けていきます。アーカイブはてなブログをはじめよう!ushi-goroshiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。