LMEモデル推定をR言語を用いて実践してみる。
まずRをインストールし、RGuiを開く。
今回使うパッケージはlme4とlmeTestなので、これらを読み込む。lme4のlmer()関数によってLMEモデル推定を行うが、lme4だけだと固定効果のp値が得られないため、lmeTestを追加で読み込む必要がある。
>Install.packages(“lme4”) #lme4インストール
>library(“lme4”) #lme4読み込み
>options(repos="http://cran.ism.ac.jp/")
>install.packages("lmerTest") #lmerTestインストール
>library(“lmerTest”) #lmerTest読み込み
次にデータを読み込んでみる。今回、4人の学生の勉強日数と点数のテストデータをCSVファイルで用意した。
> s_data <- read.csv("score_data.csv")グラフにplotすると
> s_data
subject days Score
1 0 10 97.88387
2 0 8 98.59650
3 0 6 97.65732
4 0 4 96.16080
5 0 10 99.59362
6 0 8 97.77845
7 0 10 98.22498
8 0 10 98.04627
9 0 8 98.25393
10 0 10 97.46261
11 0 6 98.18022
12 0 4 96.99735
13 0 13 97.90047
14 0 6 98.66602
15 0 15 98.52445
16 0 12 97.65170
17 0 8 97.65037
18 0 14 98.28197
19 0 11 97.47814
20 0 10 98.51969
21 0 11 98.76532
22 0 8 97.27131
23 0 6 98.02530
24 0 10 98.52534
25 0 14 99.38336
26 0 4 94.42770
27 0 7 98.01417
28 0 12 98.10540
29 0 4 97.87208
30 1 10 97.82623
31 1 10 96.94224
32 1 14 98.31716
33 1 13 95.45953
34 1 18 96.94513
35 1 11 93.20422
36 1 6 94.51405
37 1 8 91.38044
38 1 16 93.66502
39 1 6 93.81745
40 1 13 97.06315
41 1 8 96.63337
42 1 11 96.66075
43 1 9 96.37080
44 1 13 98.71230
45 1 18 97.57873
46 1 5 94.33944
47 1 7 94.78274
48 1 17 97.75903
49 1 11 96.82348
50 1 17 97.77848
51 1 5 91.73288
52 2 15 90.96240
53 2 12 91.43013
54 2 15 96.27122
55 2 14 93.39732
56 2 18 92.99953
57 2 11 93.39127
58 2 9 91.33970
59 2 5 87.46454
60 2 18 91.80603
61 2 4 90.71793
62 2 10 91.20598
63 2 4 90.24194
64 3 5 90.67530
65 3 17 95.64061
66 3 14 97.77640
67 3 15 96.77373
68 3 14 95.39185
69 3 14 97.48028
70 3 5 91.10883
71 3 4 88.89533
72 3 10 95.65205
73 3 5 92.51790
74 3 6 89.78949
75 3 14 94.84116
76 3 15 96.99177
77 3 13 95.21246
>plot_data <- function(x){
for (i in 1:nrow(x)){
plot(x[i,2],x[i,3],col=x[i,1]+1,xlim=c(min(x[,2]),max(x[,2])),ylim=c(min(x[,3]),max(x[,3])),ann=F)
par(new=T)
}
}
>plot_data(s_data)
各学生の勉強時間(横軸)とテストの点数(縦軸) |
さて、ここからが本題であるが、lmer関数でLMEモデル推定を行う。
第一引数にモデル関数、第二引数に解析データの行列を入れる。
モデル関数の表記は以下のように行う。Yは従属変数ラベル、Xi(i=1,2,…)は説明変数ラベル(切片は省略するが、切片のみを記述する場合は1を入れる)、Ci(i=1,2,…)はクラスタラベルである例えば、上記のデータで、勉強日数に応じて点数が変化するようなモデルを考える。
Y~X1+X2+X3…+(X1'+X2'+…|C1)+(X1"+X2"+…|C2)+…
勉強日数の係数(傾き)が学生共通で一定(固定効果)で、切片は学生それぞれに対して変わる(変量効果)ような場合、
で推定が行える。結果を見るには、Score~days+(1|subject)となる。従って、lmer(Score~days+(1|subject),data=s_data)
とすれば見ることができる。> test_model1 <- lmer(Score~days+(1|subject),data=s_data)
> summary(test_model1)
推定結果の見方を説明する。
赤文字にした部分が変量効果(Random effects)、固定効果(Fixed effects)についての記述。
Linear mixed model fit by REML t-tests use Satterthwaite approximations to
degrees of freedom [merModLmerTest]
Formula: Score ~ days + (1 | subject)
Data: s_data
REML criterion at convergence: 297.1
Scaled residuals:
Min 1Q Median 3Q Max
-2.4714 -0.6311 0.1049 0.7079 2.1640
Random effects:
Groups Name Variance Std.Dev.
subject (Intercept) 8.186 2.861
Residual 2.232 1.494
Number of obs: 77, groups: subject, 4
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 91.59004 1.51029 3.61000 60.644 1.48e-06 ***
days 0.31828 0.04266 72.11000 7.461 1.53e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
days -0.298
変量効果については、切片(Intercept)の変量効果における正規分布の分散(Variance)と標準偏差(Std.Dev)が記してある。
固定効果については、dayの係数と切片について、推定した値(Estimate)とP値(Pr)が記してある。
固定効果についてはfixef()で、それぞれのクラスタにおける変量効果についてはranef()で参照できる。
> fixef(test_model1)傾きにも変量効果を加えて再度推定してみる。
(Intercept) days
91.590043 0.318283
> ranef(test_model1)
$subject
(Intercept)
0 3.4623447
1 0.6747299
2 -3.3261432
3 -0.8109314
> test_model2 <- lmer(Score~days+(days|subject),data=s_data)plotしてみる
>lmer_plot <- function(x,y){
rmat <- ranef(y)
fmat <- fixef(y)
for (i in 0:max(x[,1])+1){
func_buff <- function(x){(fmat[2]+rmat[[1]][i,2])*x+(fmat[1]+rmat[[1]][i,1])}
plot(func_buff,xlim=c(min(x[,2]),max(x[,2])),ylim=c(min(x[,3]),max(x[,3])),col=i,ann=F)
par(new=T)
}
fix_func <- function(x){fmat[2]*x+fmat[1]}
plot(fix_func,xlim=c(min(x[,2]),max(x[,2])),ylim=c(min(x[,3]),max(x[,3])),lty=2,ann=F)
par(new=T)
}
>lmer_plot(s_data,test_model2)
点線:固定効果モデル 各実線:それぞれの学生の混合効果モデル |
また、切片、傾きそれぞれの変量効果の確率分布をplotすると次のようになる。
切片(定数項の係数)の確率分布 |
傾き(daysの係数)の確率分布 |