nagoyastat#7 stanとrでベイズ統計モデリング(アヒル本)4章の発表資料
TRANSCRIPT
![Page 1: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/1.jpg)
StanとRでベイズ統計モデリング(アヒル本)
Chapter 4NagoyaStat #7
@nishiokya
![Page 2: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/2.jpg)
@nishiokya 近況
先月 Tableau Conference @ Las Vegasに行ってきました
https://qiita.com/nishiokya/items/7736dc3c7add8f156940
![Page 3: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/3.jpg)
StanとRでベイズ統計モデリング 目次
第I部 導入編
Chapter 1 統計モデリングとStanの概要
Chapter 2 ベイズ推定の復習
Chapter 3 統計モデリングをはじめる前に
第Ⅱ部 Stan入門編
Chapter 4 StanとRStanをはじめよう
Chapter 5 基本的な回帰とモデルのチェック
第III部 発展編
Chapter 6 統計モデリングの視点から確率分布の紹介
Chapter 7 回帰分析の悩みどころ
Chapter 8 階層モデル
Chapter 9 一歩進んだ文法
Chapter 10 収束しない場合の対処法
Chapter 11 離散値をとるパラメータを使う
Chapter 12 時間や空間を扱うモデル
![Page 4: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/4.jpg)
StanとRでベイズ統計モデリングChapter4 目次
4.1 StanとRStanの準備
4.2 Stanの基本的な文法
4.3 Stanのlp__とtarget
4.4 単回帰¶
補足と文献案内
練習問題
![Page 5: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/5.jpg)
Chapter4 StanとRをはじめよう
Chapter4で習うこと
1. Stanのインストール方法や、基本的な文法を説明
2. 単回帰の例題を通して実際にRStanを用いてRからStanを実行
3. MCMCサンプルを得る
4. ベイズ信頼区間・ベイズ予測区間を計算
5. 推定結果の見方とMCMCの設定変更
![Page 6: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/6.jpg)
今日の進め方
4章をChapterに従い説明します
4章で使うRStanコマンドの使い方をより詳しく説明します
stan
extract
ggmcmc
Stan fit
![Page 7: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/7.jpg)
4.1 StanとRStanの準備
必要なもの Windows 7,8,10 Mac
R3.0.2以降 ○ ○
RStan ○ ○
RTools ○ ○
C++ Tools 不要 ○
![Page 8: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/8.jpg)
4.2 Stanの基本的な文法
4.2.1 ブロック構成
4.2.2 文法の基礎
4.2.3 コーディング規約
![Page 9: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/9.jpg)
4.2.1 ブロック構成
順番 ブロック名 説明 基本 目次
1 function ユーザーが独自関数を定義 11.2
2 data modelブロックで使う観測されたデータを記述 ○ 4.2.1
3 transformed data Rから渡すことが困難、加工したいデータを記述 10.1.4
4 parameters 推定すべきパラメータ(確率変数)を記述 ○ 4.2.1
5 transformed parameters dataまたはparameterブロックで宣言された値から新た推定すべき変数を作ることができる
4.12
6 model 尤度、事前分布の記述 ○ 4.2.1
7 generated quantities Dataまたはparameterまたはtransformed paramtersブロックで宣言された値、定数から新たにサンプリングする変数を作る
4.12
Stanのブロック一覧と最初にでてくる目次
![Page 10: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/10.jpg)
4.2.1 ブロック構成基本的構造
data{
観測されたデータ𝑌宣言
}
parameters{
サンプリングしたいパラメータ𝜃の宣言
}
model{
尤度𝑝(𝑌|𝜃)の記述
事前分布𝑝(𝜃)の記述
}
ブロック名 説明
data modelブロックで使う観測されたデータを記述RからStanに渡される
parameters 推定すべきパラメータ(確率変数)を記述値が決まっていない確率変数はすべてparametersに記載する
model 尤度、事前分布の記述事前分布が無情報の場合は省略できる
![Page 11: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/11.jpg)
4.2.2 文法の基礎
2.3節で取り上げた例で文法を説明
「標準偏差が1の正規分布から独立に得られた20個のデータの平均𝜇」
モデル式4-1Υ 𝑛 ~𝑁𝑜𝑟𝑚𝑎𝑙 𝜇, 1 𝑛 = 1,2, … , 20
𝜇 ~ Normal(0,100)
事後分布
𝑝 𝜃 𝑌 = 𝑝 𝑌 𝜃 p(𝜃)
P(Y| 𝜇)p(𝜇)
𝑛 = 1,2, … , 20
平均:𝜇分散:1
Υ 𝑛
グラフィカルモデル
パラメータ𝜇の事前分布は無情報事前分布 (平均0、分散100)とする
![Page 12: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/12.jpg)
4.2.2 文法の基礎
数式 ブロック 書き方
Υ 𝑛 ~𝑁𝑜𝑟𝑚𝑎𝑙 𝜇, 1 model for( n in 1:N){
Y[n]~ normal(mu,1);
}
𝜇 ~ Normal(0,100) model mu ~ normal(0,100)
𝑛 = 1,2, … , 20 data int N;
Υ 𝑛 data real Y[N];
𝜇 parameters real mu;
data{
int N;
real Y[N];
}
parameters {
real mu;
}
model{
for( n in 1:N){
Y[n]~ normal(mu,1);
}
mu ~ normal(0,100)
}
Stanコード
数式とStanでの書き方の対応
![Page 13: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/13.jpg)
4.2.2 文法の基礎
記述 説明 型・他
int N 整数 プリミティブ型
real Y 連続値 プリミティブ型
real Y[N] 添え字をつけて宣言 配列
for( n in 1:N) ループ 1からNになるまでnを繰り返す -
mu ~ normal(0,100) 事前分布(mu)を生成平均0、分散100の正規分布からmu
を生成する
-
Y[n]~ normal(mu,1); 尤度を生成Y[n]は、平均mu、分散100の正規分布から生成せれる
-
数式の解説
![Page 14: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/14.jpg)
4.2.3 コーディング規約
# 規約 サンプル
1 インデントする int N;
2 データを表す変数は頭は大文字 int N;
3 パラメータを表す変数の頭は小文字 real mu;
4 各ブロック間は一行開ける }
model{
5 変数名はアンダーバーでつなぐ snake_case
6 「~」や「=」の前後は1文字開ける mu ~ normal(0,100)
アヒル本の規約
![Page 15: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/15.jpg)
4.3 Stanのlp__とtarget
Stanは事後確率の高いところを効率的に探索している
事後確率を効率的に探索するために対数事後確率を偏微分した値を使う
𝑙𝑜𝑔𝑝 𝜃 𝑌 = 𝑙𝑜𝑔𝑝 𝑌 𝜃 + 𝑙𝑜𝑔𝑝 𝜃 + 𝑐𝑜𝑛𝑠𝑡.
MCMCステップ毎の対数事後確率(lp__)というパラメータとして内部で保持している
𝑙𝑜𝑔𝑝 𝑌 𝜃∗ + 𝑙𝑜𝑔𝑝 𝜃∗
targetはlp__のエイリアス
targetは7.8節、11章で必要になる
![Page 16: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/16.jpg)
4.3 Stanのlp__とtarget
model{
for(n in 1:N){
Y[n] ~ normal(mu, 1);
}
mu ~ normal( 0, 100)
}
model{
for(n in 1:N)){
target += normal_lpdf(Y[n]|mu, 1);
}
target += normal_lpdf(mu|0, 100)
}
targetを使った記法(Explict incremetal form) 簡略的コード(sampling statement form)
同じ
https://www.slideshare.net/simizu706/stan-64926504
視認性が高い
速い
target記法ではないと計算できない場合がある
遅い(定義された対数確率関数すべて計算)
𝑝 𝜇 𝑌 ∝ 𝑝 𝑌 𝜇 × 𝑝 𝜃 =
𝑛=1
20
𝑁𝑜𝑟𝑚𝑎𝑙 𝑌 𝑛 𝜇, 1 × 𝑁𝑜𝑟𝑚𝑎𝑙(𝜇|0,100)
𝒏=𝟏
𝟐𝟎
𝒍𝒐𝒈𝑵𝒐𝒓𝒎𝒂𝒍 𝒀 𝒏 𝝁, 𝟏 + 𝒍𝒐𝒈𝑵𝒐𝒓𝒎𝒂𝒍(𝝁|𝟎, 𝟏𝟎𝟎)
4.2.2のモデル式
4.2.2のモデル式の右辺を対数化
![Page 17: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/17.jpg)
4.4 単回帰 4.4.1 解析の目的
4.4.2 データの分布の確認
4.4.3 モデル式の記述
4.4.4 Rのlm関数で推定
4.4.5 Stanで実装
4.4.6 Rからの実行方法
4.4.7 RStanの結果の見方
4.4.8 収束診断をファイルへ出力する
4.4.9 MCMCの設定の変更
4.4.10 並列計算の実行方法
4.4.11 ベイズ信頼区間とベイズ予測区間の算出
4.4.12 transformed parametersブロックとgenerated quantitiesブロック
![Page 18: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/18.jpg)
4.4 単回帰
架空のデータとしてB社社員のデータを扱う
# 1 2 3 4 5 6 7 8 9 10
X(歳) 24 24 26 32 33 35 38 40 40 43
Y(万円) 472 403 454 575 546 781 750 601 814 792
# 11 12 13 14 15 16 17 18 19 20
X(歳) 43 44 48 52 56 56 57 58 59 59
Y(万円) 745 837 868 988 1092 1007 1233 1202 1123 1314
データ件数20件
input/data-salary.txt
![Page 19: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/19.jpg)
モデリングの手順の復習(Chapter.3)
# 手順 概要
1 解析の目的 データで何を知りたいんか、何を主張したいのか
2 データの分布の確認 ヒストグラムの作成、散布図の作成、クロス集計
3 メカニズムの想像 データを生成するメカニズム、データをつなぐメカニズムを考える
4 モデル式の記述 メカニズムをモデル式に落とし込む
5 Rでシミュレーション シミュレーションでモデル式がどのような形式か確認する
6 Stanで実装 Stanのコードを書く、パラメータの推定を実行する
7 推定結果の解釈 推定結果やベイズ信頼区間をもとに解釈したり
8 図によりモデルのチェック モデルがうまく当てはまっていそうか図でチェックする
統計モデリングは一定の手順がある。アヒル本では以下の手順で進めます
![Page 20: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/20.jpg)
4.4.1 解析の目的
解析の目的は「50歳の人がB社に中途採用された場合の年収」を回答する
変数 変数 サンプル 他の呼び方
年齢 説明変数 50歳 予測変数、共変量、特徴量、独立変数
年収 応答変数 結果変数、従属変数
手順1. 解析の目的
![Page 21: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/21.jpg)
4.4.2 データ分布の確認
メカニズムの想像
年齢が増えると年収が直線で増える関係がありそうと判断できる
データの分布の確認
手順2. データの分布の確認
手順3. メカニズムの想像
![Page 22: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/22.jpg)
4.4.3 モデル式の記述
モデル式Υ 𝑛 = 𝑦𝑏𝑎𝑠𝑒 𝑛 + 𝜀 𝑛 𝑛 = 1,2, … , 𝑁
𝑦𝑏𝑎𝑠𝑒 𝑛 = 𝑎 + 𝑏 𝑋[𝑛] 𝑛 = 1,2, … , 𝑁
𝜀 𝑛 ~ 𝑁𝑜𝑟𝑚𝑎𝑙(0, 𝜎) 𝑛 = 1,2, … , 𝑁
ybaseを消去をしたモデル式Υ 𝑛 = 𝑎 + 𝑏 𝑋 𝑛 + 𝜀 𝑛 𝑛 = 1,2, … , 𝑁
𝜀 𝑛 ~ 𝑁𝑜𝑟𝑚𝑎𝑙(0, 𝜎) 𝑛 = 1,2, … , 𝑁
𝜀 𝑛 を消去をしたモデル式
𝑦𝑏𝑎𝑠𝑒 𝑛 = 𝑎 + 𝑏 𝑋 𝑛 𝑛 = 1,2, … , 𝑁
Υ 𝑛 ~ 𝑁𝑜𝑟𝑚𝑎𝑙(𝑦𝑏𝑎𝑠𝑒 𝑛 , 𝜎) 𝑛 = 1,2, … , 𝑁
ybaseと𝜀 𝑛 を消去をしたモデル式Υ[𝑛]~ 𝑁𝑜𝑟𝑚𝑎𝑙 𝑎 + 𝑏 𝑋 𝑛 , 𝜎 𝑛 = 1,2, … , 𝑁
年収はデータ1人分ごとに平均𝑎 + 𝑏𝑋[𝑛] /標準偏差𝜎の正規分布から独立に生成される
データ/
パラメータ説明
𝑁 人数
Υ 𝑛 年収
𝑦𝑏𝑎𝑠𝑒 𝑛 基本年収
𝜀 𝑛 基本年収以外の影響ノイズ項
𝑎 直線式の切片
𝑏 直線式の傾き
𝜎 標準偏差
手順4. モデル式の記述
![Page 23: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/23.jpg)
4.4.3 モデル式の記述
モデル式Υ[𝑛]~ 𝑁𝑜𝑟𝑚𝑎𝑙 𝑎 + 𝑏 𝑋 𝑛 , 𝜎 𝑛 = 1,2, … , 𝑁
𝑛 = 1,2, … , 20
正規分布
平均: a+ b X n分散:σ
Υ 𝑛
グラフィカルモデル
パラメータ𝑎, 𝑏 , 𝜎の事前分布は無情報事前分布とする
手順4. モデル式の記述
![Page 24: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/24.jpg)
4.4.4 Rのlm関数で推定
lmの出力結果抜粋
パラメータ Estimate Std. Error t value Pr(>|t|)
Intercept -119.697 68.148 -1.756 0.096
X 21.904 1.518 14.428 2.47e-11
パラメータ 結果 補足
p-value 2.466e-11 有意確率
R-square 0.9204 目的決定係数
d <- read.csv(file='input/data-salary.txt')
res_lm <- lm(Y ~ X ,data=d)
lmの出力結果つづき
Rのlm関数(線形モデルのあてはめ)の実行例
あてはめ結果を散布図に追加
手順5. Rでシミュレーション
P40.lm.R(改造)
![Page 25: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/25.jpg)
4.4.4 Rのlm関数で推定
X_new <- data.frame(X=50)
predict(res_lm,X_new,interval='confidence',level=0.95)
predict(res_lm,X_new,interval='prediction',level=0.95)
手順5. Rでシミュレーション
区間名 信頼区間 予測区間
0.025 976万円 803万円
0.5 976万円 976万円
0.975 1,021万円 1,147万円
年齢50歳との時年収の信頼区間と予測区間
![Page 26: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/26.jpg)
4.4.5 Stanで実装data{
int N;
real X[N];
real Y[N];
}
parameters {
real a;
real b;
real<lower=0> sigma;
}
model{
for(n in 1:N){//尤度
Y[n] ~ normal(a + b *X[n], sigma);
}
}
'
データ/
パラメータ説明
int N; 人数
real X[N]; 年齢
real Y[N]; 年収
real a; 直線式の切片
real b; 直線式の傾き
real<lower=0> sigma;
標準偏差下限0
model4-5.stanの説明 model4-5.stan
手順6. Stanで実装
![Page 27: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/27.jpg)
4.4.6 Rからの実行方法
d <- read.csv(file='input/data-salary.txt')
data <- list(N=nrow(d), X=d$X, Y=d$Y)
fit <- stan(file='model4-5.stan', data=data, seed=1234)
stanを呼び出すことで、サンプリングを実行する
パラメータ 結果
file stan形式で記載されたモデルファイル
data データブロックで指定された変数のリスト
seed 乱数ジェンレータの種
◆ rstanでstanファイルを実行
stanの主なパラメータ(全パラメータはappendix参照)
P40. run-model4-5.R(抜粋)
手順6. Stanで実装
![Page 28: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/28.jpg)
4.4.7 RStanの結果の見方
パラーメータ mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
a -125.65 1.92 73.18 -270.62 -174.77 -126.36 -75.76 13.87 1457 1
b 22.04 0.04 1.63 18.96 20.92 22.05 23.11 25.21 1504 1
sigma 84.35 0.38 14.73 60.99 73.7 82.61 92.83 117.42 1539 1
lp__ -93.57 0.03 1.23 -96.62 -94.15 -93.27 -92.65 -92.14 1296 1
summary(fit)$summary
値 説明
mean サンプルの平均値。事後平均(Posterior Mean)とよばれる
se_mean 標準誤差「MCMCサンプルの分散をn_effで割った値のルート」
sd MCMCの標準偏差
n_eff 実効的なMCMCサンプル数(100以上が望ましい)
Rhat アールハット。MCMCが収束したかを示す指標の一つ。アヒル本では「chain数が3以上ですべてのパラメータの Rhatが1.1以下」を収束とする
手順7. 推定結果の解釈
◆ stanのサンプリング結果のサマリの見方®
summaryの主な項目の説明
![Page 29: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/29.jpg)
4.4.8 収束診断をファイルへ出力する
収束と判断した根拠はファイルに保存する
summaryやtrace plotが根拠になる
ggmcmcパッケージでtrace plotをpdf出力できる
Rstanにも作図関数があるが、見栄えを良くするには手間がかかる
出力 概要
save.image ワークスペースの保存データやサンプリング結果を保存
write.table Datafreameの保存summary(fit)$summary を保存する
ggmcmc stanfitクラスからtrace plotなどの収束診断結果をpdfに出力できる
Chapter4 における収束診断を出力するRの関数
#R
write.table(
data.frame(summary(fit)$summary),
file='fit-summary.txt',sep=’¥t',quote=FALSE,col.names=NA)
手順8. 図によるモデルのチェック
◆ summaryのtxtファイル出力例(R)
P42. rstan-save-diagnostics.R(抜粋)
![Page 30: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/30.jpg)
4.4.8 収束診断をファイルへ出力する
Trace Plotとは
横軸にステップ数、縦軸にパラメータのMCMCサンプルの値をとった折れ線グラフ
右の図はggmcmcの出力結果
Chain数は4
100ステップくらいで収束している
判断項目 基準
chainの比較 4つのchainの形状が同じ
Warmup後 Warm up後のステップを繰り返しても事後分布の形状が同じ
手順8. 図によるモデルのチェック
Trace Plotの判断項目と基準
Trace Plot図
![Page 31: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/31.jpg)
4.4.8 収束診断をファイルへ出力する
#library(ggmcmc)
ggmcmc(
ggs(fit,inc_warmup=TRUE,stan_include_auxiliar=TRUE),
file='fit-traceplot.pdf',
plot='traceplot')
パラメータ 概要
D シミュレーション結果の DataFreameで設定 ,ggsがstanfitをDataFreameに変換
file 出力するpdfファイル名
plot 描画の内容。描画できる内容はTrace Plot以外にもヒストグラム、密度関数、事後平均の推移、自己相関、パラメータ間の相関行列、収束診断用スコアなどがある
ggmcmcは、ggplot2 を利用したMCMCの収束を診断するためのパッケージ
手順8. 図によるモデルのチェック
ggmcmcの主なパラメータ(全パラメータはappendix参照)
ggmcmcによるTrace Plot出力例(R)
P42. rstan-save-diagnostics.R(抜粋)
![Page 32: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/32.jpg)
4.4.9 MCMCの設定の変更
パラメータ 初期値 説明
stanmodel - Stanのモデルクラス
data - データブロックで指定された変数
seed random 乱数ジェンレータの種
init NA 初期値の設定
chains 4 MCMCサンプルする回数
iter 2000 chain内のステップ数。warmupを含む
warmup iter/2 モデルに依存。100-500で良い場合が多い
thin 1 保存するステップの間隔
stanmodel <- stan_model(model_code=stancode)
fit <- sampling(
stanmodel,
data=data,
pars=c('b','sigma'),
init = function(){
list(
a=runif(1,-10,10),
b=runif(1,0,10),
sigma=10
)
},
seed=123,
chains=3,
iter=1000,
warmup=200,
thin=2
)
パラメータ 説明
model_code stan形式で記載されたモデルファイル
◆STEP1. stan_model:stanのモデルクラスを構築
◆STEP2. sampling:stanのモデルクラスからサンプリングを実施
P44. rstan-modify-MCMCsettings.R
stan_modelの主なパラメータ
samplingの主なパラメータ
![Page 33: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/33.jpg)
4.4.9 MCMCの設定の変更
seedの値が同じでもアヒル本と同じ結果にならないことが多い、著者松浦さんに問い合わせたところ、回答をいただきました
Stanの結果は以下のすべての要素が一致しているときにのみ厳密に再現可能となります:
Stanのバージョン
Stanのインターフェイス(Rstan, PyStan, CmdStan) およびそのバージョン, さらにインターフェイス言語(R, Python, shell)のバージョン
インクルードされたライブラリのバージョン(BoostおよびEigen)
OSのバージョン
CPU, マザーボード, メモリを含むコンピュータのハードウェア
C++コンパイラのバージョン, コンパイル時のフラグ, リンクされたライブラリ
乱数の種, チェーンのID, 初期化およびデータを含むStan呼び出し時の設定
Stanのマニュアル「64.再現性(Reproducibility)について」抜粋https://stan-ja.github.io/gh-pages-html/#再現性reproducibilityについて
![Page 34: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/34.jpg)
4.4.10 並列計算の実行方法
Stanでは、デフォルトではChainを逐次実行しているが、並列化することもできる
並列化の設定スクリプト
rstan_options(auto_write=TRUE) #モデルをコンパイルした時に自動保存する
options(mc.cores=parallel::detectCores()) #並列計算
メリット デメリット
計算時間の短縮 進捗状況が確認できないエラーメッセージが確認できない
並列化のメリット・デメリット
stan(model_code=stancode, data=data, ,seed=1234,cores=4)
stan関数のcoresオプションでも可能(coresオプションが推奨らしい)
![Page 35: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/35.jpg)
4.4.10 並列計算の実行方法
stan(model_code=stancode,
data=data, ,seed=1234,cores=4,open_progress=TRUE,diagnostic_file="aaa.txt",sample_file="bbb.txt")
![Page 36: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/36.jpg)
4.4.11 ベイズ信頼区間とベイズ予測区間の算出
区間名 数式 Rスクリプト
ベイズ信頼区間 𝑝 𝜃 Υ ms$a + ms$b * X
ベイズ予測区間𝑝 𝑦 𝑋, Υ = 𝑝 𝑦 𝜃 𝑝 𝜃 Υ ⅆ𝜃
rnorm(n=サンプル数,
mean=ms$a + ms$b * X,sd=ms$sigma)
区間名 ベイズ信頼区間 ベイズ予測区間
0.025 932万円 805万円
0.5 975万円 978万円
0.975 1,021万円 1,160万円
y50_base <- ms$a + ms$b * 50
y50 <- rnorm(n=length(ms$lp__),mean=y50_base,sd=ms$sigma)
d_mcmc <- data.frame(a=ms$a,b=ms$b,sigma=ms$sigma,y50_base,y50)
quantile(d_mcmc$y50_base,probs=c(0.025,0.5,0.975))#ベイズ信頼区間
quantile(d_mcmc$y50,probs=c(0.025,0.5,0.975))#ベイズ予測区間
50歳の人のベイズ信頼区間とベイズ予測区間をもとめるRスクリプト
P49. rstan-etract-MCMCsamples.R(改変)
手順7. 推定結果の解釈
![Page 37: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/37.jpg)
4.4.12 transformed parametersブロックとgenerated quantitiesブロック
data{
int N;
real X[N];
real Y[N];
int X_new; #予測したい年齢
}
parameters {
real a;
real b;
real<lower=0> sigma;
}
generated quantities {
real y_base_new; #基本年収
real y_new; #ノイズ項も考慮した年収
y_base_new = a + b * X_new;
y_new = normal_rng(y_base_new,sigma);
}
transformed parameters{
real y_base;
for( n in 1:N){
y_base[n] = a + b*X[n];
}
}
model{
for(n in 1:N){
Y[n] ~ normal(y_base[n] , sigma);
}
}
transformed parameters とgenerated quantities を用いたstanファイル
P50. model4-4.stan(改変)
Rでベイズ信頼区間とベイズ予測区間を求めると、コードが複雑になりバグが発生しやすい、またパフォーマンスが悪いStan側でベイズ信頼区間とベイズ予測区間を求めることができる
以下のモデル式に該当𝑦𝑏𝑎𝑠𝑒 𝑛 = 𝑎 + 𝑏 𝑋 𝑛
Υ 𝑛 ~ 𝑁𝑜𝑟𝑚𝑎𝑙(𝑦𝑏𝑎𝑠𝑒 𝑛 , 𝜎) y_base_new:基本年収y_new :ノイズ項も考慮した年収
![Page 38: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/38.jpg)
4.4.12 transformed parametersブロックとgenerated quantitiesブロック
data<- list(N=nrow(d),X=d$X,Y=d$Y,X_new=50)#X_newに50をセット
fit <- stan(model_code=stancode, data=data, seed=1234)
ms<-rstan::extract(fit)
quantile(ms$y_base_new,probs=c(0.025,0.5,0.975))
quantile(ms$y_new,probs=c(0.025,0.5,0.975))
区間名 Rベイズ信頼区間
Stanベイズ信頼区間
Rベイズ予測区間
Stanベイズ予測区間
0.025 932万円 931万円 805万円 806万円
0.5 975万円 976万円 978万円 976万円
0.975 1,021万円 1,022万円 1,160万円 1,158万円
50歳の人のベイズ信頼区間とベイズ予測区間をもとめるStan / RStan
P51. run-model4-4.R(改変)
generated quantities を用いることで2行でベイズ信頼区間とベイズ予測区間が取得できた
![Page 39: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/39.jpg)
4章まとめ手順 今回の内容
解析の目的 「50歳の人がB社に中途採用された場合の年収」を回答する
データの分布の確認 散布図を描いた
メカニズムの想像 年齢が増えると年収が直線で増える
モデル式の記述 Υ 𝑛 ~ 𝑁𝑜𝑟𝑚𝑎𝑙 𝑎 + 𝑏 𝑋 𝑛 , 𝜎 n = 1,…,N
Rでシミュレーション lm(Y~X,data=d)
Stanで実装 Chain数は3以上、step数は1,000以上
推定結果の解釈 n_effが100以上か、Rhatが1.1未満かなどを確認
図によりモデルのチェック Trace plotで収束しているかを確認
50歳の人がB社に入ると年収は976万円になる可能性が一番多い
97.5%以上の確率で806万円貰える
ベイズ信頼区間、ベイズ予測区間はstan側で実行したほうが良い
![Page 40: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/40.jpg)
Chapter4で使うrstanコマンド:stan
引数 初期値
file stan形式で記載されたモデルファイルを指定
model_name モデルを表す文字名を指定 anon_model
model_code stan形式で記載されたモデル文字列を指定 NA
fit Stan Fitファイルを指定。コンパイルされたモデルで実行するため高速 NA
data データブロックで指定された変数のリストを指定
pars サンプリング結果を出力するパラメータを指定 NA
chains chainのステップ数を指定 4
iter iterのステップ数を指定 2000
warmup warmupのステップ数を指定 Iter/2
seed 乱数ジェンレータの種を指定 random
StanでMCMCする
戻り値は、Stan Fitクラス
![Page 41: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/41.jpg)
Chapter4で使うrstanコマンド:stan つづき
引数 説明 初期値
thin サンプリングを出力する頻度 1
init パラメータの初期値。デフォルトでは-2と2の間のランダムに生成 random
algorithm アルゴリズムを指定.NUTS,HMC,Fixed_param NUTS
sample_file sampleおよびquantileを出力する場合のファイル名を指定 NA
diagnostic_file 診断を出力する場合のファイル名を指定 NA
save_dso モデルをOSの共有メモリに保存するかを指定。次回高速に実行される TRUE
verbose デバッグ用のメッセージを出力するかを指定 FALSE
control サンプラーが制御するパラメータのリストを指定。 NULL
include parsで指定したパラメータを含むか含まないかを指定 TRUE
cores Chainを並列実行する時のコア数を指定。chain数まであげることができる 1
open_progress coresが1以上の場合にchainの進捗をファイルにリダイレクトするかを指定 TRUE?
boost_lib ベクトル演算ライブラリBoostのパスを指定(変更したい場合) NA
eigen_lib ベクトル演算ライブラリEigenのパスを指定(変更したい場合) NA
![Page 42: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/42.jpg)
Chapter4で使うrstanコマンド:extract
引数 説明 初期値
object stanfitクラスを指定
pars 抽出するパラメータを指定する NULL
permuted 抽出結果にMCMCサンプルを混ぜ合わせて並べ替えるかデフォルトでは、分析ミスを防止するために混ぜ合わせているとのこと
TRUE
inc_warmup 抽出結果にwarmup期間のMCMCサンプルを含めるか FALSE
include Parsで指定したパラメータを抽出結果に含めるか、除外するか TRUE
Stan fitクラスからMCMCサンプルの結果をえる. P47,P51
戻り値は、名前付きリスト
![Page 43: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/43.jpg)
Chapter4で使うrstanコマンド:ggmcmc
引数 説明 初期値
D シミュレーション結果の DataFreameを指定,ggsがstanfitをDataFreameに変換
file 出力するpdfファイル名を指定
plot 描画の内容を指定。描画できる内容はTrace Plot以外にもヒストグラム、密度関数、事後平均の推移、自己相関、パラメータ間の相関行列、収束診断用スコアなどがある
family ファミリーとするパラメータを正規表現で指定する NULL
param_page 1ページで表示するパラメータ数 5
width PDFの横幅を指定 7
height PDFの縦幅を指定 10
simplify_traceplot 時系列でイテレーションするパーセントを指定
dev_type_html HTML出力する出力タイプを指定 png
MCMC(ハァハァ)した結果をplotする
ggmcmc(D, file = "ggmcmc-output.pdf", family = NA, plot = NULL, param_page = 5, width = 7, height = 10, simplify_traceplot = NULL, dev_type_html = "png", ...)))
![Page 44: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/44.jpg)
Chapter4で使うrstanのオブジェクト:stanfit(S4 class)
slot 説明
model_name モデル名
model_pars パラメータの名前が入った文字ベクトル
per_dims すべてのパラメータの次元つき名前つきリスト
mode Fitting modelの結果の整数(0:サンプリング、1:test
gradient 、2:error) 0のとき他の有効
sim メタデータを含むシミュレーション結果のリスト
inits chain毎のパラメータの初期値のリスト
stan_args chain毎の引数のリスト
stanmodel Stanmodelのインスタンス(S4 class)
date Objectが作成された日時
.MISC: モデルに関する雑多な情報
![Page 45: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料](https://reader033.vdocuments.net/reader033/viewer/2022052211/5a6479717f8b9a4c568b4695/html5/thumbnails/45.jpg)
Chapter4で使うrstanコマンド:rstan_options
引数
plot_rhat_cols
plot_rhat_breaks
plot_rhat_nan_col
plot_rhat_large_col
rstan_alert_col
rstan_chain_cols
rstan_warmup_bg_col
boost_lib
auto_write