[Stata][Multileve]Stataでのマルチレベル分析について

asphalt balance blur close up stata
Photo by Pixabay on Pexels.com

マルチレベルMultilevel分析

色々な資料はインターネット上に転がっているが、ここではPrinceton大学の講義資料に沿って学習する。

https://www.princeton.edu/~otorres/Multilevel101.pdf

Stataのxtmixedについてのリンクはこちら

まとめ

マルチレベル解析はデータに二つ以上の階層構造があるときに用いる。例えば多数の病院での臨床試験や、国ごとの国際アンケート調査などのデータがこれに当たる。マルチレベル分析を用いることにより、

  • グループや単位ごとに異なる効果を検証できる。
  • グループレベルでの平均を推定できる

ことが挙げられる。また、利点としては

  • 通常の回帰分析では無視されてしまうグループや単位間での平均の違いを検出できる。
  • グループの数が多くなると回帰分析ではサンプル数が足りなくなったり、一般化ができなくなるという問題を回避できる。

があるだろう。

実際のデータを使って手を動かす。

use https://dss.princeton.edu/training/schools.dta, replace

でデータをimportする。データは下のようになる。

データの例。

変数としては、”school”, “student”, “y”, “x1”, “x2”, “x3″の\(6\)つがある。学生の数は\(4,059\)人。”school”は学校のIDで全部で\(65\)校、”student”はそのまま個々の生徒のIDであるが学校ごとにそれぞれ振られている(つまり、学校\(1\)のID\(1\)と、学校\(2\)のID\(1\)が存在する)。”y”は点数(マイナスもあるよう)、”x1″はReadingの試験の点数(これもマイナスがある)、”x2″は性別で女性が\(1\)、最後の”x3″は学校のタイプで”Mixed”, “Boys only”, “Girls only”の\(3\)種類。以下のコマンドでまず学校ごとの平均点の変数を生成する。

bysort school: egen y_mean = mean(y)

以下のコマンドで個々の学生のスコア\((y)\)と学校ごとのスコアの平均\((y_{mean})\)をグラフにできる。

twoway scatter y school, msize(tiny) || connected y_mean school, connect(L) clwidth(thick) clcolor(black) mcolor(black) msymbol(none) || , ytitle(y)
グラフはこちら。

通常の回帰分析

まずは学校ごとの回帰分析、つまり各学校に属する個人のReadingテストの成績がy(Score)とどのような線形関係にあるのかをグラフにしてみる。

statsby inter = _b[_cons] slope = _b[x1], by(school) saving(ols, replace): regress y x1
sort school
merge school using ols
drop _merge
gen yhat_ols = inter + slope*x1
sort school x1
seperate y, by(school)
seperate yhat_ols, by(school)
twoway connected yhat_ols1-yhat_ols65 x1 || lfit y x1, clwidth(thick) clcolor(black) legend(off) ytitle(y) 

出力されるグラフがこちら。

何が何だか分からない。

通常の回帰分析では階層構造が消失してしまい、単なる学校ごとの分析になってしまっている。そこで以下でマルチレベル分析を行う。

変動切片モデル Varying-intercept model (null)

最も単純なモデルで、\(y_i = {\alpha}_{j[i]} + \epsilon_{i}\)というモデルで表される。つまり、傾きは持たず、群の間で切片だけが異なるという推定モデルになる。

xtmixed y || school:, mle nolog

“mle”はmaximum likelihood estimationの略になる。Stataのmultilevel分析はdefaultでmleになっている。制限付き最尤推定法を指定するときは”reml”にする。結果は以下。”nolog”オプションでlogの出力を抑制できる。

Varying-intercept model (null)

上の結果で\(y\)の下にある_consが全体の切片である。schoolにあるsd(_cons)が学校レベル(レベル\(2\))の標準偏差、sd(Residual)が個人レベル(レベル\(1\))の標準偏差である。”Prob >= chibar2 = 0.0000″がRandom-effects = 0という帰無仮説に対する検定結果になる。つまり、\(\alpha = 0.05\)とすれば、この帰無仮説は棄却されるので、ランダム効果ありという解釈すれば良い。

級内相関Intraclass correlation (ICC)は以下の式で表示される。$$\begin{eqnarray}ICC & = &\frac{({\text{sigma_u}})^2}{(\text{sigma_u})^2 + (\text{sigma_e})^2} \\ & = & \frac{{\text{sd(_cons)}}^2}{{\text{sd(_cons)}}^2+{\text{sd(residual)}}^2} \\ & = & \frac{{4.11}^2}{{4.11}^2+{9.21}^2}\\ & = & 0.17\end{eqnarray}$$もしもICCが\(0\)に近づくと、集団ごとのグルーピングは無意味になっていく。つまり、単純な回帰を行ったほうが良いということになる。逆に、ICCが\(1\)に近づくと、群内の個人個人が全員同一で、個人レベルでの差異を説明するものはないということになる。

StataでICCを計算するときは、”xtmixed”コマンドの後に、

estat icc

とすると良い。

なお、もとのpdfではStata 13からxtmixedのコマンドはmixedに変わったとあるが、mixedで解析を行うと標準偏差ではなく分散が表示される。

変動切片モデル Varying-intercept model (one level-1 predictor)

これは群間で切片だけが異なり、傾きは同一とみなす推定モデルになる。式で表すと\(y_i = {\alpha}_{j[i]} + \beta x_i + {\epsilon}_i\)となる。

xtmixed y x1 || school:, mle nolog
Varying-intercept model (one level-1 predictor)

\(x1\)の部分の係数(Coef.)が全体の共通の傾き\(\beta\)である。その他の結果の解釈については上と同一になる。また、$$\begin{eqnarray}ICC & = &\frac{({\text{sigma_u}})^2}{(\text{sigma_u})^2 + ({\text{sigma_e}})^2} \\ & = & \frac{{\text{sd(_cons)}}^2}{{\text{sd(_cons)}}^2+{\text{sd(residual)}}^2} \\ & = & \frac{{3.03}^2}{{3.03}^2+{7.52}^2}\\ & = & 0.14\end{eqnarray}$$である。

変動切片・傾きモデル Varying-intercept, varying-coefficient model

いわゆる混合モデル(Miexed model)である。群間で切片も傾きも異なるとみなし推定する。式は\(y_i = {\alpha}_{j[i]} +{\beta}_{j[i]}x_i + {\epsilon}_i\)となる。

xtmixed y x1 || school: x1, mle nolog covariance(unstructure)
Varying-intercept, varying-coefficient model

$$\begin{eqnarray}ICC & = &\frac{({\text{sigma_u}})^2}{(\text{sigma_u})^2 + ({\text{sigma_e}})^2} \\ & = & \frac{{\text{sd(_cons)}}^2+sd(x1)}{{\text{sd(_cons)}}^2+sd(x1)+{\text{sd(residual)}}^2} \\ & = & \frac{{0.12}^2+{3.01}^2}{{0.12}^2+{3.01}^2+{7.44}^2}\\ & = & 0.14\end{eqnarray}$$である。

covarianceオプションは変数として”ind(ependent)”, “ex(changeable)”, “id(dntity)”, “un(structured)”の\(4\)つがある。defaultでは”independent”が採用されている。このオプションはランダム効果の共分散行列の構造を指定し、ランダム効果の式ごとに指定することができる。各ランダム効果式に指定することができる。”independent”オプションの共分散構造では、ランダム効果式内の各ランダム効果に個別の分散を許容し、すべての共分散が\(0\)であることを仮定する。”exchangeable”オプションの構造では、すべてのランダム効果に対して 1 つの共通分散と 1 つの共通ペア共分散が指定される。”identity”は”multiple of the indetity”の省略であり、つまりすべての分散が等しく,すべての共分散がゼロであることである。”unstructured”では、すべての分散と共分散を区別することができる。方程式が\(p\)個のランダム効果項で構成されている場合,”unstructured”の共分散行列は\(\displaystyle \frac{p(p+1)}{2}\)個の一意なパラメータを持つ。

変動傾きモデル Varying-slope model

上のVarying-intercept, varying-coefficient modelとは違い、切片は群間で異なるとはしない。式で書くと\(y_i = \alpha + {\beta}_{j[i]}x_i + {\epsilon}_i\)である。

xtmixed y x1 || _all: R.x1, mle nolog
Varying-slope model

Stataでは”_all”は予約語で、すべての変数を意味する。”R.”は変数x1に対してランダム効果を課している。R.を付けないと結果は同じであるが、分散が計算されない(ランダム効果を想定していないので当然)。

Likelihood ratioを用いたモデルの比較

尤度比を用いた検定(lrtest)でmleでfitしたモデルの比較を行う。この検定は二つのモデルが優位に異なるかどうか、モデルの対数尤度を比較する。

*Fitting random intercepts and storing results
quietly xtmixed y x1 || school:, mle nolog
est(imates) store  ri

*Fitting random coefficients and storing results
quietly xtmixed y x1 || school: x1, mle nolog covariance(unstructure)
est(imates) store rc

*Running the likelihood-ratio test to compare
lrtest ri rc, stats
statsオプションを付けるとAIC, BICを表示してくれる。

この結果の解釈であるが、帰無仮説は二つのモデルに差はない、である。”Prob > chi2″が\(0.05\)よりも小さいときに帰無仮説を棄却する。この場合、rcモデルの方が対数尤度が小さく、すなわちAICBICも小さくなっており、よりfitしたモデルと言える。

これまで出てきた\(4\)つのモデル全てについて、lrtestを行うと、rcモデルが最もfitしたモデルであることが言える。

Varying-intercept, varying-coefficient modelを使ったPost estimation

xtmixed y x1 || school: x1, mle nolog covariance(unstructure) variance

とすると、標準偏差ではなく分散が表示される。この分散を使って分散共分散行列を表示することができる。

estat recovariance
分散共分散行列。

相関を見るにはcorrelationオプションを付ける。

estat recovariance, corr(elation)
分散共分散行列の相関。

切片と\(x1\)の相関を見ると、\(y\)と\(x1\)の平均の”close relationship”を表している。

ランダム効果の推定

ランダム効果\(u\)を推定するには、predictコマンドとreffectsオプションを用いる。こうすることでランダム効果のBest Linear unbiased predictions (BLUPs)を与えることができる。これは、切片と傾きの変化の変動量を表す。数式では、$$y_i = {\alpha}_{j[i]} +{\beta}_{j[i]}x_i + {\epsilon}_i$$を$$y_i = {\alpha}_{j[i]} + {\beta}_{j[i]}x_i + u_{{\alpha}_i} + u_{{\beta}_{j[i]}} + {\epsilon}_i$$と、Fixed-effectsである\({\alpha}_{j[i]} + {\beta}_{j[i]}x_i\)およびRandom-effectsである\(u_{{\alpha}_i} + u_{{\beta}_{j[i]}} + {\epsilon}_i\)に分解することに相当する。

xtmixed y x1 || school: x1, mle nolog covariance(unstructure)
predict u*, reffects

とすると、新しい変数\(u1, u2\)が生成される。\(u1\)は\(u_{\beta}\)、\(u2\)は\(u_{\alpha}\)である。具体的な数値を入れると、$$y_i = -0.12 + 0.56×1 + u_{\alpha} + u_{\beta}$$となる。

bysort school: gen(erate) groups = (_n == 1)
list school u2 u1 if school <= 10 & groups

とすることで学校ごとの\(u2, u1\)をリスト表示できる。

各学校ごとの\(u2, u1\)の値。

例えば学校\(1\)の場合、$$\begin{eqnarray}y_1 & = & -0.12 + 0.56×1 + 3.75 + 0.12×1 \\ & = & (-0.12 + 3.75) + (0.56 + 0.12)x1 \\ & = & 3.63 + 0.68 x1 \end{eqnarray}$$と推定式を作ることができる。

これを学校ごとにすべて行うには、

gen intercept = _b[_cons] + u2
gen slope = _b[x1] + u1
list school intercept slope if school <= 10 & groups

となる。学校ごとの推定値は

gen yhat = intercept + (slope*x1)

とするか、xtmixedの後に

predict yhat_fit, fitted

とすると良い。

list school yhat yhat_fit if school <= 10 & groups
yhatとyhat_hiftが同じ値であることを確認されたい。

plotも簡単。

twoway connected yhat_fit x1 if school <= 10, connect(L)
school\(10\)までのfit。

以下のコマンドで残差プロットも描ける(図は省略)。xtmixedの後に行うこと。

predict resid, residuals
predict resid_std, rstandart
qnorm resid_std

コメント

タイトルとURLをコピーしました