SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Stanの便利な事後処理関数
専修大学大学院文学研究科心理学専攻 M1 北條大樹
@dastatis
動機
• Stan Advent Calendar 2016 という素晴らしいものがある。
http://qiita.com/advent-calendar/2016/stan
• すごいためになるモデルばかり...(お菓子力も、サンシャイン力もあがる)
• レベル高すぎない??(もちろん素晴らしいですけど)
• 初心者は記事通りモデル回してStan結果ファイルを自由に扱
えるだろうか?
• Stanには、結果処理の上質な関数が整っているけど、初心者
にはあまり知られていないのでは!?
•X’mas暇
2
この資料
• Stan結果処理の便利な関数をまとめてみた(20161225時点)。
• Stan動かせるようになったばかりの人向け。
• 今回の実行環境・人
Windows 10
Rstudio version 1.0.44
RStan ver 2.13.2
ggplot2 ver 2.2.0
Stan歴 2年
• 内容等、間違っていたら教えてください。
3
おなじみのデモデータ
• まずは 8schools.stan を実行
詳しくは
(https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started)
setwd(“ディレクトリ")
# rm(list=ls()) #Enviroment をきれいにします。
library(rstan) #パッケージ読み込み
rstan_options(auto_write = TRUE) #並列処理(下と合わせて)
options(mc.cores = parallel::detectCores())
# options(max.print = 99999) #Consoleに表示する個数の設定
schools_dat <- list(J = 8,
y = c(28, 8, -3, 7, -1, 1, 18, 12),
sigma = c(15, 10, 16, 11, 9, 11, 10, 18))
fit <- stan(file = '8schools.stan', data = schools_dat,
iter = 1000, chains = 4)
4
summary & get_ 編
魔法の言葉「 」
5
先ほどのモデルを普通に結果出力してみる。
よし!
結果出力できた。
やりたいこと
1. ෠𝑅で収束判定を
して、
2. 小数点以下は3
桁まで表示して
3. 事後平均値を抽
出したい
fitから抽出すりゃいいか
6
fitから簡単に数値取り出せない問題発生
• stanfit ファイル(今回でいう fit )はS4クラス形式で保存
• S4クラス形式とは?
• 普通のオブジェクトよりも複雑な形式で保存されている(っていう認識
でここでは問題ないと思う)。
• 普通のオブジェクトとは異なり、$で引き出すのではなく、@を用いて
中身を取り出す。
• ちなみに、JAGSの結果はS3クラスで保存されていて、これが同じよう
な操作ができないことの理由。最近はggmcmcなるパッケージがありま
すので便利ですけれども(わからない人は聞き流してください)
• 例えばこんな感じ(下記はモデルのパラメータを抽出している)
> fit@model_pars
[1] "mu" "tau" "eta" "theta" "lp__"
(飛ばしても良い)
7
やりたいこと①
• ෠𝑅とは...
• chain内分散とchain間分散を用いた定常分布への収束確認に用いられる
指標。
• ෠𝑅 < 1.10であれば収束
• 今回の例であれば、パラメータ数も多くないので、全てのパラメータの ෠𝑅
を見て即座に判断出来る。
• だけど、パラメータの多いモデルでは、それが困難な場合がある
• (ちなみに私がよく使用するIRTモデルだとパラメータ数30000個ぐらいあるので
一目で確認するのは困難)。
• そんなときにどう判断するのが効率的か??
෠𝑅で収束判定 8
やりたいこと①
• 魔法の言葉「 」で抽出して解決
• そして、一括判定してあげる。
※「 ,na.rm = T 」をつける意味
stanモデル上でパラメータに直接数値を代入している場合、 ෠𝑅は当然算出されず、
෠𝑅=NaNとなります。そのような場合、欠損値の除去を行わないと正常に判定するこ
とが出来ません。
෠𝑅で収束判定
> all(summary(fit)$summary[,“Rhat”] <= 1.10, na.rm = T)
# all() ()内で論理式を全て満たしたらTRUEを返す関数
[1] TRUE
9
やりたいこと②
• 魔法の言葉「 」をまた使う
• 今回round()を使う
• round()は数値を丸める関数(stan専用関数ではない。)
• digits= で小数点以下の桁数を設定
小数点以下を3桁まで表示にしたい 10
やりたいこと③
• 魔法の言葉「 」をまたまた使う
• ෠𝑅を取り出してきたとき同様に、[, ”mean”]としてあげるだけ
• 他の変数も“”で指定すれば抽出可能。
小数第3位表示の事後平均値を抜き出したい 11
ちなみに...
• 事後平均値であれば、
get_posterior_mean()
という便利な関数がある。
• 右のように簡単に抽出可
12
他にも
• get_logposterior(fit) ⇒ 発生させた対数事後確率の乱数を取り出す
• get_inits(fit) ⇒ 推定の際の各パラメータの初期値を取り出す
• get_seeds(fit) ⇒ 推定の際の各パラメータの乱数の種を取り出す
• get_stanmodel(fit) ⇒ 推定に用いたstanモデルを取り出す
• get_elapsed_time(fit) ⇒ 推定時間(warmupとsampleが分かれてでる)
等々
13
補足
• 事後平均が知りたいのではなく、特定のパラメータの各点推
定値が知りたい。
• たとえば、“mu”の場合
• このように、[,]の行にあたる部分でパラメータの指定すれば取
り出すことが出来る。
14
stan_ 編
※最近 rstan と ggplot2 のver違いでうまく回せないことがあるらしいです。
そのうち対応すると思われます。
15
stan_ シリーズ
• 実は、stan_?? で様々な便利な関数が保存されている
(ggplot2書式のplotをはき出してくれる。)
16
stan_trace
• この関数はトレースプロットを出力することが出来る。
eta[7] eta[8]
eta[3] eta[4] eta[5] eta[6]
mu tau eta[1] eta[2]
500 600 700 800 900 1000 500 600 700 800 900 1000
500 600 700 800 900 1000 500 600 700 800 900 1000 500 600 700 800 900 1000 500 600 700 800 900 1000
500 600 700 800 900 1000 500 600 700 800 900 1000 500 600 700 800 900 1000 500 600 700 800 900 1000
-2
0
2
4
-4
-2
0
2
-2
0
2
-2
0
2
0
10
20
30
40
-2
0
2
-2
0
2
0
10
20
-2
0
2
-2
0
2
chain
1
2
3
4
今回はプロットするパラメータを
設定していないので10個分の
パラメータが表示、
バーンイン期間が非表示(デフォルト)
stan_trace(fit)
17
stan_trace
• オプションを加えてあげると
stan_trace(fit, pars = c("eta"), inc_warmup = T)
# pars = で出力パラメータ設定
# inc_warmup =T でバーンイン期間も出力
バーンイン期間は
灰色で出力される
18
stan_hist
• この関数は(事後分布の)ヒストグラムを書くことが出来る関数
stan_hist(fit, bins = 100)
# bins = でヒストグラムの“細かさ”を設定(デフォルトは30)
# 先ほどのオプションも使える
19
stan_dens
• この関数は(事後分布を)密度推定した図を書くことが出来る
stan_dens(fit, separate_chains = T)
# separate_chains = T でchain毎に事後分布を書くかどうかの設定
# 先ほどの(ry
20
stan_plot
• この関数は各事後分布を1枚の図で出力できる。
stan_plot(fit,
point_est = “median”, #点推定値(黒縦棒)を何で表示するか(mean/median)
show_density = T, #密度推定した分布を表示するか
ci_level = 0.95, #確信区間(ベイズ信頼区間)の範囲指定
outer_level = 1.00, #分布の端っこをどこまで表示するか
show_outer_line = T) #分布の端っこを表示するか
21
stan_ac
• この関数は自己相関をチェックすることができる関数
• 効率の良いサンプリングが行われていれば、自己相関がすぐに減少
stan_ac(fit)
22
stan_ac
• この関数は自己相関をチェックすることができる関数
• 効率の良いサンプリングが行われていれば、自己相関がすぐに減少
stan_ac(fit)
この10個のパラメータ
では、これが最も自己
相関が減少していない。
23
stan_rhat
• この関数は ෠𝑅を視覚的に確認できる関数(chain = 1だと回せません)
• ෠𝑅 < 1.10であれば収束
stan_rhat(fit)
1.10以内に全て
おさまっている
⇒OK
24
stan_ess
• この関数は実行サンプルサイズ(Effective sample size ÷ Sample size)を図示
• 10%以上になれば、効率的なサンプリングが行えていることになる
stan_ess(fit)
10%(0.1)以下の
パラメータは
存在しない
⇒OK
25
他にも・・・
←stan_diag(fit)
↓ stan_par(fit, par = “mu”)
26
さらに...
• 各 stan_ シリーズの最後に$dataをつけることでplotに用いた
dataを抽出することが出来ます。
• たとえば...stan_plotの場合
mean = 事後平均値
ll=outer_levelで設定した点(低い方)
l = ci_levelで設定した点(低い方)
m = median
h, hh = l, llの逆。高い方。
27
これを応用して...
• 先ほど収束判定で以下を用いましたが
• 以下でも可能です。
> all(summary(fit)$summary[,“Rhat”] <= 1.10, na.rm = T)
# all() ()内で論理式を全て満たしたらTRUEを返す関数
[1] TRUE
> all(stan_rhat(fit)$data <= 1.10, na.rm = T)
# all() ()内で論理式を全て満たしたらTRUEを返す関数
[1] TRUE
28
おまけ
extract()
stanfitの中身
29
おまけ extract()
• おれは要約統計量ではなく、発生させた乱数列全てがほしいんだ!!!と
言う方は、
• extract(fit)とすれば発生させた乱数列を抽出出来ます
• extractで抽出した乱数を用いて、median、mean等々を求めれば、もちろん、それがMAP、
EAP等になります。
この関数のオプションとして,,,
• inc_warmup=Tをつければ、バーンイン期間を含む乱数列がとれます。
• permuted=Tをつけると、同パラメータのchainが縦につながった状態で出
ます(list形式)。permuted=Fにすると同パラメータのchainが区別された状
態で出ます(3次元配列[ iter, chain, parameter ]形式)。
30
おまけ Stanfitの中身
• fit@ と打つと...
• いっぱい出てくる
• これがS4くらすか!!
31
おまけ Stanfitの中身
• 全部出してみた。
• 上から
• モデル名
• モデル内のパラメータ
• パラメータの次元
• 推定がうまく出来ているか??(通常は0)
• 発生させた乱数と採択率等
• 各パラメータの初期値
32
おまけ Stanfitの中身
• 全部出してみた(続き)
• 上から
• 各引数(iterやseed等々)
• モデル
• 推定日
33
Enjoy your Stan Life.
Merry Christmas...

Mais conteúdo relacionado

Mais procurados

MCMCサンプルの使い方 ~見る・決める・探す・発生させる~
MCMCサンプルの使い方 ~見る・決める・探す・発生させる~MCMCサンプルの使い方 ~見る・決める・探す・発生させる~
MCMCサンプルの使い方 ~見る・決める・探す・発生させる~
. .
 

Mais procurados (20)

StanとRでベイズ統計モデリング読書会Ch.9
StanとRでベイズ統計モデリング読書会Ch.9StanとRでベイズ統計モデリング読書会Ch.9
StanとRでベイズ統計モデリング読書会Ch.9
 
MCMCでマルチレベルモデル
MCMCでマルチレベルモデルMCMCでマルチレベルモデル
MCMCでマルチレベルモデル
 
RStanとShinyStanによるベイズ統計モデリング入門
RStanとShinyStanによるベイズ統計モデリング入門RStanとShinyStanによるベイズ統計モデリング入門
RStanとShinyStanによるベイズ統計モデリング入門
 
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
 
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
 
2 4.devianceと尤度比検定
2 4.devianceと尤度比検定2 4.devianceと尤度比検定
2 4.devianceと尤度比検定
 
ベイズファクターとモデル選択
ベイズファクターとモデル選択ベイズファクターとモデル選択
ベイズファクターとモデル選択
 
MCMCサンプルの使い方 ~見る・決める・探す・発生させる~
MCMCサンプルの使い方 ~見る・決める・探す・発生させる~MCMCサンプルの使い方 ~見る・決める・探す・発生させる~
MCMCサンプルの使い方 ~見る・決める・探す・発生させる~
 
Cmdstanr入門とreduce_sum()解説
Cmdstanr入門とreduce_sum()解説Cmdstanr入門とreduce_sum()解説
Cmdstanr入門とreduce_sum()解説
 
rstanで簡単にGLMMができるglmmstan()を作ってみた
rstanで簡単にGLMMができるglmmstan()を作ってみたrstanで簡単にGLMMができるglmmstan()を作ってみた
rstanで簡単にGLMMができるglmmstan()を作ってみた
 
社会心理学とGlmm
社会心理学とGlmm社会心理学とGlmm
社会心理学とGlmm
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
R stan導入公開版
R stan導入公開版R stan導入公開版
R stan導入公開版
 
これからの仮説検証・モデル評価
これからの仮説検証・モデル評価これからの仮説検証・モデル評価
これからの仮説検証・モデル評価
 
負の二項分布について
負の二項分布について負の二項分布について
負の二項分布について
 
第4回DARM勉強会 (構造方程式モデリング)
第4回DARM勉強会 (構造方程式モデリング)第4回DARM勉強会 (構造方程式モデリング)
第4回DARM勉強会 (構造方程式モデリング)
 
心理学者のためのGlmm・階層ベイズ
心理学者のためのGlmm・階層ベイズ心理学者のためのGlmm・階層ベイズ
心理学者のためのGlmm・階層ベイズ
 
2 3.GLMの基礎
2 3.GLMの基礎2 3.GLMの基礎
2 3.GLMの基礎
 
StanとRでベイズ統計モデリング読書会(Osaka.stan) 第6章
StanとRでベイズ統計モデリング読書会(Osaka.stan) 第6章StanとRでベイズ統計モデリング読書会(Osaka.stan) 第6章
StanとRでベイズ統計モデリング読書会(Osaka.stan) 第6章
 
ベイズモデリングと仲良くするために
ベイズモデリングと仲良くするためにベイズモデリングと仲良くするために
ベイズモデリングと仲良くするために
 

Destaque

10分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_090610分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_0906
Nobuaki Oshiro
 

Destaque (16)

楽にggplotを描く・整える
楽にggplotを描く・整える楽にggplotを描く・整える
楽にggplotを描く・整える
 
エクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてエクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについて
 
Stanの事後処理 LTver
Stanの事後処理 LTverStanの事後処理 LTver
Stanの事後処理 LTver
 
Inference via Bayesian Synthetic Likelihoods for a Mixed-Effects SDE Model of...
Inference via Bayesian Synthetic Likelihoods for a Mixed-Effects SDE Model of...Inference via Bayesian Synthetic Likelihoods for a Mixed-Effects SDE Model of...
Inference via Bayesian Synthetic Likelihoods for a Mixed-Effects SDE Model of...
 
いいからベイズ推定してみる
いいからベイズ推定してみるいいからベイズ推定してみる
いいからベイズ推定してみる
 
10分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_090610分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_0906
 
glmmstanパッケージを作ってみた
glmmstanパッケージを作ってみたglmmstanパッケージを作ってみた
glmmstanパッケージを作ってみた
 
Rはいいぞ!むしろなぜ使わないのか!!
Rはいいぞ!むしろなぜ使わないのか!!Rはいいぞ!むしろなぜ使わないのか!!
Rはいいぞ!むしろなぜ使わないのか!!
 
潜在クラス分析
潜在クラス分析潜在クラス分析
潜在クラス分析
 
Rで項目反応理論、テキストマイニング、Rの研修やってますという三題噺(33rd #TokyoR)
Rで項目反応理論、テキストマイニング、Rの研修やってますという三題噺(33rd #TokyoR)Rで項目反応理論、テキストマイニング、Rの研修やってますという三題噺(33rd #TokyoR)
Rで項目反応理論、テキストマイニング、Rの研修やってますという三題噺(33rd #TokyoR)
 
状態空間モデルの実行方法と実行環境の比較
状態空間モデルの実行方法と実行環境の比較状態空間モデルの実行方法と実行環境の比較
状態空間モデルの実行方法と実行環境の比較
 
Rで因子分析 商用ソフトで実行できない因子分析のあれこれ
Rで因子分析 商用ソフトで実行できない因子分析のあれこれRで因子分析 商用ソフトで実行できない因子分析のあれこれ
Rで因子分析 商用ソフトで実行できない因子分析のあれこれ
 
今さら聞けないMicrosoft azure仮想マシン入門
今さら聞けないMicrosoft azure仮想マシン入門今さら聞けないMicrosoft azure仮想マシン入門
今さら聞けないMicrosoft azure仮想マシン入門
 
ggplot2用例集 入門編
ggplot2用例集 入門編ggplot2用例集 入門編
ggplot2用例集 入門編
 
臨床心理学における例数設計
臨床心理学における例数設計臨床心理学における例数設計
臨床心理学における例数設計
 
ようやく分かった!最尤推定とベイズ推定
ようやく分かった!最尤推定とベイズ推定ようやく分かった!最尤推定とベイズ推定
ようやく分かった!最尤推定とベイズ推定
 

Semelhante a Stanの便利な事後処理関数

サーバ異常検知入門
サーバ異常検知入門サーバ異常検知入門
サーバ異常検知入門
mangantempy
 

Semelhante a Stanの便利な事後処理関数 (18)

不揮発WALバッファ
不揮発WALバッファ不揮発WALバッファ
不揮発WALバッファ
 
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRRとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
 
HiRoshimaR3_IntroR
HiRoshimaR3_IntroRHiRoshimaR3_IntroR
HiRoshimaR3_IntroR
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
Rパッケージ“KFAS”を使った時系列データの解析方法
Rパッケージ“KFAS”を使った時系列データの解析方法Rパッケージ“KFAS”を使った時系列データの解析方法
Rパッケージ“KFAS”を使った時系列データの解析方法
 
JAWSUG 20191028
JAWSUG 20191028JAWSUG 20191028
JAWSUG 20191028
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparseness
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
Nagoya.R #14 入門者講習
Nagoya.R #14 入門者講習Nagoya.R #14 入門者講習
Nagoya.R #14 入門者講習
 
Application of postgre sql to large social infrastructure jp
Application of postgre sql to large social infrastructure jpApplication of postgre sql to large social infrastructure jp
Application of postgre sql to large social infrastructure jp
 
卒研発表 バースカ(確認済み)
卒研発表 バースカ(確認済み)卒研発表 バースカ(確認済み)
卒研発表 バースカ(確認済み)
 
サーバ異常検知入門
サーバ異常検知入門サーバ異常検知入門
サーバ異常検知入門
 
Hiroshimar4_Rintro
Hiroshimar4_RintroHiroshimar4_Rintro
Hiroshimar4_Rintro
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 

Mais de daiki hojo

MCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージ
MCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージMCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージ
MCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージ
daiki hojo
 

Mais de daiki hojo (6)

Bayesian Sushistical Modeling
Bayesian Sushistical ModelingBayesian Sushistical Modeling
Bayesian Sushistical Modeling
 
心理学におけるオープンサイエンス入門(OSF&PsyArXiv編)
心理学におけるオープンサイエンス入門(OSF&PsyArXiv編)心理学におけるオープンサイエンス入門(OSF&PsyArXiv編)
心理学におけるオープンサイエンス入門(OSF&PsyArXiv編)
 
心理学者のためのJASP入門(操作編)[説明文をよんでください]
心理学者のためのJASP入門(操作編)[説明文をよんでください]心理学者のためのJASP入門(操作編)[説明文をよんでください]
心理学者のためのJASP入門(操作編)[説明文をよんでください]
 
あなたの心にBridgeSampling
あなたの心にBridgeSamplingあなたの心にBridgeSampling
あなたの心にBridgeSampling
 
GoogleCalenderをShinyを実装してみた(序) Tokyo.R #66 LT
GoogleCalenderをShinyを実装してみた(序) Tokyo.R #66 LT GoogleCalenderをShinyを実装してみた(序) Tokyo.R #66 LT
GoogleCalenderをShinyを実装してみた(序) Tokyo.R #66 LT
 
MCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージ
MCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージMCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージ
MCMCしすぎて締め切り間近に焦っているあなたに贈る便利なgg可視化パッケージ
 

Stanの便利な事後処理関数