混合一般化線形モデルの解析テスト

前置き

同じ形式のデータがいくつかのグループに分かれている場合、全体を一つの回帰モデルで分析するのでは不十分で、グループごとの特性を踏まえるほうが妥当な場合がある。

たとえば、

  • プレテストと本テストの関係データで、学校間の差異を調べてみる必要がある場合 (教育学分野)
  • 生態学の調査で、複数の調査地点のデータがあり、地点別の特性を踏まえるべき場合 (生態学)

などである。

方法としては同じであるが、教育学分野では「階層線形モデル」(Hierarchical Linear Model: HLM)、生態学分野では「一般化混合モデル」(Generalized Linear Mixed Model: GLMM)と呼ばれる。

データは、「回帰分析入門」(豊田秀樹、東京図書)9章より

この豊田本では、mlmRevというライブラリを用いている。mlmRevは、評価(review)用データの集合体のようで、統計ライブラリとしてはlme4が用いられているので、実践的には、lme4を使えばよいだろう。

https://rpubs.com/hoxo_m/19257

https://cran.r-project.org/web/packages/mlmRev/mlmRev.pdf

豊田本のホームページからプログラムはダウンロードできる(短いので手打ちでもよいが)。下記"SR09.R"は9章で用いるプログラムである。

モジュールlatticeは、プロットに用いる高次グラフ作成ライブラリである。(次のように、それを読み込むと、前提としてlme4とMatrixもよみこまれるようだ。)

生態学分野の人の文献

多くの一般化線形モデルの実践的な解説は、生態学者によるものが多いようだ。(フィールドデータの分析に必要なためだろう。)

  • 有名なのは、「データ解析のための統計モデリング入門」(久保拓弥、岩波) ... これは通称「緑本」と呼ばれ、人気があるもののようだ。
    たくさん出張講義を行っていてそのスライド(PDF)が http://hosho.ees.hokudai.ac.jp/~kubo/ce/InvitedLecture.html に載っている。
    2015年の社会心理学会でのセミナーのものがよさそう。(ただ、生態学でのロジスティック関数でフィッティングできる例を用いているのだが、これはちょっと合わない。)
  • 同じ生態学者によるものだが、北大の隅田さんのものが、シンプルでとっつきやすい。 こちらを勧める http://www.lowtem.hokudai.ac.jp/plantecol/akihiro/sumida-index.html
In [29]:
library("lattice")
source("S09.R") # 豊田本のホームページよりゲットする
Loading required package: lme4
Loading required package: Matrix

mlmRevにあるデータを使った階層線形モデルのテスト

豊田本9章にある解析をなぞる。

下では、豊田本のサイトからとったcsvファイルを用いてるが、mlmRevに含まれているExamというデータを使ってみてもよい。

In [80]:
# 使用するライブラリの読み込み
library(mlmRev)
# 表9.1 「9校のデータ」の読み込み
test<-read.csv("dat/nine-school-testdata.csv", header=T)
head(test) # 最初の部分のみ表示 (単に、testとすると全部表示される)
XschoolsexnormexamstandLRTtype
1767 学校1 F -0.8526700 0.2884532Sngl
1768 学校1 F -0.3388420-1.6125300Sngl
1769 学校1 F 0.1941492-0.3727580Sngl
1770 学校1 F -0.1290850 0.6190592Sngl
1771 学校1 F 0.0043222-1.0339700Sngl
1772 学校1 F -0.1976110-1.1166210Sngl

つぎのような2つの列の単回帰を、階層モデルで分析する。

列名 意味
standLRT プレテスト
normexam ポストテスト

ちなみに、次に示すExamデータを使ってみてもよい。(ここでは行わない。)

In [81]:
#  mlmRevに含まれている上記と同様のデータでもっと大きなデータ
head(Exam)
schoolnormexamschgendschavgvrintakestandLRTsextypestudent
1 0.2613242mixed 0.1661752 mid 50% bottom 25% 0.6190592F Mxd 143
1 0.1340672mixed 0.1661752 mid 50% mid 50% 0.2058022F Mxd 145
1 -1.7238820mixed 0.1661752 mid 50% top 25% -1.3645760M Mxd 142
1 0.9675862mixed 0.1661752 mid 50% mid 50% 0.2058022F Mxd 141
1 0.5443412mixed 0.1661752 mid 50% mid 50% 0.3711052F Mxd 138
1 1.7348992mixed 0.1661752 mid 50% bottom 25% 2.1894372M Mxd 155
In [24]:
# データ全体の単回帰係数
reg.result <- lm(normexam~standLRT,data=test)
reg.result
Call:
lm(formula = normexam ~ standLRT, data = test)

Coefficients:
(Intercept)     standLRT  
     0.1780       0.7444  
In [25]:
# 散布図と単回帰直線
coef(reg.result)
plot(test$standLRT,test$normexam)
abline(reg.result)
(Intercept)
0.177956214699224
standLRT
0.744380577394912
In [7]:
# 散布図の描画
xyplot(normexam~standLRT|test[,2], type=c("p"),data=test,layout=c(3,3),
xlim=c(-3,3),ylim=c(-3,3),xlab="プリテスト得点",ylab="ポストテスト得点")
In [5]:
# 最小モデル結果
(null<-lmer(normexam~1+(1|school),data=test))
Linear mixed model fit by REML ['lmerMod']
Formula: normexam ~ 1 + (1 | school)
   Data: test
REML criterion at convergence: 1448.602
Random effects:
 Groups   Name        Std.Dev.
 school   (Intercept) 0.6511  
 Residual             0.9623  
Number of obs: 514, groups:  school, 9
Fixed Effects:
(Intercept)  
     0.1406  
In [8]:
# ランダム切片モデルの結果
(RI<-lmer(normexam ~standLRT+(1|school),data=test))
Linear mixed model fit by REML ['lmerMod']
Formula: normexam ~ standLRT + (1 | school)
   Data: test
REML criterion at convergence: 1199.185
Random effects:
 Groups   Name        Std.Dev.
 school   (Intercept) 0.4636  
 Residual             0.7528  
Number of obs: 514, groups:  school, 9
Fixed Effects:
(Intercept)     standLRT  
     0.1686       0.6286  
In [9]:
# ランダム切片・係数モデルの結果(ランダム切片とランダム係数の相関含む)
(RIC<-lmer(normexam ~standLRT+(standLRT+1|school),data=test))
Linear mixed model fit by REML ['lmerMod']
Formula: normexam ~ standLRT + (standLRT + 1 | school)
   Data: test
REML criterion at convergence: 1173.872
Random effects:
 Groups   Name        Std.Dev. Corr
 school   (Intercept) 0.4785       
          standLRT    0.1988   0.90
 Residual             0.7304       
Number of obs: 514, groups:  school, 9
Fixed Effects:
(Intercept)     standLRT  
     0.1171       0.6179  
In [10]:
# 学校ごとの切片・傾きと回帰直線(ランダム切片モデル)
coef(RI)
xyplot(fitted(RI)~standLRT,group=school,type=c("l")
,data=test,xlab="プリテスト得点",ylab="ポストテスト得点")
$school
      (Intercept)  standLRT
学校1 -0.19211316 0.6285883
学校2  0.24851488 0.6285883
学校3  0.74271430 0.6285883
学校4  0.53034684 0.6285883
学校5 -0.61404597 0.6285883
学校6  0.59960613 0.6285883
学校7 -0.24428736 0.6285883
学校8  0.39996376 0.6285883
学校9  0.04669858 0.6285883

attr(,"class")
[1] "coef.mer"
In [12]:
# 学校ごとの切片・傾きと回帰直線(ランダム切片・係数モデル)
coef(RIC) # 切片、傾きの計算結果出力
xyplot(fitted(RIC)~standLRT,group=school,type=c("l"),
data=test,xlab="プリテスト得点",ylab="ポストテスト得点")
$school
      (Intercept)  standLRT
学校1 -0.25395384 0.5145033
学校2  0.24489004 0.6522846
学校3  0.67187959 0.9348293
学校4  0.48506993 0.7071346
学校5 -0.73254408 0.2987201
学校6  0.52555250 0.6944106
学校7 -0.31855064 0.4295189
学校8  0.38482287 0.7290291
学校9  0.04646698 0.6007661

attr(,"class")
[1] "coef.mer"

lme4のlmerの利用

参考: http://www.lowtem.hokudai.ac.jp/plantecol/akihiro/sumida-index.html

上記にならって混合モデル解析lmerを使ってみる。(同じことをやっているのだが。)

モデルは 従属変数 ~ 固定因子 + (ランダム因子) のように書く。

mixedM <- lmer(normexam~standLRT + (standLRT+1|school),data=XYdata)

のように書くと、切片、傾き両方にランダム因子を入れることになる。(が、+1はなくても同じ結果になる。)

In [52]:
# 豊田本「9校のデータ」の読み込み
XYdata<-read.csv("dat/nine-school-testdata.csv", header=T)
In [61]:
library("lme4")
mixedM <- lmer(normexam~standLRT + (standLRT|school),data=XYdata)
In [75]:
summary(mixedM)
RI<-lmer(normexam ~standLRT+(1|school),data=test) # 切片だけをランダム項とした場合
LM<-lm(normexam ~standLRT,data=XYdata) # グループ分けしない単回帰
AIC(LM, RI, mixedM) # AICで妥当性をチェック
BIC(LM, RI, mixedM)
Linear mixed model fit by REML ['lmerMod']
Formula: normexam ~ standLRT + (standLRT | school)
   Data: XYdata

REML criterion at convergence: 1173.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.9490 -0.6124  0.0241  0.6903  3.0241 

Random effects:
 Groups   Name        Variance Std.Dev. Corr
 school   (Intercept) 0.2289   0.4785       
          standLRT    0.0395   0.1988   0.90
 Residual             0.5336   0.7304       
Number of obs: 514, groups:  school, 9

Fixed effects:
            Estimate Std. Error t value
(Intercept)  0.11707    0.16323   0.717
standLRT     0.61791    0.07469   8.272

Correlation of Fixed Effects:
         (Intr)
standLRT 0.790 
dfAIC
LM3 1305.110
RI4 1207.185
mixedM6 1185.872
dfBIC
LM3 1317.836
RI4 1224.154
mixedM6 1211.326

モデルの妥当性のチェックのためには、赤池情報基準(AIC), ベイジアン情報基準(BIC)が用いられる。

それぞれ、小さいほうがモデルとして妥当と言える。(ただし、数値の絶対値に意味はないので、異なるデータ間の比較はしない。)

In [55]:
# データと回帰直線を重ね書きするには、latticeによる描画(xyplotなど)の場合はlatticeExtraに含まれるas.layer関数を利用する
library(latticeExtra)
coef(mixedM)
fit_lines <- xyplot(fitted(mixedM)~standLRT,group=school,type=c("l")
,data=test,xlab="プリテスト得点",ylab="ポストテスト得点")
data_plot <- xyplot(XYdata$normexam~XYdata$standLRT, group=XYdata$school, type=c("p"), add=T)
fit_lines + as.layer(data_plot)
$school
      (Intercept)  standLRT
学校1 -0.25395384 0.5145033
学校2  0.24489004 0.6522846
学校3  0.67187959 0.9348293
学校4  0.48506993 0.7071346
学校5 -0.73254408 0.2987201
学校6  0.52555250 0.6944106
学校7 -0.31855064 0.4295189
学校8  0.38482287 0.7290291
学校9  0.04646698 0.6007661

attr(,"class")
[1] "coef.mer"
In [ ]: