要因計画データに対する
ベイズ推定アプローチ
2017.02.15 @北海道大学
本日の発表内容
1. ベイズ推定とは
2. RStanを用いたベイズ推定
3. 要因計画データに対するベイズ推定
アプローチ
・2群の差の推定 (対応なし)
・2群の差の推定 (対応あり)
・2要因群間計画データの推定
・混合計画データの推定
4. Tips
自己紹介
氏名:山根 嵩史
所属:広島大学大学院 教育学研究科
学習心理学研究室
専門:記憶課題遂行のメタ認知的制御
興味:虚記憶,忘却,マインドワンダ
リングなど
留意事項:
ベイズの専門家ではありません
ベイズ推定とは
What is BAYES?
ベイズ統計の考え方
ベイズ統計は,母数とデータの扱いが従来
の頻度主義統計学とは異なる
データから
母平均μの分布
が得られる
データから
母平均μの真値
を推定する
頻度主義統計学では…
母数 = 定数
データ = 確率変数
ベイズ統計では…
母数 = 確率変数
データ = 定数
ベイズ統計では,母数(知りたい値)が分布
として得られる
ベイズ統計の考え方
パラメータが分布として得られることで,
ベイズ統計では「仮説がどの程度確からし
いか」を確率で表現できる
e.g.,) 仮説H1:母平均μ > 0
0.00
0.05
0.10
0.15
0.20
0.25
0.30
0.35
0.40
0.45
-2 -1 0 1 2 3 4 5 6 7
分布の97%
母平均μの事後分布
のうち,> 0となる
部分の面積の割合が
仮説H1が正しい確
率となる
ベイズ推定とは:事前/事後分布
事後分布 = 知りたいパラメータの分布
事後分布を求めるにはベイズの公式を使用
P q | x( )µP(x |q)P q( )
P(θ|x)はデータxが得られたときに母数がθであ
る確率を表す条件付き確率 → 事後分布
P(x|θ):母数がθのときデータxが得られる確率
→ データ分布(尤度)
P(θ):データによらず母数が発生する確率
→ 事前分布
事前分布に得られたデータ(尤度)を掛け合
わせることで,知りたい母数の分布(事後
分布)を得る推定法
要するにベイズ推定とは
事前分布は分析者が決める
通常はパラメータに合った事前分布を選択
平均値・回帰係数 → 正規分布・コーシー分布
標準偏差・分散 → 半コーシー分布
確率・比率 → ベータ分布・一様分布
困ったらとりあえず無情報な一様分布
扱うデータに応じて適切な事前分布を選択
する必要がある
分布はそれぞれパラメータによって位置や
形状が決まる
分布とパラメータ
正規分布 (平均,標準偏差)
→ normal(mu, sigma)
二項分布 (試行数,確率)
→ binomial(N, theta)
※分布とパラメータの解説としては『StanとRでベイズ統計モ
デリング』6章や『基礎からのベイズ統計学』の付録が詳しい
ベイズ推定では多変量確率分布からの乱数
発生法であるマルコフ連鎖モンテカルロ
(MCMC) 法を用いて事後分布を生成する
MCMCによる事後分布生成
ランダムサンプリングを繰り返すことで,
パラメータの事後分布が定常分布として得
られる
MCMC法はランダムな初期値からパラメー
タの推定値をサンプリング
→ 最初の方の推定値は初期値に依存する
ので,推定結果から省く(バーンイン期間)
推定値が収束したことを判断するため,
複数のサンプリング
→ チェイン
MCMCに関する用語
初期のサンプリングは
初期値に依存する
サンプリングが適切に行われたかどうかは,
視覚的および数値的に評価する
収束診断
トレースプロットに基づく視覚的な評価
→ 各チェインの値が区別できず,一定の
範囲内に収まっていればOK
収束判定指標(Rhat)に基づく評価
→ チェイン間の散らばりの指標
1.1〜1.2以下であればOK
ベイズ推定の結果の解釈は,事後分布を分析す
ることにより行われる
結果の解釈
母数の平均が知りたい
→ EAP(事後期待値 = 事後分布の平均値)をもとに判断
母数が左右均等な分布でないときの代表値が知りたい
→ MAP(最大事後確率 = 事後分布の最大値)から判断
母数の散らばりが知りたい
→ 事後分散・事後標準偏差をもとに判断
条件間に差があるかを知りたい
→ 差の事後分布の95%確信区間を求め,0が含まれ
るかどうかで判断
研究仮説を表現するような値を生成すれば,事
後分布から仮説に関する解釈ができる
 ベイズ推定において,「95%の確率で
求めるパラメータがその範囲内に入
る」区間を95%確信区間(credible
interval)という
 頻度主義の95%信頼区間 (confidence
interval) が↑のように捉えられているこ
とがあるが,頻度主義では真値は固定
値なので,真値が「この辺りにある」
と考えることはできない
確信区間(CI)とは
 95%確信区間は,95%最高密度区間
(HDI: Highest Density Interval)として出
力される
 事後分布の95%HDIをもとに母数につい
ての判断や仮説に関する判断を行う
最高密度区間(HDI)
“条件間のパラメータの差”
の95%HDIに0が含まれていない
→ 条件間に差があると判断
ランダムな初期値からサンプリングを行う
ので,同じモデルでもサンプリングを行う
度に結果が微妙に変わる
収束してればOKだが,結果の報告の際に
異なる数値を載せるのはなんかちょっと…
→ サンプリングの前にset.seed() (後述)
結果を見るときの注意点
 パラメータの性質:知りたいパラメータ
が固定値ではなく分布で得られる
 推定方法:パラメータに関するいくつか
の条件をもとに無数にサンプリングを行
うことで,パラメータの事後分布を得る
 結果の解釈:事後分布の要約統計量
(EAP,MAPなど)や確信区間をもとに,
仮説が支持されたかどうかを解釈する
ベイズ的考え方のまとめ
RStanを用いたベイズ推定の実施
How to use RStan?
ベイズ推定の実施
今回は無償+R上で実行できるRStanを使
用する
MCMCを行えるソフトウェアは,他にもWinBugs,
JAGS,Mplus,SASなど
http://mc-stan.org/
余談:RStudioが便利
RStudioはStanコードを書くのに便利
予約語のハイライト シンタックスのチェック
Stanを使ったベイズ推定の流れ
①分析モデルをStanコードで表現
②RStanでパラメータの推定
③収束診断
④結果の解釈
ひとまず,1つのパラメータを推定
してベイズ推定の流れをつかんで
みましょう
サンプルデータ
 2要因 (2×2)
 30問の正答数のデータ
 condition A1, A2はbetween
 pre, postはwithin
 各条件20名
《sample01.csv を参照してください》
サンプルデータ
1人目の参加者のpreのデータから,正
答率pを推定してみる
30問のうち12問正答したというデータ
二項分布 (試行数,確率)
モデル:正答数x ~ binomial(30, 正答率p)
※RStanの使い方の練習なので
「そんな分析するか?」という
ツッコミはナシで
①Stanコードでモデルを表現
Stanでは独自の記法のStanコードでモデル
を表現する
ブロックごとに記述
(順番は固定)
・function {}
・data{}
・transformed data{}
・parameters{}
・transformed parameters{}
・model{}
・generated quantities{}
正答率の推定:Stanコード
function {}ブロック
自作関数の定義
今回は使わない
data{}ブロック
分析に用いるデータの
定義を宣言
変数の種類,下限と上限
int<lower=0,upper=30> x;
「正答数の変数xは0~30の値をとる整数である」
※データ自体はStanコードの外から取り込む
《p.stanを参照してください》
正答率の推定:Stanコード
transformed data{}ブロック
dataの変形を記述
今回は使わない
parameters{}ブロック
推定したいパラメータと
その定義を宣言
real<lower=0, upper=1> p;
「正答率pは0〜1の実数」
正答率の推定:Stanコード
transformed parameters{}
parameterの変形を記述
今回は使わない
model{}ブロック
具体的な統計モデル
x ~ binomial (30, p);
「正答数xは試行数30,
正答率pの二項分布に従う」
generated quantities{}ブロック
生成量の記述 今回は使わない
Stanコードの保存と読み込み
モデルを記述したStanコードは,分析用の
Rコードとは別に保存する
RStudioでtxtファイル
を作成・保存し…
拡張子を“.stan”に
変えるとStanコードに
②RStanでパラメータの推定
Rの“rstan”パッケージを使って,Stanコー
ドの読み込みとパラメータの推定を行う
Stanコードのdata{}ブロックで定義した変
数名に対応したデータを記述
※データはlist型である必要がある
stan_model()関数でStanコードを読み込む
(コンパイルするので時間がかかる)
②RStanでパラメータの推定
sampling()関数でサンプリングを実行
引数としてモデルとデータを指定
その他の引数で,MCMCの細かい設定も可能
デフォルトでも構わない
pars:結果を出力する変数名を指定
warmup:初期値の影響を排除するためのバーンイン
期間の設定
chains:チェインの数の設定
iter:各チェインの繰り返し数の設定
seed:乱数のシードの設定
③収束診断
トレースプロットや自己相関の出力から,
サンプリングが収束しているかどうか判断
③収束診断
トレースプロットや自己相関の出力から,
サンプリングが収束しているかどうか判断
④結果の解釈
事後分布を見て結果を解釈
正答率pについて,EAP=0.41
95%確信区間(CI)は[0.25, 0.57]
Stanコードを書く際の注意点
ブロック内の行末にセミコロンをつける
最後のブロックを閉じた後に改行をいれる
忘れると怒られる
忘れると
やっぱり
怒られる
RStanの警告について
赤い文字が出るのでびっくりするが,無視
して良い警告もある
いくつかの値が不正であることを警告している(らしい)
“count”の数が小さければ気にしなくてよい
「ヒストグラムの幅は適当に調節してね」というメッセージ
要因計画データに対するベイズ
推定アプローチ
How to BAYES the designed data?
要因計画データに対するアプローチ
 ベイズ推定では,所与のデータから,
興味のあるパラメータの事後分布を推
定する
 要因計画データにおいては,多くの場
合,条件間の差を検討することが目的
 なので,各条件のパラメータに加えて,
パラメータ同士の差を推定し,事後分
布を解釈する
ベイズ推定だと何が良いか
 「条件間に差があるかどうか」だけで
なく,例えば
「母平均は規定値より大きいか?」
「条件間の差は規定値以上か?」
といった実質科学的な仮説について確率
的に判断することができる
※帰無仮説検定におけるp値=「帰無仮説(条件間に差
がない)が正しいと仮定したとき,手元のデータ以上の
差が生じる確率」
《bayesforDD.Rを参照してください》
ここからは“bayesforDD.R”のファイルを
RStudio上で開いてお聞きください
“bayesforDD.R”を右クリック
→ファイルを開くプログラムを指定
→RStudioを選択 すると自動でWDが設定されて便利
2群の差の推定(対応なし)
まずは対応のない2群の差の検討(t検定的
なもの)から
サンプルデータのpreにおける,condition1
とcondition2の正答数の平均を比較
・・・
2群の差の推定:Stanコード
data{}ブロック
int<lower=0> N1;
int<lower=0> N2;
int<lower=0,upper=30> x1[N1];
int<lower=0,upper=30> x2[N2];
N1, N2 → 各群の参加者数
x1, x2 → 各群のデータ
x1[N1]で「データがN1個分ある」
ことを表す
変数の型や下限・上限の指定は
先ほどと同様
《2group.stanを参照してください》
2群の差の推定:Stanコード
parameters{}ブロック
real <lower=0,upper=30> mu1;
real <lower=0,upper=30> mu2;
real <lower=0> sigma1;
real <lower=0> sigma2;
各群の平均μ1, μ2と
分散σ1, σ2を定義
model{}ブロック
x1 ~ normal(mu1, sigma1);
x2 ~ normal(mu2, sigma2);
それぞれの正答数について
モデル式を記述
2群の差の推定:Stanコード
generated quantities{}
real diff;
diff = mu2-mu1;
このブロックでは,定義した
パラメータを組み合わせて
任意の生成量を作れる
※作った生成量はブロック内で
宣言する必要があるので注意
ここではmu2からmu1を引く
ことで「2群の正答数の差」
を作成している(その他は後述)
2群の差の推定:Rコード
データを記述
各群の人数N1,N2とデータx1,x2
(データはサンプルデータより抜き出して使用)
list型でなければならないので注意
2群の差の推定:Rコード
サンプリング・結果の出力
2群のそれぞれの平均正答数 (mu1, mu2)と
条件間の正答数の差(diff)について,トレー
スプロット・事後分布などを出力
2群の差の推定:結果の解釈
差の事後分布の95%HDIは[1.51,2.36]
確信区間に0が含まれていないので,条件
間には差があると考えてよい
より柔軟な仮説の検討
差があることは分かったが,どれくらいの差?
generated quantities{}で生成量を定義すること
で,例えば
「平均正答数に2問以上の差がある確率」
などを求めることもできる
diffが特定の値以上であれば
1を返すような変数を定義
EAP(事後分布の平均)をもとに解釈
mu2 – mu1 > 1 は100%
mu2 – mu1 > 2 は41%
2群の差の推定(対応あり)
 対応のある(1つの対象から複数測定され
ている)データを扱うためには,多変量
用の分布を用いることになる
 正規分布から発生する2つの変数であれ
ば,2変量正規分布
→ 『新訂 心理統計法−有意性検定からの脱却』
p.121のイメージ図を参照
多変量正規分布の引数
多変量正規分布は引数としてベクトルと共
分散行列を持つので,データをその型に合
わせる必要がある
多変量正規分布 (ベクトル, 共分散行列)
→ multi_normal(mu, Sigma)
muとsigmaをそれぞれ
ベクトルとして宣言
transformed parameters{}
ブロックで共分散行列を作成
2群の差の推定(対応あり)
サンプルデータのcondition A1におけるpre
とpostの平均正答数を比較
・・・
2群の差の推定(対応あり):Stanコード
data{}ブロック
int<lower=0> N;
vector[2] x[N];
参加者数とデータをベクトル型で
宣言している
《2group_within.stanを参照してください》
parameters{}ブロック
vector[2] mu;
vector<lower=0>[2] sigma;
real<lower=-1, upper=1> rho;
平均値と分散をベクトル,相関を
−1 ~ 1の実数で宣言している
2群の差の推定(対応あり):Stanコード
transformed parameters{}ブロック
matrix[2,2] Sigma;
parameters{}ブロックで宣言した
パラメータをモデルに合うように
変形する
ここでは2変量正規分布の引数に
使うため,sigmaを使って2×2の
共分散行列を作成している
2群の差の推定(対応あり):Stanコード
transformed parameters{}ブロック
matrix[2,2] Sigma;
Sigma[1,1] = sigma[1]*sigma[1];
Sigma[2,2] = sigma[2]*sigma[2];
Sigma[1,2] = sigma[1]*sigma[2]*rho;
Sigma[2,1] = sigma[2]*sigma[1]*rho;
共分散行列のそれぞれの要素を指定
対応ありのデータなので,非対角項
に相関(rho)が掛けられている
2群の差の推定(対応あり):Stanコード
model{}ブロック
for(i in 1:N){
x[i] ~ multi_normal(mu,Sigma);
for文を使って2変量正規分布に
従うモデル式を記述
※muはベクトル,Sigmaは行列型
generated quantities{}
real diff;
diff = mu[2] – mu[1];
平均値の差の生成量を作成
2群の差の推定(対応あり):Rコード
データを記述
ベクトル型に渡すため,structure()関数
を使ってデータを整形している
.Dim引数でデータの構造を指定(20×2)
2群の差の推定(対応あり):Rコード
サンプリング・結果の出力
対応なしの場合と同様
2要因群間計画データの推定
 2要因計画では,各要因の主効果と交互
作用の推定を行う
 2×2の群間計画におけるデータの発生メ
カニズムを考えてみる
・・・
※仮想データはpre, postだが
仮に群間計画だと考える
2要因群間計画データの推定
 2つの要因の効果と交互作用がない場合,
各条件のμは等しくなる
 そこに要因Aと要因Bの
効果が加わる
・・・
要因Aの効果
要因Bの効果
2要因群間計画データの推定
 さらに,A1B1とA2B2には交互作用が
加わる
 これらの3種類の効果
をモデルに加え,
別個に推定する
・・・
交互作用ABの効果
3つの効果の大きさ
 サンプルデータを作る際に,要因A,要
因B,交互作用ABの効果の大きさをそ
れぞれ指定して作成している
 推定結果がこの値に
近ければ,正しく推定
できている
2要因群間計画データの推定:Stanコード
《2way.stanを参照してください》
parameters{}ブロック
real effectA;
real effectB;
real effectAB;
各要因と交互作用の
パラメータを定義
2要因群間計画データの推定:Stanコード
transformed parameters{}ブロック
Sigma[1,1] = sigma[1]*sigma[1];
Sigma[2,2] = sigma[2]*sigma[2];
Sigma[1,2] = 0;
Sigma[2,1] = 0;
共分散行列のそれぞれの要素
を指定
群間計画のデータなので
非対角成分は0
2要因群間計画データの推定:Stanコード
transformed parameters{}ブロック
mu2[1] = mu – effectB;
mu2[2] = mu + effectB;
要因Bの効果を加える
効果は2つの条件で相殺される
ように加える必要がある
ideal1[1] = mu2[1] – effectA + effectAB;
ideal1[2] = mu2[2] – effectA – effectAB;
ideal2[1] = mu2[1] + effectA – effectAB;
ideal2[2] = mu2[2] + effectA + effectAB;
各条件に要因Aと交互作用ABの
効果を加える
2要因群間計画データの推定:Stanコード
ideal1[1]
ideal2[1] ideal2[2]
ideal1[2]
effect A +
effect A -
effect B - effect B +
effect AB + effect AB -
effect AB - effect AB +
2要因群間計画データの推定:Rコード
データの記述,モデルの読み込み,サンプ
リングなど
これまでと同様
2要因群間計画データの推定:出力
muやeffect A, B, ABの推定結果
は,データ作成時の設定と
ほぼ一致
2要因混合計画データの推定
 withinの要因が加わる混合計画では,
2要因群間計画+対応のある群間の比較
《2way_within.stanを参照してください》
parameters{}ブロックで
相関rhoを宣言
共分散行列の非対角成分に
相関rhoを掛ける
model{}ブロックで
rhoの事前分布を設定
Tips
Tips:乱数のシードを設定する
サンプリングの度に値が変わるのが気になる!
→サンプリングの前にset.seed()関数
あるいはsampling()関数のseed引数
Tips:JASP
 GUIの統計フリーソフトウェア
 ベイズ推定を使ったt検定・分散分析・回帰
分析などが実施できる
 ベイズファクターによるモデル比較しかでき
ない(生成量を作ったりはできない)
Tips:ベイズを勉強するなら
『基礎からのベイズ統計学』 豊田秀樹 先生
→ バイブル的一冊
基本的な分析のStanコードやStan内の関数・分布
の一覧など付録が充実
『はじめての統計データ分析』豊田秀樹 先生
→ もう少し発展的なモデルや仮説の表現
Web上にもたくさんの資料
Tips:ベイズを勉強するなら
『StanとRでベイズ統計モデリング』 松浦健太郎 先生
→ 最近出た本 モデリング寄り
図が多いので視覚的に分かりやすい
Web上にもたくさんの資料
Tips:ベイズ関連情報
『Doing Bayesian Data Analysis』の翻訳本が出ます
『Bayesian Cognitive Modeling』も出るという噂
社会心理学会春の方法論セミナー 3/14(火) @上智大学
「効果の科学からデータ生成過程の科学へ
〜心理学者のためのベイジアン・モデリング入門」
(http://www.socialpsychology.jp/seminar/seminar2.html)
参考文献・webサイト
『基礎からのベイズ統計学』 朝倉書店
『はじめての統計データ分析』 朝倉書店
『実践ベイズモデリング』 朝倉書店
『新訂 心理統計法−有意性検定からの脱却』 放送大学教育振興会
『StanとRでベイズ統計モデリング』 共立出版
Stan超初心者入門
http://www.slideshare.net/simizu706/stan-62042940
心理学者のためのベイズ統計入門
http://www.slideshare.net/simizu706/ss-57721033
心理統計の課題をRmdで作る
http://www.slideshare.net/KojiKosugi/rmd-67205625
SpecialThanks
本資料の作成にあたって,
山口大学教育学部 小杉 考司 先生
広島大学教育学研究科 平川 真 先生
広島大学教育学研究科 難波 修史 氏
から,多くの重要なご指摘をいただきました。ありがとうございました。

要因計画データに対するベイズ推定アプローチ

Editor's Notes

  • #23 ・データの平均値など先に示す
  • #24 ・練習だからという点強調
  • #25 ・使用ファイルどっかに載せる
  • #52 ・対応ありのコードに
  • #53 ・対応ありのコードに
  • #54 ・対応ありのコードに
  • #55 ・対応ありのコードに
  • #56 ・対応ありのコードに
  • #61 ・データの平均値など先に示す