mcmcでマルチレベルモデル
DESCRIPTION
広島大学で行われた,ベイズ推定による多変量解析入門WSで発表した資料です。階層線形モデルをベイズ推定する話についてまとめています。 発表者のWebサイト:norimune.netTRANSCRIPT
MCMC でマルチレベルモデル
広島大学清水裕士
自己紹介• 清水裕士です。
• 専門は社会心理学です。
• 趣味は心理統計です。
• Twitter アカウント: @simizu706• Web サイト : http://norimune.net
ここでの話題• マルチレベルモデルについて– 階層線形モデル (HLM)
• Hierarchical Linear Model
• HLM をベイズ推定する意義– 最尤法と比較して
• ソフトウェアを使って HLM をやってみよう– Rstan と glmer2stan 関数を使うととても楽チン– Mplus だともっと楽チン
マルチレベルモデルとは• 階層性を持ったデータを扱う分析手法– 集団(国,企業,チーム,家族・・・)に複数の人が所
属しているようなデータ– 個人から反復測定したデータ– カテゴリごとに局所的な類似性があるデータ
• 同じ株の花の特徴は,ほかの株のものより似ている
• 今回扱うのは,線形モデルに限定– 社会科学でいうところの,階層線形モデル( HLM )– 一般的には,一般(化)線形混合モデル( GLMM )
5
個人 - 集団データの階層性• データの階層性– 集団ごとにネストされたデータ
– 集団ごとに共通した値が入力されるデータ– 集団内で類似したデータ• 学校 - 生徒、カップルデータ、反復測定データ・・・
etc
このようなデータを階層的データと呼ぶ
6
サンプルデータ紹介• 仮想的なデータを利用– 3 人集団が集団討議を行う実験( 100 集団 300 人)
• ※ 実際に実験は行っていません!– 何が課題満足を高める要因となるのか?
• 測定変数– 発言量 →録音してコーディング– 課題の満足度 →実験後測定– 集団成績 →集団単位で採点
– 課題満足度は,個人の発言量と,集団成績で予測
7
階層的データ例:サンプルデータの場合
集団で一致したデータ
集団で類似したデータ
8
集団単位で平均したデータ
9
従来の回帰分析で分析する問題• 「サンプルの独立性仮定」の違反– 回帰分析は、サンプルが独立していることを仮定
• 階層的データは、サンプルが独立していない• 推定値にバイアスが生じる• 標準誤差を小さく見積もってしまう
– → タイプⅠエラーを犯す危険がある
• 集団平均は集団の性質を完全には反映しない– 集団平均には集団の性質と個人の性質が混在
• 得られた回帰係数が何を表しているか不明– 個人レベルと集団レベルの回帰係数が混ざった推定値になる
• 集団内人数が少ないときほど、この問題は大きい
10
グループ内類似性を評価する• 個人 - 集団データのグループ内類似性– 発言量や満足度は、個々の集団内で類似する– → 盛り上がっている集団は全員の発話量が多
い
• グループ内類似性が階層的データの特徴– 個人の得点同士に類似性が見られることに
よって、サンプルの独立性が違反される– 類似性を適切に扱えば、問題は回避される
11
級内相関係数• グループ内の類似性を評価するための指
標– -1~ 1 の間を取る–有意性検定の結果を確認– .10以上あれば、マルチレベルモデルを行った
ほうがよい、という説もある。
12
階層的データのまとめ• 集団ごとにネストされている,非独立なデータ– その本質は,級内相関が存在するデータ– ネストされていればすべてがマルチレベルモデルの対象になるわけではない
• 回帰分析では,誤った結果・解釈を得てしまう– 推定精度を高く見積もりすぎる → TypeⅠエラー– 推定された回帰係数は,集団単位・個人単位の効果が
混在する
• そこで,マルチレベルモデルが必要
階層線形モデル• データの階層性を考慮した回帰分析– 残差の集団間変動を推定する
• 集団単位の変動と個人単位の変動を分離• 残差の独立性を保証する
– さらに,回帰係数の集団間変動も推定できる• 集団ごとに異なる予測が可能 → 予測力向上• 回帰係数の分散を推定 → 集団間変動の程度を評価
• 一般的には最尤法が用いられる– 最尤法と制限付き最尤法
普通の回帰分析
切片a
回帰係数b
1単位
複数のグループの回帰分析100 個の回帰直線
Aグループ
Bグループ・・・
100 回も回帰分析をするの・・・?
HLM による回帰直線切片の集団間変動
固定効果(平均)
変量効果(分散)
変量効果・・・集団ごとに異なる値
HLM による回帰直線 2切片と回帰係数の集団間変動
固定効果(平均)
変量効果(分散)
変量効果(分散)
R で HLM をやってみる• 発言量が個人単位の変数– talk ・・・個人レベルの変数は集団内平均で中心
化• まず, talk_m という集団内平均データを作成• talk から talk_m を引いて, talk_g という変数名で保存
• パフォーマンスが集団単位の変数– per ・・・集団レベルの変数は全体平均で中心化
最尤法で HLM
• R では lmerTestパッケージが便利– lme4パッケージの lmer 関数を使い,さらに係
数の検定ができるように改良– REML= T で制限付き最尤法, F で最尤法
– ()内は変量効果(集団間変動)を意味する• 1 は切片, talk_g は発言量の回帰係数の集団間変動• |group は, group が集団 ID であることを意味する
最尤法の結果• 固定効果 (Fixed effects)– talk_g=0.201 p < .05 per の効果 0.194 p
< .01• 変量効果 (Random effects) の標準偏差– 切片 = 0.557 talk_g = 0.416 ・・・集団間変動
最尤法で HLM を推定する限界• 「データ」が正規分布である必要がある– 分布がゆがんでいる場合,推定値にバイアスが生じる
• 変量効果の分散( SD )が不偏推定量ではない– 小標本で,変量効果の分散推定値にバイアス
• グループ間変動をより小さく推定してしまう
• 推定値の分布に正規分布を仮定– 小標本では,推定精度を高く見積もりすぎる
• 最小二乗法ではt分布を使うことを思い出そう– 分散は非負なので,一般に正規分布にならない
• 集団間変動についての正しい区間推定ができない
そこで頼れるのがベイズ推定• データの正規性の仮定は不要– ただし,モデルによる仮定がなくなるわけではない
• 小標本でも,妥当な分析が可能– 集団間変動の過小推定のバイアスなどはない– 事前分布を上手く使えば,より効率的に推定が可能
• 推定値の分布は正規分布でなくてよい– 分散成分の区間推定がより現実的なものになる
※MCMC は推定アルゴリズム• 最尤法,ベイズ法などは最適化の基準– 最小二乗法・・・誤差の二乗和を最小にする– 最尤法・・・尤度を最大にする– ベイズ法・・・ベイズの定理による事後分布
• MCMC は最適化するためのアルゴリズム– 最尤法では,ニュートン法や EM アルゴリズ
ム– ベイズ法では, MCMC 法や変分ベイズなど
ベイズ推定が可能なソフトウェア• Mplus
– 商用ソフトウェア– とても高性能
• R– 無償のソフトウェア– いくつかの選択肢がある(後述)
• Amos– 商用ソフトウェア– SEM 専用なので, HLM については実行できない
• Stan– 無償のソフトウェア– R と連携させることができる(後述)
R で HLM をベイズ推定する• R で HLM を MCMC をしたい!– MCMCglmmパッケージ
• 比較的簡単に MCMC で HLM を含む複雑なモデルを推定可• ただし,回帰係数の集団間変動を推定するとかなりの確率
でサンプリングができなくなる– 切片と回帰係数の変量効果の共分散を推定しないと走る
• もっと安定した分析はできないか・・・?– rstanパッケージ
• Stan を R 上で動かすためのパッケージ• MCMCglmm に比べてかなり安定している印象• 今回はこちらを紹介
Stan を使って MCMC
• Stan とは– MCMC 推定をするためのソフト–任意のモデルを MCMC で推定してくれる
• rstanパッケージを使おう– Stan を R 上で動かすことができる– 準備は大変だけど, Web を見ればなんとかな
る• Windows と Mac で準備するものが変わるので注意• 「 Rstan インストール」でググれば出てくる
インストールできたとして・・・• R から Stan にデータとモデルコードを送る– Stan コードで宣言している変数にあったデータセットを
リスト型で作成
• Stan で MCMC– stan() 関数で stan にモデルとデータを送る
• 結果を R に戻す– 得た結果はオブジェクトごとに R で活用できる
Stan コード例(階層線形モデル)
R 言語しか知らないユーザーにとってはちょっと敷居が高いかもしれない(しかも,くそなげぇよ)
まだあわてるような時間じゃない
• glmer2stan()パッケージ!– R 上で glmer() の文法で書いたものを,自動的に
stan コードに直して, Stan に送ってくれる– ・・・・すげぇー便利!
–結果要約は summary() ではなく, stanmer() を使う– stan の出力を見たい場合は, print() で。
さっそく glmer2stan() で走らせる
• モデルを Stan コードに変更し,コンパイル
– 場合によってはエラーも出る• ただし, informational message はエラーではない
– しばらくすると,計算が終わる• 結構時間かかる・・・このデータ・モデルで 1 分ぐらい?
MCMC による HLM結果
収束しているかどうかの判断• print() で見る ※ digits (表示桁数)を 3以上推奨
• 結果は以下の通り
– mean が点推定値, sd が推定精度(標準誤差)– Rhat が収束基準
• 1 に近いと収束している• 一般に, Rhat < 1.05 なら収束
中略
推定値の事後分布• codaパッケージを使う
最尤法と MCMC の結果比較• 最尤法の結果
– talk_g = 0.201, 95%CI [0.039 ~ 0.364]– per = 0.194 95%CI [0.117 ~ 0.271]– 切片の SD= 0.557 , talk_g の SD = 0.416
• MCMC の結果– talk_g = 0.199 95%CI [0.029 ~ 0.370]– per = 0.193 95%CI [0.112 ~ 0.283]– 切片の SD= 0.595 , talk_g の SD = 0.506
• 結果比較– 固定効果の推定値はかなり近い値(ただし, CI は違う)
• CI については, MCMC のほうがおそらく妥当な推定– 集団間変動の推定値は, MCMC のほうが大きい
• MCMC のほうが正しい
glmer2stan() を使う上での注意点
• warmup = ・・・バーンインの回数– 全サンプリング回数の半分が上限
• iter = ・・・サンプリング回数 バーンイン含む– 基本的には多いほうがいい– stan は収束が早いので, BUGS よりは小さめでもいい?
• chain = ・・・マルコフ連鎖の数 1 つがデフォルト– 推定値の安定さを考えると, 2以上にしたほうが無難– ただし,倍の時間がかかる
• calcWAIC = ・・・ TRUE にすると, WAIC を出力– WAIC ・・・広く使える情報量基準 (Widely Applicable Information
Criterion) なかなか良い性能らしい。
glmer2stan() を使う上での注意点
• 整数のみの変数の場合– なぜか, family=“gaussian” にするとエラー– データ入力するときに,小数点を入れておくと回避
できる(つまり, 5 ではなく 5.0 と入れておく)
• 切片と回帰係数の変量効果を推定するとき– こういうメッセージがよく出る
– しかしこれはエラーではないらしい。• 一応結果もちゃんと出るし,ほかのソフトとも一致する
じゃあもう, glmer2stan() でいい?
• ほぼすべての線形モデルを包含– 回帰分析,分散分析も OK !–正規,ロジット,ポアソン,順序,ガンマ分布など幅広く OK !
– 複数の変量効果を含んでいても OK !
• 一概にそうとはいえない–事前分布をきめ細やかに設定できない– stan コードを自分で書けるようになるのがベ
スト
Mplus という選択肢• めちゃくちゃ高性能 ただし,有料
– SEM , HLM , IRT ,マルチレベル SEM ,潜在クラス分析
• 最尤法,ベイズ法 with MCMC の両方が可能– 同じモデルで,推定法だけを変えることができる
• 計算が信じられないぐらい速い– rstan で 1 分かかるのが, Mplus だと 5秒で終わる– コアを chain ごとに分けられるので,さらに速い
• モデルの記述がとても簡単– stan だとかなり煩雑なモデルも数行で書ける
Mplus による HLM のコード• だいたいこんなもん–本当はもうちょっとあるけど
Mplus の出力• 分散成分の事後分布–赤が平均,青が 95%信用区間
【宣伝】日本語解説本もあるらしい 【乙】
小杉・清水 (2014)Mplus と R による構造方程式モデリング入門北大路書房
ベイズ推定の一長一短• ベイズ推定の利点– 複雑なモデルでも,妥当な推定が可能
• 階層線形モデルの分散成分• 従属変数が正規分布にならないようなモデル(一般化線形
混合モデル)も推定できる
• ベイズ推定( with MCMC )の欠点– 推定に時間がかかる
• 最尤法に比べてかなり遅い– モデルの仮定に対する逸脱を補正する方法がイマイチ
• 最尤法のほうが,そのあたりは進んでいる• 理論的には可能みたいだけど,実装には至っていない
Let’s Bayes!広島大学 清水裕士
@simizu706norimune.net