84
Chapter 8: 階層モデル 2017.04.29 Osaka.Stan #4 広島大学大学院 教育学研究科 広島大学グローバルキャリアデザインセンター 特別研究員 山根 嵩史

Osaka.stan#4 chap8

Embed Size (px)

Citation preview

Page 1: Osaka.stan#4 chap8

Chapter 8: 階層モデル

2017.04.29 Osaka.Stan #4

広島大学大学院教育学研究科広島大学グローバルキャリアデザインセンター特別研究員

山根嵩史

Page 2: Osaka.stan#4 chap8

自己紹介氏名:山根嵩史 (やまねたかし)

所属:広島大学大学院教育学研究科広島大学グローバルキャリアデザインセンター

特別研究員

専門:記憶課題のメタ認知的制御

ひとこと:ANOVA大好きなフレンズです

@T_Yamane

Page 3: Osaka.stan#4 chap8

僕と階層モデル前回のOsaka.Stanにて

3水準以上になると超煩雑→ベイジアンANOVAの限界

https://www.slideshare.net/TakashiYamane1/ss-72796016

Page 4: Osaka.stan#4 chap8

Chapter.8の目的グループ差や個人差をうまく扱うための階層モデルを導入する

グループ差=説明変数だけでは説明がつかない,グループに由来する差異

個人差= 〃 個人に由来する差異

「グループ差 (や個人差)を表すパラメータは類似しており,特定の分布から生成される」と仮定する

Page 5: Osaka.stan#4 chap8

Chapter.8目次8.1階層モデルの導入 同一のデータに対して,単純なモデルから階層モデルまでを検討

8.2複数の層を持つ階層モデル 複数の階層を持つ階層モデルの説明

8.3非線形モデルの階層モデル 非線形モデルに対する階層モデルの適用

8.4ロジスティック回帰の階層モデル ロジスティック回帰モデルに対する階層モデルの適用

Page 6: Osaka.stan#4 chap8

8.1階層モデルの導入データ例:社員の年齢と年収のデータ大手4社 (年功序列型の賃金制度)に勤務する社員の年齢 (X)と基本年収 (Y) 40名分

X =社員の年齢 (実年齢 − 23)

Y =年収KID =勤務している会社のID

(1〜 4)

Page 7: Osaka.stan#4 chap8

8.1.1解析の目的とデータの分布の確認

40名分のデータをプロットし,分布を確認

解析の目的 それぞれの会社 (KID)における年齢Xと基本年収Yの関係を知りたい

基本年収は年齢に比例してそう 会社によって「新卒の基本年収」と「年齢に伴う昇給額」が違いそう

傾きが負!?

Page 8: Osaka.stan#4 chap8

単純なモデル→複雑なモデル8.1節では,社員の年齢と年収のデータに対して

①会社差を考えず,40名分すべてのデータを単一の直線式で回帰するモデル (モデル式8−1)

②会社ごとに切片と傾きを推定するモデル(モデル式8−2)

③会社差を表すパラメータが特定の分布から生成されると考えるモデル (モデル式8−3)

という3通りのモデルを順に当てはめる③のモデルがいわゆる階層モデル

Page 9: Osaka.stan#4 chap8

8.1.2グループ差を考えない場合ひとまず会社差を考えず,4社のデータに対して直線式 a+bXで回帰を行う

単回帰のモデル式 (Chapter.4モデル式4-2)

N =人数,Y[n] =年収,X = 年齢ybase[n] = 基本年収,ε[n] = 基本年収以外の誤差

「40人に共通の直線式 a+bXに,人ごとに独立なノイズεが加わって年収Yが生成される」

Page 10: Osaka.stan#4 chap8

8.1.2グループ差を考えない場合ybase[n]とε[n]を消去すると…

モデル式8−1

「年収Yは平均 a+bX,標準偏差σYの正規分布にしたがう」

※X =社員の年齢 (実年齢 − 23) の理由基本年収は切片a(新卒の基本年収) +傾きb(昇給額)*年齢X新卒年齢を23歳としたとき,−23しておけば切片aをそのまま「新卒の基本年収」として解釈できる

Page 11: Osaka.stan#4 chap8

8.1.2 Stanでの実装と推定

切片と傾き40人全員で共通なので1つずつ

直線式が40人共通なのでノイズがかなり大きい☞グループ差 (会社差)を考慮する必要がある

Page 12: Osaka.stan#4 chap8

8.1.3グループごとに切片と傾きを持つ場合

会社によって「新卒の基本年収」と「年齢に伴う昇給額」が異なるっぽいので,会社ごとに切片aと傾きbを推定する

会社1 a[1]+b[1]X

会社2 a[2]+b[2]X・ ・・ ・・ ・

会社K a[K]+b[K]X

のように単回帰を会社数だけ実行するのとほぼ同義

※ただしノイズの大きさσYは共通

Page 13: Osaka.stan#4 chap8

8.1.3グループごとに切片と傾きを持つ場合

モデル式8−2

ややこしく見えるが,単に参加者nのKIDの数値 (1〜4)

が入るだけ

・・・

n=1ならKID[n]=1

n=37ならKID[n]=3

Page 14: Osaka.stan#4 chap8

8.1.3 Stanでの実装

会社の数をKで宣言

KID列をKID[N]で宣言

共通のa,bからグループごとのa[K],b[K]に変更

モデル式8−2を表現

Page 15: Osaka.stan#4 chap8

8.1.3推定結果の解釈

会社ごとの切片と傾きが得られた! …がKID1〜4以外の会社の予測には使えないデータが十分にない会社 (KID4)はうまく推定できない

☞グループ差に仮定をいれたモデルが必要

!?

Page 16: Osaka.stan#4 chap8

8.1.4階層モデル各会社のa[k],b[k]について,

「すべての会社で共通の全体平均」

「会社差を表す項」

に分けて考える

会社差を表すパラメータは,平均0,標準偏差σaの正規分布から生成されると考える

Page 17: Osaka.stan#4 chap8

8.1.4階層モデル「会社差を表すパラメータは類似している」と仮定することにより,

→会社差について言及できる(例:「新卒の基本年収の会社差のばらつきはσaぐらい」)

→データ数が少ない会社があってもデータを活用できる

階層的に事前分布を仮定しているので階層モデルと呼ばれる (≠会社と個人の階層)

Page 18: Osaka.stan#4 chap8

8.1.4階層モデルモデル式8−3

a[k],b[k]は全体平均+会社差(全体平均のみだと式8−1と一致)

会社差の項の事前分布として正規分布を仮定し,ゆるい制約 (置かなければ式8−2と一致)

Page 19: Osaka.stan#4 chap8

階層モデルで推定...の前に階層モデルではモデルが複雑になりやすいため,

①モデル式を使ってシミュレーションでデータを生成し,分布を確認

②生成データに対して推定を行い,推定がうまくいくかどうか確認

しておくことが有益

Page 20: Osaka.stan#4 chap8

シミュレーションと推定:Rコード

会社の勤務者数サンプルデータに合わせている

a全体平均,b全体平均

σa,σb,σY

a[k],b[k]を生成rnorm(...)の部分が会社差

サンプルデータと同じデータフレームを作成しY_simにはモデル8−3をもとにデータを生成

Page 21: Osaka.stan#4 chap8

シミュレーションと推定:データの確認

シミュレーションの結果が意図しないものになっていないか,推定がうまくいくか (与えた定数に近い値が推定されるか)どうかを確認しておくとよい

Page 22: Osaka.stan#4 chap8

8.1.4 Stanでの実装parametersブロック

a全体平均,b全体平均

σa,σb,σY

a会社差[k],b会社差[k]

推定するパラメータをそれぞれ宣言

Page 23: Osaka.stan#4 chap8

8.1.4 Stanでの実装transformed parametersブロック

モデル式8−3の

の部分を表現

Page 24: Osaka.stan#4 chap8

8.1.4 Stanでの実装modelブロック

年収の予測モデルを記述

a会社差[k],b会社差[k]

に正規分布を仮定ゆるい制約

Page 25: Osaka.stan#4 chap8

8.1.4推定結果の解釈切片と傾きの全体平均

事後分布

確信区間に負の値が含まれる新卒の基本年収は382万円くらい年齢に伴う昇給額は13万円くらい

Page 26: Osaka.stan#4 chap8

8.1.4推定結果の解釈会社ごとの切片

新卒の基本年収は,

会社1で383万円くらい会社2で335万円くらい会社3で325万円くらい会社4で482万円くらい

先ほど に比べかなり妥当な結果に!

Page 27: Osaka.stan#4 chap8

8.1.4推定結果の解釈会社ごとの傾き

年齢に伴う昇給額は,

会社1で8万円くらい会社2で19万円くらい会社3で12万円くらい会社4で10万円くらい

こちらもまあまあ妥当

Page 28: Osaka.stan#4 chap8

8.1.4推定結果の解釈各パラメータのバラツキ

データが4社分しかなかったので確信区間が広く

推定され,負の値や極端に大きな値が含まれている

600万円もバラツキがある…?

新卒の基本年収のバラツキは156万円くらい年齢に伴う昇給額のバラツキは11万円くらいノイズの大きさは29万円くらい

☞弱情報事前分布を活用する方法も (10章)

Page 29: Osaka.stan#4 chap8

8.1.5モデルの比較モデル式8−1から8−3を図示して比べてみる

モデル式8−1 モデル式8−2 モデル式8−3

各会社の年収Yに共通の切片と傾き

各会社の年収Yに独自の切片と傾き

各会社の切片と傾きを決めるパラメータ設定

階層モデル (モデル式8−3)では,切片aと傾きbを決めるハイパーパラメータσaとσbが設定されている

Page 30: Osaka.stan#4 chap8

8.1.5推定値のシュリンケージモデル式8−2と8−3の結果を比べてみる

「切片aと傾きbが類似している」という仮定により, 会社4の切片aが全体の中央値に近くなる (左図)

会社4の傾きbが全体の傾きに近くなり,過学習を避けている (右図) → データのshrinkage

Page 31: Osaka.stan#4 chap8

8.1.6階層モデルの等価な表現モデル式8−3と等価かつ簡潔な表現

「すべての会社の切片の平均がa全体平均であり,各社のa[k]は平均a全体平均,標準偏差σaの正規分布から生成される」と考えるモデル (傾きbも同様)

この部分が... こうなる

モデル式8−4

Page 32: Osaka.stan#4 chap8

8.1.6 Stanでの実装parametersブロック

会社差のパラメータの書き方を変更

Page 33: Osaka.stan#4 chap8

8.1.6 Stanでの実装

modelブロック

transformed parameters

ブロックをごっそり削除

aとbにゆるい制約

Page 34: Osaka.stan#4 chap8

8.1.6階層モデルの等価な表現モデル式8−4は,8−3と等価にもかかわらず 記述が倹約的 計算速度が速い

という利点がある

複数の階層を持つモデル (次節)ではより顕著に

ただし,モデルによっては計算速度が遅くなったり,収束しにくくなったりする (らしい)

Page 35: Osaka.stan#4 chap8

データ例:業界ごとの社員の年齢と年収8.1節のデータはある業界の大手4社のものさらに2つの業界のデータを追加

8.2複数の層を持つ階層モデル

X =社員の年齢 (実年齢 − 23)

Y =年収KID =勤務している会社のID

(1〜 4)

GID =会社が所属する業界のID (1〜 3)

・・・

Page 36: Osaka.stan#4 chap8

8.2.1解析の目的解析の目的 それぞれの会社 (KID)における年齢Xと基本年収Yの関係

それぞれの業界 (GID)における平均的な年齢Xと基本年収Yの関係

が知りたい

業界が異なれば,「新卒の基本年収」と「年齢に伴う昇給額」の平均も異なる

☞データの分布を確認する

Page 37: Osaka.stan#4 chap8

8.2.1データ分布の確認

どの業界でも年収は年齢に比例してそう

業界によって「新卒の基本年収」と「年齢に伴う昇給額」が違いそう

データの散布図 (全体・業界ごと) を見る

Page 38: Osaka.stan#4 chap8

8.2.1データ分布の確認各会社の切片と傾きの業界ごとの分布を見る

aとbは山型に分布?aとbの業界平均は異なる (分布のピークが違う)

aとbの会社差のバラツキも業界ごとに異なる (分布の幅が違う)

Page 39: Osaka.stan#4 chap8

8.2.2メカニズムの想像ーその1シンプルなモデルから考える

「aとbの平均は業界ごとに異なるが,バラツキは共通」とするモデル

切片aについて,

a業界差[g]およびa会社差[k] は Normal(0, σ) から生成

「会社差のパラメータは業界内で類似している」「業界差のパラメータは類似している」

2つの階層を持つ階層モデル

Page 40: Osaka.stan#4 chap8

8.2.3モデル式の記述ーその1モデル式8−5

N =人数,K =会社,G = 業界K2G = 会社kが所属している業界のGID

Page 41: Osaka.stan#4 chap8

8.2.4 Stanで実装ーその1dataブロック

業界の数をGで宣言

K2G[k]の部分を宣言

Page 42: Osaka.stan#4 chap8

8.2.4 Stanで実装ーその1parametersブロック

a業界平均[g],b業界平均[g]

σag,σbg

Page 43: Osaka.stan#4 chap8

8.2.4 Stanで実装ーその1modelブロック モデル式8−5の

業界平均の部分

モデル式8−5の会社平均の部分

Page 44: Osaka.stan#4 chap8

8.2.4 Stanで実装ーその1RコードはK2Gを作成する部分がちょっとテクい

欲しいのは「その会社がどの業界に属するか」を表す数値ベクトルなので,データの“KID”と“GID”の列にunique ()

関数を使って重複部分を削除している

Page 45: Osaka.stan#4 chap8

8.2.4結果の出力業界ごとの切片

新卒の基本年収は,

業界1で359万円くらい業界2で299万円くらい業界3で499万円くらい

→ かなり異なる

Page 46: Osaka.stan#4 chap8

8.2.4結果の出力業界ごとの傾き

年齢に伴う昇給額は,

業界1で13万円くらい業界2で29万円くらい業界3で13万円くらい

→ 業界2が大きい

Page 47: Osaka.stan#4 chap8

8.2.4結果の出力会社差のバラツキ

切片:23万円くらい傾き:5万円くらいノイズ:66万円くらい

のバラツキがある

Page 48: Osaka.stan#4 chap8

8.2.5メカニズムの想像ーその2モデルの仮定を少しゆるめる

「aとbの平均もバラツキも業界ごとに異なる」

→業界ごとにσaとσbの値がある

「年齢以外の影響 (ノイズ)の大きさも業界ごとに異なる」

→業界ごとにσYの値がある

とするモデル

Page 49: Osaka.stan#4 chap8

8.2.6モデル式の記述ーその2

モデル式8−6

業界ごとにバラツキが異なるので,σaとσbに添え字業界ごとにノイズの影響が異なるので,σYに添え字

Page 50: Osaka.stan#4 chap8

8.2.7 Stanで実装ーその2dataブロック

GID[n]を宣言

Page 51: Osaka.stan#4 chap8

8.2.7 Stanで実装ーその2parametersブロック

σa,σb,σYの宣言を変更

Page 52: Osaka.stan#4 chap8

8.2.7 Stanで実装ーその2modelブロック

添え字バージョンに変更

Page 53: Osaka.stan#4 chap8

8.2.7結果の出力業界ごとの切片のバラツキ

業界1の会社差のバラツキがすごい

→データ不足?

Page 54: Osaka.stan#4 chap8

8.2.7結果の出力業界ごとの傾きのバラツキ

中央値を見ると業界ごとに結構違いそう

Page 55: Osaka.stan#4 chap8

8.2.7結果の出力業界ごとのノイズのバラツキ

ノイズ (年齢以外の要因)の大きさも業界によって異なりそう

Page 56: Osaka.stan#4 chap8

複数階層モデルにおける注意点モデルの複雑さに対してデータが少ないと,

シンプルなモデルから複雑なモデルにする過程でMCMCが収束しなくなることがある

対処法としては,

諦めてシンプルなモデルに戻る

弱情報事前分布などを使って仮定を増やす

など

Page 57: Osaka.stan#4 chap8

8.3非線形モデルの階層モデル

8.3節では階層モデルを非線形のモデリングに当てはめる

データ例:薬の血中濃度の時系列データ(7.3節)

患者に薬剤を投与し,1時間後 (Time 1),2時間後 (Time 2)…24時間後 (Time 24)の血中濃度Y (mg/mL)を測定

15人分のデータを追加PersonID =1〜16

Page 58: Osaka.stan#4 chap8

8.3.1解析の目的とデータ分布の確認

解析の目的

それぞれの患者について,頭打ちになるYの値と,頭打ちになるまでの時間

患者差のバラツキ が知りたい

すべてのデータは途中で頭打ちになっている (非線形である)

Time24におけるYの値は,山型の分布になりそう

Page 59: Osaka.stan#4 chap8

8.3.2メカニズムの想像7.3節のモデル

患者ごとにモデル式を当てはめることもできるが,a[n]とb[n]に何らかの仮定を置かないと予測には使えない

頭打ちになるYの値 頭打ちになるまでの時間

a[n]とb[n]は正の値なので,log(a[n])とlog(b[n])が正規分布に従うという階層モデルを適用

Page 60: Osaka.stan#4 chap8

8.3.3モデルの記述

モデル式8−7

推定するパラメータ血中濃度Yのバラツキ: σY頭打ちになるYの値: a[n],a全体平均,σa頭打ちになるまでの時間: b[n],b全体平均,σb

先ほどのモデル を拡張したもの

N =患者の人数T =測定された時点数 (ここでは6)

Time[t] =測定時の経過時間

Page 61: Osaka.stan#4 chap8

8.3.4 Stanで実装 (Stanコード)dataブロック

YはN行T列の配列型

Page 62: Osaka.stan#4 chap8

8.3.4 Stanで実装 (Stanコード)parametersブロック

log(a[n])とlog(b[n])の定義

Page 63: Osaka.stan#4 chap8

8.3.4 Stanで実装 (Stanコード)transformed parametersブロック

曲線のパラメータであるaとbを定義

Page 64: Osaka.stan#4 chap8

8.3.4 Stanで実装 (Stanコード)modelブロック log(a[n])とlog(b[n])

に対してゆるい制約

モデル式を記述7章のモデルに患者の人数についてのfor文を追記データが配列型なので二重for文

Page 65: Osaka.stan#4 chap8

8.3.4 Stanで実装 (Stanコード)

generated quantitiesブロック

7章と同様に生成量を作成患者の人数についてのfor文を追記

Page 66: Osaka.stan#4 chap8

8.3.4 Stanで実装 (Rコード)

Yは二次元配列Rではmatrixやdata.frameで渡す

Page 67: Osaka.stan#4 chap8

8.3.5推定結果の解釈推定された各パラメータの値※σY以外は対数スケールなので注意

各患者のa[n]とb[n]についても

推定され,患者ごとの予測分布を描くこともできる

Page 68: Osaka.stan#4 chap8

8.4ロジスティック回帰の階層モデル

8.4節ではロジスティック回帰の階層モデルを扱う

データ例:学生の出欠データ(5.3節)

学生の授業への出席 (0:欠席,1:出席)を,

・アルバイトが好きかどうか (0:嫌い,1:好き)

・学問への興味の強さ (200点満点)

・授業日の天気 (A:晴れ,B:曇り,C:雨)

によって説明

Page 69: Osaka.stan#4 chap8

8.4ロジスティック回帰の階層モデル

5.3節のモデル

A =アルバイトが好きかどうか (0:嫌い,1:好き)

Score =学問への興味の強さ (200点満点)

Weather =授業日の天気 (A:晴れ,B:曇り,C:雨)

Y =授業に出席したかどうか (0:欠席,1:出席)

上記のモデルでは「学生による出席行動の差 (学生差)」や「科目に人気があるかどうかの差 (科目差)」などは考慮されていない

学生差・科目差を考慮した階層モデルを考える

Page 70: Osaka.stan#4 chap8

8.4ロジスティック回帰の階層モデル

学生差と科目差について考慮するため,科目のID (CourseID)を取得し,学生に関するデータと出欠記録に関するデータを作成

学生に関するデータ1行が1人分

出欠記録に関するデータ1行が1出欠分

Page 71: Osaka.stan#4 chap8

8.4.1解析の目的解析の目的

与えられた説明変数から応答変数がどれほど予測できるか知りたい

それぞれの説明変数が出席確率にどれほど影響しているか知りたい

学生差のバラツキと科目差のバラツキがどれほどか知りたい

Page 72: Osaka.stan#4 chap8

8.4.2メカニズムの想像出席率を決める要素を,①学生に依存するもの②科目に依存するもの③一回ごとの授業に依存するものに分けて考える

学生に依存

アルバイト好/嫌学問への興味学生差

科目に依存

科目差授業に依存

授業日の天気

Page 73: Osaka.stan#4 chap8

8.4.2メカニズムの想像それぞれの要素について,説明変数を使った回帰を行い,それらの要素の和をロジスティック関数で変換して出席率を求める

x[i] =切片+ + +

出席率q[i]

ロジスティック関数で (0, 1)の範囲に変換

Page 74: Osaka.stan#4 chap8

8.4.3モデルの記述モデル式8−8

N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数

Page 75: Osaka.stan#4 chap8

8.4.3モデルの記述モデル式8−8

N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数

学生に依存

アルバイト好/嫌学問への興味学生差

学生に依存する項はアルバイト好/嫌+学問への興味+学生差

学生差は正規分布に従うと仮定

Page 76: Osaka.stan#4 chap8

8.4.3モデルの記述モデル式8−8

N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数

科目に依存する項は科目差そのもの科目差は正規分布に従うと仮定

科目に依存

科目差

Page 77: Osaka.stan#4 chap8

8.4.3モデルの記述モデル式8−8

N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数

授業に依存する項は説明変数Weather

と比例

授業に依存

授業日の天気

Page 78: Osaka.stan#4 chap8

8.4.3モデルの記述モデル式8−8

N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数

各要素の和をとって,ロジスティック関数により出席確率q[i]に変換出席率q[i]

※切片b1は最後の式にのみ入ることに注意(各要素を代入する際に切片1+切片2のような項が現れ,収束しなくなる)(らしい)

Page 79: Osaka.stan#4 chap8

8.4.4 Stanでの実装 (Stanコード)dataブロック

PersonIDとCourseID

を宣言

Page 80: Osaka.stan#4 chap8

8.4.4 Stanでの実装 (Stanコード)parametersブロック

b学生差[n]とb科目差[c]を宣言

σPとσCを宣言

Page 81: Osaka.stan#4 chap8

8.4.4 Stanでの実装 (Stanコード)transformed parametersブロック

学生に依存する項科目に依存する項授業に依存する項 を作成

Page 82: Osaka.stan#4 chap8

8.4.4 Stanでの実装 (Rコード)

天気の文字列を数値に置き換え

出力が多いため一部の変数のみをサンプリング

Page 83: Osaka.stan#4 chap8

8.4.5推定結果の解釈各パラメータの事後分布と確信区間

「アルバイトが好き(b2)」と「天気が雨(b4)」は出席率に負の影響

「学問への興味(b3)」は正の影響

学生差(s_P)の影響は小さいが,科目差(s_C)の影響は大きそう

Page 84: Osaka.stan#4 chap8

8.4.5推定結果の解釈科目差の事後分布

最も出席率の高い科目と最も低い科目のMAP推定値は3以上(オッズで20倍程度)差がある=科目差の影響は大きい

階層モデルはロジスティック回帰とも簡単に組み合わせることが可能(例:商品購入確率を,顧客に依存する要素,商品に依存する要素,購買に依存する要素などに分解してモデリング可能)