<<目次へ


最終更新日 : 2007.11.25

変量効果



 いわゆる対応ありのデータに対する解析方法です。ある個体(心理学では被験者)から反復測定によって得られたデータをそのままglm()で今までと同じように解析するのは間違いです。なぜなら、いままでやってきたglm()による解析は「データセットがすべて独立した別の個体から得られたものである」と仮定できたものであったのに対して、今回のような例は独立性を仮定できないわけです。したがって、独立でないデータを独立であると仮定して解析することは間違いということです。

 では、結局のところ、glm()で解析して何が悪いかというと、

ということです。要するにp値の計算の仕方が異なるということです。

 Rではlme4というパッケージに含まれているlmer()という関数を用いることができます。lme4というパッケージは最初から実装されているわけではないので、使用するためにはこれをインストールする必要があります。

> install.packages("lme4") #lme4のインストール
> library(lme4) #パッケージlme4の呼び出し

 p229のBOX12.1と同じ解析を行ってみましょう。まずはglm()で分散分析表を作成しましょう(ただし、これによって得られるp値をそのまま採用してはいけない)。

# データフレームを作成しておく
> mydata
   LEAF CACONC
1     1 0.4567
2     1 0.6033
3     1 0.3918
4     1 0.3016
5     2 0.7291
6     2 0.6527
7     2 0.5165
8     2 0.5704
9     3 0.7727
10    3 0.6171
11    3 0.7330
12    3 0.8495
13    4 0.3526
14    4 0.4497
15    4 0.3459
16    4 0.5446

# 分散分析表の作成
> attach(mydata) #データフレームにパスを通す
> result <- glm(CACONC ~ LEAF)
> summary(aov(result))
            Df   Sum Sq  Mean Sq F value   Pr(>F)   
LEAF         3 0.280862 0.093621  8.7021 0.002443 **
Residuals   12 0.129100 0.010758                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

# LEAFを変量要因として解析
> model1 <- lmer(CACONC ~ (1|LEAF), family = gaussian, data = mydata)
> summary(model1)
Linear mixed-effects model fit by REML 
Formula: CACONC ~ (1 | LEAF) 
   Data: mydata 
    AIC    BIC logLik MLdeviance REMLdeviance
 -12.15 -10.60  8.075     -19.49       -16.15
Random effects:
 Groups   Name        Variance Std.Dev.
 LEAF     (Intercept) 0.020715 0.14393 
 Residual             0.010758 0.10372 
number of obs: 16, groups: LEAF, 4

Fixed effects:
            Estimate Std. Error t value
(Intercept)  0.55545    0.07649   7.262

> detach(mydata) #最後に通したパスを解除するのを忘れずに

 ここで出力結果の見方を解説しておきます。Random effects:の部分にある値がBOX12.1でいうところの「調整平方和を使う分散成分」の値です。

 つづいて正しいp値を算出するための手順を紹介します。とりあえず、F値を求めなければなりませんが、簡単にF値を算出するために以下のような関数を定義しました。

KHH <- function(var.comp, group.num){
        vec.n <- length(var.comp)
        dat <- c()
        for(i in 1:vec.n){
                dat[i] <- sum(var.comp[i:vec.n] * group.num[i:vec.n])
        }
        f.value <- c()
        for(j in 1:vec.n){
                f.value[j] <- dat[j] / dat[j+1]
        }
        f.value
}

 関数KHHの引数であるvar.compは先ほど求めた分散成分の値です。これをベクトルとして指定してください。また、引数group.numはグループの数というか、繰り返し観測の回数です。教科書の例題では1枚の葉から4回の反復観測が行われたということですから、LEAFに対する反復回数は4です。そして、ベクトルの最後に必ず1を入れておいてください。

> vc <- c(0.020715, 0.010758)
> gn <- c(4, 1)
> KHH(vc, gn)
[1] 8.702175       NA

 これで"正しい"F値が求められました(今回はたまたまglm()での解析結果と一致しましたがね)。これよりp値を求めるためには次のようにします。

> 1 - pf(8.702175, df1=3, df2=12)
[1] 0.002442767

 以上で"正しい"p値を求めることができました。



BOX12.3の解析例

> mydata2
   CACONC2 LEAF2 PLANT2
1   1.6647     1      1
2   2.0276     1      1
3   2.2036     2      1
4   2.2238     2      1
5   1.9945     3      1
6   1.9045     3      1
7   1.9579     4      2
8   1.7441     4      2
9   2.4959     5      2
10  2.5570     5      2
11  1.8732     6      2
12  1.9046     6      2
13  2.2992     7      3
14  2.6597     7      3
15  2.7374     8      3
16  2.9178     8      3
17  2.8447     9      3
18  2.4489     9      3
19  2.6918    10      4
20  2.7402    10      4
21  3.3845    11      4
22  2.8510    11      4
23  2.2435    12      4
24  2.7079    12      4

> attach(mydata2)

#glmによる解析
> result2 <- glm(CACONC2 ~ PLANT2 + LEAF2)
> summary(aov(result2))
            Df  Sum Sq Mean Sq F value    Pr(>F)    
PLANT2       3 2.71433 0.90478 21.4480 4.114e-05 ***
LEAF2        8 1.26200 0.15775  3.7395   0.02001 *  
Residuals   12 0.50621 0.04218                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

#lmerによる解析
> model2 <- lmer(CACONC2 ~ (1|PLANT2) + (1|LEAF2), 
+ family = gaussian, data = mydata2)
> summary(model2)
Linear mixed-effects model fit by REML 
Formula: CACONC2 ~ (1 | PLANT2) + (1 | LEAF2) 
   Data: mydata2 
   AIC   BIC logLik MLdeviance REMLdeviance
 21.39 24.92 -7.693      13.92        15.39
Random effects:
 Groups   Name        Variance Std.Dev.
 LEAF2    (Intercept) 0.057827 0.24047 
 PLANT2   (Intercept) 0.124305 0.35257 
 Residual             0.042182 0.20538 
number of obs: 24, groups: LEAF2, 12; PLANT2, 4

Fixed effects:
            Estimate Std. Error t value
(Intercept)    2.378      0.194   12.26

> detach(mydata2)

 ちなみに、次のように指定しても同じ結果が得られる。こちらの方がより教科書に忠実な形で表示される。

> mod <- lmer(CACONC2 ~ (1|PLANT2/LEAF2), 
+ family = gaussian, data = mydata2)
> summary(mod)
Linear mixed-effects model fit by REML 
Formula: CACONC2 ~ (1 | PLANT2/LEAF2) 
   Data: mydata2 
   AIC   BIC logLik MLdeviance REMLdeviance
 21.39 24.92 -7.693      13.92        15.39
Random effects:
 Groups       Name        Variance Std.Dev.
 LEAF2:PLANT2 (Intercept) 0.057827 0.24047 
 PLANT2       (Intercept) 0.124305 0.35257 
 Residual                 0.042182 0.20538 
number of obs: 24, groups: LEAF2:PLANT2, 12; PLANT2, 4

Fixed effects:
            Estimate Std. Error t value
(Intercept)    2.378      0.194   12.26

 これより"正しい"F値とp値を算出します。引数に指定するベクトルvc2とgn2は以下のように必ず階層順に値を入れてください。

> vc2 <- c(0.124305, 0.057827, 0.042182)
> gn2 <- c(6, 2, 1)
> KHH(vc2, gn2)
[1] 5.725348 3.741786       NA
> 1 - pf(5.725348, df1=3, df2=8) #PLANT2に対するp値
[1] 0.02165530
> 1 - pf(3.741786, df1=8, df2=12) #LEAF2(PLANT2)に対するp値
[1] 0.01996275

 以上の結果より、glm()によって得られたp値とlmer()を用いて算出したp値を比較してみましょう。今回は結果としてはどちらの場合においても有意差が認められますが、glm()を用いた場合(すなわち独立性を仮定した場合)は随分とp値が小さいようです。つまり、「実際には有意ではないのに有意であると結論づけてしまうことがあるかもしれない」ということです。

glm() lmer()
PLANT2 0.00004114 0.02165530
LEAF2(PLANT2) 0.02001 0.01996275



BOX12.4の解析例

> glm.res <- glm(WGAIN ~ SIRE + DAM)
> lmer.res <- lmer(WGAIN ~ SIRE + (1|DAM))
> summary(aov(glm.res))
            Df  Sum Sq Mean Sq F value  Pr(>F)  
SIRE         4 1.03439 0.25860  3.1285 0.06533 .
DAM          5 1.28898 0.25780  3.1188 0.05930 .
Residuals   10 0.82658 0.08266                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

> summary(lmer.res)
Linear mixed-effects model fit by REML 
Formula: WGAIN ~ SIRE + (1 | DAM) 
   AIC   BIC logLik MLdeviance REMLdeviance
 29.79 35.77 -8.896      12.50        17.79
Random effects:
 Groups   Name        Variance Std.Dev.
 DAM      (Intercept) 0.087170 0.29525 
 Residual             0.082769 0.28770 
number of obs: 20, groups: DAM, 10

Fixed effects:
            Estimate Std. Error t value
(Intercept)   1.2905     0.2535   5.090
SIRE2        -0.3465     0.3585  -0.966
SIRE3         0.2055     0.3585   0.573
SIRE4        -0.4130     0.3585  -1.152
SIRE5        -0.0830     0.3585  -0.231

Correlation of Fixed Effects:
      (Intr) SIRE2  SIRE3  SIRE4 
SIRE2 -0.707                     
SIRE3 -0.707  0.500              
SIRE4 -0.707  0.500  0.500       
SIRE5 -0.707  0.500  0.500  0.500

> vc3 <- c(0.087170, 0.082769)
> gn3 <- c(2, 1)
> KHH(vc3, gn3)
[1] 3.106344       NA
> 1 - pf(3.106344, df1=5, df2=10) #DAMに対するp値
[1] 0.05992412



 BOX12.6以降の解析はよく分からない(というかよく読んでいない)。ここで扱っている内容は「一般化線形混合モデル」の範疇に含まれる内容なので、より詳しい解説は以下の参考文献にゆずる。他にも「Multilevel Modeling」などのキーワードでgoogleしてみるとよい。