nagoyastat#7 stanとrでベイズ統計モデリング(アヒル本)4章の発表資料

45
StanRでベイズ統計モデ リング(アヒル本) Chapter 4 NagoyaStat #7 @nishiokya

Upload: nishioka1

Post on 21-Jan-2018

430 views

Category:

Science


1 download

TRANSCRIPT

Page 1: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

StanとRでベイズ統計モデリング(アヒル本)

Chapter 4NagoyaStat #7

@nishiokya

Page 2: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

@nishiokya 近況

先月 Tableau Conference @ Las Vegasに行ってきました

https://qiita.com/nishiokya/items/7736dc3c7add8f156940

Page 3: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

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章の発表資料

StanとRでベイズ統計モデリングChapter4 目次

4.1 StanとRStanの準備

4.2 Stanの基本的な文法

4.3 Stanのlp__とtarget

4.4 単回帰¶

補足と文献案内

練習問題

Page 5: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

Chapter4 StanとRをはじめよう

Chapter4で習うこと

1. Stanのインストール方法や、基本的な文法を説明

2. 単回帰の例題を通して実際にRStanを用いてRからStanを実行

3. MCMCサンプルを得る

4. ベイズ信頼区間・ベイズ予測区間を計算

5. 推定結果の見方とMCMCの設定変更

Page 6: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

今日の進め方

4章をChapterに従い説明します

4章で使うRStanコマンドの使い方をより詳しく説明します

stan

extract

ggmcmc

Stan fit

Page 7: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

4.1 StanとRStanの準備

必要なもの Windows 7,8,10 Mac

R3.0.2以降 ○ ○

RStan ○ ○

RTools ○ ○

C++ Tools 不要 ○

Page 8: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

4.2 Stanの基本的な文法

4.2.1 ブロック構成

4.2.2 文法の基礎

4.2.3 コーディング規約

Page 9: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

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章の発表資料

4.2.1 ブロック構成基本的構造

data{

観測されたデータ𝑌宣言

}

parameters{

サンプリングしたいパラメータ𝜃の宣言

}

model{

尤度𝑝(𝑌|𝜃)の記述

事前分布𝑝(𝜃)の記述

}

ブロック名 説明

data modelブロックで使う観測されたデータを記述RからStanに渡される

parameters 推定すべきパラメータ(確率変数)を記述値が決まっていない確率変数はすべてparametersに記載する

model 尤度、事前分布の記述事前分布が無情報の場合は省略できる

Page 11: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

4.3 Stanのlp__とtarget

Stanは事後確率の高いところを効率的に探索している

事後確率を効率的に探索するために対数事後確率を偏微分した値を使う

𝑙𝑜𝑔𝑝 𝜃 𝑌 = 𝑙𝑜𝑔𝑝 𝑌 𝜃 + 𝑙𝑜𝑔𝑝 𝜃 + 𝑐𝑜𝑛𝑠𝑡.

MCMCステップ毎の対数事後確率(lp__)というパラメータとして内部で保持している

𝑙𝑜𝑔𝑝 𝑌 𝜃∗ + 𝑙𝑜𝑔𝑝 𝜃∗

targetはlp__のエイリアス

targetは7.8節、11章で必要になる

Page 16: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

モデリングの手順の復習(Chapter.3)

# 手順 概要

1 解析の目的 データで何を知りたいんか、何を主張したいのか

2 データの分布の確認 ヒストグラムの作成、散布図の作成、クロス集計

3 メカニズムの想像 データを生成するメカニズム、データをつなぐメカニズムを考える

4 モデル式の記述 メカニズムをモデル式に落とし込む

5 Rでシミュレーション シミュレーションでモデル式がどのような形式か確認する

6 Stanで実装 Stanのコードを書く、パラメータの推定を実行する

7 推定結果の解釈 推定結果やベイズ信頼区間をもとに解釈したり

8 図によりモデルのチェック モデルがうまく当てはまっていそうか図でチェックする

統計モデリングは一定の手順がある。アヒル本では以下の手順で進めます

Page 20: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

4.4.1 解析の目的

解析の目的は「50歳の人がB社に中途採用された場合の年収」を回答する

変数 変数 サンプル 他の呼び方

年齢 説明変数 50歳 予測変数、共変量、特徴量、独立変数

年収 応答変数 結果変数、従属変数

手順1. 解析の目的

Page 21: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

4.4.2 データ分布の確認

メカニズムの想像

年齢が増えると年収が直線で増える関係がありそうと判断できる

データの分布の確認

手順2. データの分布の確認

手順3. メカニズムの想像

Page 22: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

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章の発表資料

4.4.3 モデル式の記述

モデル式Υ[𝑛]~ 𝑁𝑜𝑟𝑚𝑎𝑙 𝑎 + 𝑏 𝑋 𝑛 , 𝜎 𝑛 = 1,2, … , 𝑁

𝑛 = 1,2, … , 20

正規分布

平均: a+ b X n分散:σ

Υ 𝑛

グラフィカルモデル

パラメータ𝑎, 𝑏 , 𝜎の事前分布は無情報事前分布とする

手順4. モデル式の記述

Page 24: NagoyaStat#7 StanとRでベイズ統計モデリング(アヒル本)4章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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章の発表資料

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