Upload
takashi-yamane
View
736
Download
3
Embed Size (px)
Citation preview
Chapter 8: 階層モデル
2017.04.29 Osaka.Stan #4
広島大学大学院教育学研究科広島大学グローバルキャリアデザインセンター特別研究員
山根嵩史
自己紹介氏名:山根嵩史 (やまねたかし)
所属:広島大学大学院教育学研究科広島大学グローバルキャリアデザインセンター
特別研究員
専門:記憶課題のメタ認知的制御
ひとこと:ANOVA大好きなフレンズです
@T_Yamane
僕と階層モデル前回のOsaka.Stanにて
3水準以上になると超煩雑→ベイジアンANOVAの限界
https://www.slideshare.net/TakashiYamane1/ss-72796016
Chapter.8の目的グループ差や個人差をうまく扱うための階層モデルを導入する
グループ差=説明変数だけでは説明がつかない,グループに由来する差異
個人差= 〃 個人に由来する差異
「グループ差 (や個人差)を表すパラメータは類似しており,特定の分布から生成される」と仮定する
Chapter.8目次8.1階層モデルの導入 同一のデータに対して,単純なモデルから階層モデルまでを検討
8.2複数の層を持つ階層モデル 複数の階層を持つ階層モデルの説明
8.3非線形モデルの階層モデル 非線形モデルに対する階層モデルの適用
8.4ロジスティック回帰の階層モデル ロジスティック回帰モデルに対する階層モデルの適用
8.1階層モデルの導入データ例:社員の年齢と年収のデータ大手4社 (年功序列型の賃金制度)に勤務する社員の年齢 (X)と基本年収 (Y) 40名分
X =社員の年齢 (実年齢 − 23)
Y =年収KID =勤務している会社のID
(1〜 4)
8.1.1解析の目的とデータの分布の確認
40名分のデータをプロットし,分布を確認
解析の目的 それぞれの会社 (KID)における年齢Xと基本年収Yの関係を知りたい
基本年収は年齢に比例してそう 会社によって「新卒の基本年収」と「年齢に伴う昇給額」が違いそう
傾きが負!?
単純なモデル→複雑なモデル8.1節では,社員の年齢と年収のデータに対して
①会社差を考えず,40名分すべてのデータを単一の直線式で回帰するモデル (モデル式8−1)
②会社ごとに切片と傾きを推定するモデル(モデル式8−2)
③会社差を表すパラメータが特定の分布から生成されると考えるモデル (モデル式8−3)
という3通りのモデルを順に当てはめる③のモデルがいわゆる階層モデル
8.1.2グループ差を考えない場合ひとまず会社差を考えず,4社のデータに対して直線式 a+bXで回帰を行う
単回帰のモデル式 (Chapter.4モデル式4-2)
N =人数,Y[n] =年収,X = 年齢ybase[n] = 基本年収,ε[n] = 基本年収以外の誤差
「40人に共通の直線式 a+bXに,人ごとに独立なノイズεが加わって年収Yが生成される」
8.1.2グループ差を考えない場合ybase[n]とε[n]を消去すると…
モデル式8−1
「年収Yは平均 a+bX,標準偏差σYの正規分布にしたがう」
※X =社員の年齢 (実年齢 − 23) の理由基本年収は切片a(新卒の基本年収) +傾きb(昇給額)*年齢X新卒年齢を23歳としたとき,−23しておけば切片aをそのまま「新卒の基本年収」として解釈できる
8.1.2 Stanでの実装と推定
切片と傾き40人全員で共通なので1つずつ
直線式が40人共通なのでノイズがかなり大きい☞グループ差 (会社差)を考慮する必要がある
8.1.3グループごとに切片と傾きを持つ場合
会社によって「新卒の基本年収」と「年齢に伴う昇給額」が異なるっぽいので,会社ごとに切片aと傾きbを推定する
会社1 a[1]+b[1]X
会社2 a[2]+b[2]X・ ・・ ・・ ・
会社K a[K]+b[K]X
のように単回帰を会社数だけ実行するのとほぼ同義
※ただしノイズの大きさσYは共通
8.1.3グループごとに切片と傾きを持つ場合
モデル式8−2
ややこしく見えるが,単に参加者nのKIDの数値 (1〜4)
が入るだけ
・・・
n=1ならKID[n]=1
n=37ならKID[n]=3
8.1.3 Stanでの実装
会社の数をKで宣言
KID列をKID[N]で宣言
共通のa,bからグループごとのa[K],b[K]に変更
モデル式8−2を表現
8.1.3推定結果の解釈
会社ごとの切片と傾きが得られた! …がKID1〜4以外の会社の予測には使えないデータが十分にない会社 (KID4)はうまく推定できない
☞グループ差に仮定をいれたモデルが必要
!?
8.1.4階層モデル各会社のa[k],b[k]について,
「すべての会社で共通の全体平均」
「会社差を表す項」
に分けて考える
会社差を表すパラメータは,平均0,標準偏差σaの正規分布から生成されると考える
8.1.4階層モデル「会社差を表すパラメータは類似している」と仮定することにより,
→会社差について言及できる(例:「新卒の基本年収の会社差のばらつきはσaぐらい」)
→データ数が少ない会社があってもデータを活用できる
階層的に事前分布を仮定しているので階層モデルと呼ばれる (≠会社と個人の階層)
8.1.4階層モデルモデル式8−3
a[k],b[k]は全体平均+会社差(全体平均のみだと式8−1と一致)
会社差の項の事前分布として正規分布を仮定し,ゆるい制約 (置かなければ式8−2と一致)
階層モデルで推定...の前に階層モデルではモデルが複雑になりやすいため,
①モデル式を使ってシミュレーションでデータを生成し,分布を確認
②生成データに対して推定を行い,推定がうまくいくかどうか確認
しておくことが有益
シミュレーションと推定:Rコード
会社の勤務者数サンプルデータに合わせている
a全体平均,b全体平均
σa,σb,σY
a[k],b[k]を生成rnorm(...)の部分が会社差
サンプルデータと同じデータフレームを作成しY_simにはモデル8−3をもとにデータを生成
シミュレーションと推定:データの確認
シミュレーションの結果が意図しないものになっていないか,推定がうまくいくか (与えた定数に近い値が推定されるか)どうかを確認しておくとよい
8.1.4 Stanでの実装parametersブロック
a全体平均,b全体平均
σa,σb,σY
a会社差[k],b会社差[k]
推定するパラメータをそれぞれ宣言
8.1.4 Stanでの実装transformed parametersブロック
モデル式8−3の
の部分を表現
8.1.4 Stanでの実装modelブロック
年収の予測モデルを記述
a会社差[k],b会社差[k]
に正規分布を仮定ゆるい制約
8.1.4推定結果の解釈切片と傾きの全体平均
事後分布
確信区間に負の値が含まれる新卒の基本年収は382万円くらい年齢に伴う昇給額は13万円くらい
8.1.4推定結果の解釈会社ごとの切片
新卒の基本年収は,
会社1で383万円くらい会社2で335万円くらい会社3で325万円くらい会社4で482万円くらい
先ほど に比べかなり妥当な結果に!
8.1.4推定結果の解釈会社ごとの傾き
年齢に伴う昇給額は,
会社1で8万円くらい会社2で19万円くらい会社3で12万円くらい会社4で10万円くらい
こちらもまあまあ妥当
8.1.4推定結果の解釈各パラメータのバラツキ
データが4社分しかなかったので確信区間が広く
推定され,負の値や極端に大きな値が含まれている
600万円もバラツキがある…?
新卒の基本年収のバラツキは156万円くらい年齢に伴う昇給額のバラツキは11万円くらいノイズの大きさは29万円くらい
☞弱情報事前分布を活用する方法も (10章)
8.1.5モデルの比較モデル式8−1から8−3を図示して比べてみる
モデル式8−1 モデル式8−2 モデル式8−3
各会社の年収Yに共通の切片と傾き
各会社の年収Yに独自の切片と傾き
各会社の切片と傾きを決めるパラメータ設定
階層モデル (モデル式8−3)では,切片aと傾きbを決めるハイパーパラメータσaとσbが設定されている
8.1.5推定値のシュリンケージモデル式8−2と8−3の結果を比べてみる
「切片aと傾きbが類似している」という仮定により, 会社4の切片aが全体の中央値に近くなる (左図)
会社4の傾きbが全体の傾きに近くなり,過学習を避けている (右図) → データのshrinkage
8.1.6階層モデルの等価な表現モデル式8−3と等価かつ簡潔な表現
「すべての会社の切片の平均がa全体平均であり,各社のa[k]は平均a全体平均,標準偏差σaの正規分布から生成される」と考えるモデル (傾きbも同様)
この部分が... こうなる
モデル式8−4
8.1.6 Stanでの実装parametersブロック
会社差のパラメータの書き方を変更
8.1.6 Stanでの実装
modelブロック
transformed parameters
ブロックをごっそり削除
aとbにゆるい制約
8.1.6階層モデルの等価な表現モデル式8−4は,8−3と等価にもかかわらず 記述が倹約的 計算速度が速い
という利点がある
複数の階層を持つモデル (次節)ではより顕著に
ただし,モデルによっては計算速度が遅くなったり,収束しにくくなったりする (らしい)
データ例:業界ごとの社員の年齢と年収8.1節のデータはある業界の大手4社のものさらに2つの業界のデータを追加
8.2複数の層を持つ階層モデル
X =社員の年齢 (実年齢 − 23)
Y =年収KID =勤務している会社のID
(1〜 4)
GID =会社が所属する業界のID (1〜 3)
・・・
8.2.1解析の目的解析の目的 それぞれの会社 (KID)における年齢Xと基本年収Yの関係
それぞれの業界 (GID)における平均的な年齢Xと基本年収Yの関係
が知りたい
業界が異なれば,「新卒の基本年収」と「年齢に伴う昇給額」の平均も異なる
☞データの分布を確認する
8.2.1データ分布の確認
どの業界でも年収は年齢に比例してそう
業界によって「新卒の基本年収」と「年齢に伴う昇給額」が違いそう
データの散布図 (全体・業界ごと) を見る
8.2.1データ分布の確認各会社の切片と傾きの業界ごとの分布を見る
aとbは山型に分布?aとbの業界平均は異なる (分布のピークが違う)
aとbの会社差のバラツキも業界ごとに異なる (分布の幅が違う)
8.2.2メカニズムの想像ーその1シンプルなモデルから考える
「aとbの平均は業界ごとに異なるが,バラツキは共通」とするモデル
切片aについて,
a業界差[g]およびa会社差[k] は Normal(0, σ) から生成
「会社差のパラメータは業界内で類似している」「業界差のパラメータは類似している」
2つの階層を持つ階層モデル
8.2.3モデル式の記述ーその1モデル式8−5
N =人数,K =会社,G = 業界K2G = 会社kが所属している業界のGID
8.2.4 Stanで実装ーその1dataブロック
業界の数をGで宣言
K2G[k]の部分を宣言
8.2.4 Stanで実装ーその1parametersブロック
a業界平均[g],b業界平均[g]
σag,σbg
8.2.4 Stanで実装ーその1modelブロック モデル式8−5の
業界平均の部分
モデル式8−5の会社平均の部分
8.2.4 Stanで実装ーその1RコードはK2Gを作成する部分がちょっとテクい
欲しいのは「その会社がどの業界に属するか」を表す数値ベクトルなので,データの“KID”と“GID”の列にunique ()
関数を使って重複部分を削除している
8.2.4結果の出力業界ごとの切片
新卒の基本年収は,
業界1で359万円くらい業界2で299万円くらい業界3で499万円くらい
→ かなり異なる
8.2.4結果の出力業界ごとの傾き
年齢に伴う昇給額は,
業界1で13万円くらい業界2で29万円くらい業界3で13万円くらい
→ 業界2が大きい
8.2.4結果の出力会社差のバラツキ
切片:23万円くらい傾き:5万円くらいノイズ:66万円くらい
のバラツキがある
8.2.5メカニズムの想像ーその2モデルの仮定を少しゆるめる
「aとbの平均もバラツキも業界ごとに異なる」
→業界ごとにσaとσbの値がある
「年齢以外の影響 (ノイズ)の大きさも業界ごとに異なる」
→業界ごとにσYの値がある
とするモデル
8.2.6モデル式の記述ーその2
モデル式8−6
業界ごとにバラツキが異なるので,σaとσbに添え字業界ごとにノイズの影響が異なるので,σYに添え字
8.2.7 Stanで実装ーその2dataブロック
GID[n]を宣言
8.2.7 Stanで実装ーその2parametersブロック
σa,σb,σYの宣言を変更
8.2.7 Stanで実装ーその2modelブロック
添え字バージョンに変更
8.2.7結果の出力業界ごとの切片のバラツキ
業界1の会社差のバラツキがすごい
→データ不足?
8.2.7結果の出力業界ごとの傾きのバラツキ
中央値を見ると業界ごとに結構違いそう
8.2.7結果の出力業界ごとのノイズのバラツキ
ノイズ (年齢以外の要因)の大きさも業界によって異なりそう
複数階層モデルにおける注意点モデルの複雑さに対してデータが少ないと,
シンプルなモデルから複雑なモデルにする過程でMCMCが収束しなくなることがある
対処法としては,
諦めてシンプルなモデルに戻る
弱情報事前分布などを使って仮定を増やす
など
8.3非線形モデルの階層モデル
8.3節では階層モデルを非線形のモデリングに当てはめる
データ例:薬の血中濃度の時系列データ(7.3節)
患者に薬剤を投与し,1時間後 (Time 1),2時間後 (Time 2)…24時間後 (Time 24)の血中濃度Y (mg/mL)を測定
15人分のデータを追加PersonID =1〜16
8.3.1解析の目的とデータ分布の確認
解析の目的
それぞれの患者について,頭打ちになるYの値と,頭打ちになるまでの時間
患者差のバラツキ が知りたい
すべてのデータは途中で頭打ちになっている (非線形である)
Time24におけるYの値は,山型の分布になりそう
8.3.2メカニズムの想像7.3節のモデル
患者ごとにモデル式を当てはめることもできるが,a[n]とb[n]に何らかの仮定を置かないと予測には使えない
頭打ちになるYの値 頭打ちになるまでの時間
a[n]とb[n]は正の値なので,log(a[n])とlog(b[n])が正規分布に従うという階層モデルを適用
8.3.3モデルの記述
モデル式8−7
推定するパラメータ血中濃度Yのバラツキ: σY頭打ちになるYの値: a[n],a全体平均,σa頭打ちになるまでの時間: b[n],b全体平均,σb
先ほどのモデル を拡張したもの
N =患者の人数T =測定された時点数 (ここでは6)
Time[t] =測定時の経過時間
8.3.4 Stanで実装 (Stanコード)dataブロック
YはN行T列の配列型
8.3.4 Stanで実装 (Stanコード)parametersブロック
log(a[n])とlog(b[n])の定義
8.3.4 Stanで実装 (Stanコード)transformed parametersブロック
曲線のパラメータであるaとbを定義
8.3.4 Stanで実装 (Stanコード)modelブロック log(a[n])とlog(b[n])
に対してゆるい制約
モデル式を記述7章のモデルに患者の人数についてのfor文を追記データが配列型なので二重for文
8.3.4 Stanで実装 (Stanコード)
generated quantitiesブロック
7章と同様に生成量を作成患者の人数についてのfor文を追記
8.3.4 Stanで実装 (Rコード)
Yは二次元配列Rではmatrixやdata.frameで渡す
8.3.5推定結果の解釈推定された各パラメータの値※σY以外は対数スケールなので注意
各患者のa[n]とb[n]についても
推定され,患者ごとの予測分布を描くこともできる
8.4ロジスティック回帰の階層モデル
8.4節ではロジスティック回帰の階層モデルを扱う
データ例:学生の出欠データ(5.3節)
学生の授業への出席 (0:欠席,1:出席)を,
・アルバイトが好きかどうか (0:嫌い,1:好き)
・学問への興味の強さ (200点満点)
・授業日の天気 (A:晴れ,B:曇り,C:雨)
によって説明
8.4ロジスティック回帰の階層モデル
5.3節のモデル
A =アルバイトが好きかどうか (0:嫌い,1:好き)
Score =学問への興味の強さ (200点満点)
Weather =授業日の天気 (A:晴れ,B:曇り,C:雨)
Y =授業に出席したかどうか (0:欠席,1:出席)
上記のモデルでは「学生による出席行動の差 (学生差)」や「科目に人気があるかどうかの差 (科目差)」などは考慮されていない
学生差・科目差を考慮した階層モデルを考える
8.4ロジスティック回帰の階層モデル
学生差と科目差について考慮するため,科目のID (CourseID)を取得し,学生に関するデータと出欠記録に関するデータを作成
学生に関するデータ1行が1人分
出欠記録に関するデータ1行が1出欠分
8.4.1解析の目的解析の目的
与えられた説明変数から応答変数がどれほど予測できるか知りたい
それぞれの説明変数が出席確率にどれほど影響しているか知りたい
学生差のバラツキと科目差のバラツキがどれほどか知りたい
8.4.2メカニズムの想像出席率を決める要素を,①学生に依存するもの②科目に依存するもの③一回ごとの授業に依存するものに分けて考える
学生に依存
アルバイト好/嫌学問への興味学生差
科目に依存
科目差授業に依存
授業日の天気
8.4.2メカニズムの想像それぞれの要素について,説明変数を使った回帰を行い,それらの要素の和をロジスティック関数で変換して出席率を求める
x[i] =切片+ + +
出席率q[i]
ロジスティック関数で (0, 1)の範囲に変換
8.4.3モデルの記述モデル式8−8
N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数
8.4.3モデルの記述モデル式8−8
N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数
学生に依存
アルバイト好/嫌学問への興味学生差
学生に依存する項はアルバイト好/嫌+学問への興味+学生差
学生差は正規分布に従うと仮定
8.4.3モデルの記述モデル式8−8
N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数
科目に依存する項は科目差そのもの科目差は正規分布に従うと仮定
科目に依存
科目差
8.4.3モデルの記述モデル式8−8
N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数
授業に依存する項は説明変数Weather
と比例
授業に依存
授業日の天気
8.4.3モデルの記述モデル式8−8
N =学生の人数; I =出欠データ数 (ここでは2396); C =科目数
各要素の和をとって,ロジスティック関数により出席確率q[i]に変換出席率q[i]
※切片b1は最後の式にのみ入ることに注意(各要素を代入する際に切片1+切片2のような項が現れ,収束しなくなる)(らしい)
8.4.4 Stanでの実装 (Stanコード)dataブロック
PersonIDとCourseID
を宣言
8.4.4 Stanでの実装 (Stanコード)parametersブロック
b学生差[n]とb科目差[c]を宣言
σPとσCを宣言
8.4.4 Stanでの実装 (Stanコード)transformed parametersブロック
学生に依存する項科目に依存する項授業に依存する項 を作成
8.4.4 Stanでの実装 (Rコード)
天気の文字列を数値に置き換え
出力が多いため一部の変数のみをサンプリング
8.4.5推定結果の解釈各パラメータの事後分布と確信区間
「アルバイトが好き(b2)」と「天気が雨(b4)」は出席率に負の影響
「学問への興味(b3)」は正の影響
学生差(s_P)の影響は小さいが,科目差(s_C)の影響は大きそう
8.4.5推定結果の解釈科目差の事後分布
最も出席率の高い科目と最も低い科目のMAP推定値は3以上(オッズで20倍程度)差がある=科目差の影響は大きい
階層モデルはロジスティック回帰とも簡単に組み合わせることが可能(例:商品購入確率を,顧客に依存する要素,商品に依存する要素,購買に依存する要素などに分解してモデリング可能)