lme4 :: lmerは3因子反復測定分散分析に相当しますか?


11

私の質問は、どのモデルが双方向反復測定分散分析に対応するかを示したこの応答に基づいていますlme4::lmer

require(lme4)
set.seed(1234)
d <- data.frame(
    y = rnorm(96),
    subject = factor(rep(1:12, 4)),
    a = factor(rep(1:2, each=24)),
    b = factor(rep(rep(1:2, each=12))),
    c = factor(rep(rep(1:2, each=48))))

# standard two-way repeated measures ANOVA:
summary(aov(y~a*b+Error(subject/(a*b)), d[d$c == "1",]))

# corresponding lmer call:
anova(lmer(y ~ a*b+(1|subject) + (1|a:subject) + (1|b:subject), d[d$c == "1",]))

私の質問は、これを三元配置分散分析の場合に拡張する方法です。

summary(aov(y~a*b*c+Error(subject/(a*b*c)), d))
## [...]
## Error: subject:a:b:c
##           Df Sum Sq Mean Sq F value Pr(>F)
## a:b:c      1  0.101  0.1014   0.115  0.741
## Residuals 11  9.705  0.8822 

自然な拡張とそのバージョンは、分散分析の結果と一致しません。

anova(lmer(y ~ a*b*c +(1|subject) + (1|a:subject) + (1|b:subject) + (1|c:subject), d))
## [...]
## a:b:c  1 0.1014  0.1014  0.1500

anova(lmer(y ~ a*b*c +(1|subject) + (1|a:subject) + (1|b:subject) + (1|c:subject) + 
               (1|a:b:subject) + (1|a:c:subject) + (1|b:c:subject), d))
## [...]
## a:b:c  1 0.1014  0.1014  0.1539

非常によく似た質問が求められていることに注意してくださいする前に。ただし、サンプルデータ(ここに記載されています)がありませんでした。


2レベルモデルにしたくないですy ~ a*b + (1 + a*b|subject), d[d$c == "1",]か?または、おそらく何か不足していますか?
RasmusBååth2014年

@RasmusBååthGo Aheadを試してみてlmer、ランダムな効果が識別されなくなったため、文句を言うでしょう。最初はこれも自分が欲しいモデルだと思っていましたが、そうではありません。2ウェイのケースで提案するlmerモデルを標準のANOVAと比較すると、F値が正確に一致していることがわかります。応答で述べたように私はリンクしました。
Henrik

3
3方向の問題の場合、最初に作成したlmerモデル(ランダムな双方向の相互作用を除外)は3方向のRM-ANOVAと同等ではないが、2番目に作成したモデル(ランダムな双方向の相互作用)である必要があります。なぜそのモデルでも不一致があるのか​​については、私は問題が何であるかについての予感があり、夕食をつかむためにおもちゃのデータセットをもう少し見ていきます。
Jake Westfall 2014年

回答:


18

あなたの質問への直接的な答えは、あなたが書いた最後のモデル、

anova(lmer(y ~ a*b*c +(1|subject) + (1|a:subject) + (1|b:subject) + (1|c:subject) + 
           (1|a:b:subject) + (1|a:c:subject) + (1|b:c:subject), d))

私は「原則として」正しいと信じていますが、実際の実行では常にうまく機能するとは思われない奇妙なパラメーター化です。

このモデルから得られる出力が出力と一致しaov()ない理由については、2つの理由があると思います。

  1. 単純にシミュレートされたデータセットは病理学的です。最適なモデルは負の分散成分を意味するものであり、混合モデルlmer()(および他のほとんどの混合モデルプログラム)はこれを許可しません。
  2. 病理学的でないデータセットを使用しても、上記のようにモデルを設定する方法は、実際には必ずしもうまく機能しているようには見えませんが、理由はよくわかりません。それはまた、私の意見では一般的に奇妙ですが、それは別の話です。

最初に、最初の2因子分散分析の例で私が好むパラメーター化を示します。データセットdがロードされていると仮定します。あなたのモデル(私がダミーからコントラストコードに変更したことに注意してください)は:

options(contrasts=c("contr.sum","contr.poly"))
mod1 <- lmer(y ~ a*b+(1|subject) + (1|a:subject) + (1|b:subject),
         data = d[d$c == "1",])
anova(mod1)
# Analysis of Variance Table
#     Df  Sum Sq Mean Sq F value
# a    1 2.20496 2.20496  3.9592
# b    1 0.13979 0.13979  0.2510
# a:b  1 1.23501 1.23501  2.2176

これは、aov()出力と一致するという点で、ここでうまくいきました。私が好むモデルには2つの変更が含まれます。R因子オブジェクトを操作しないように因子を手動でコントラストコーディングし(100%の場合に行うことをお勧めします)、ランダム効果を別の方法で指定します。

d <- within(d, {
  A <- 2*as.numeric(paste(a)) - 3
  B <- 2*as.numeric(paste(b)) - 3
  C <- 2*as.numeric(paste(c)) - 3
})
mod2 <- lmer(y ~ A*B + (1|subject)+(0+A|subject)+(0+B|subject),
             data = d[d$c == "1",])
anova(mod2)
# Analysis of Variance Table
# Df  Sum Sq Mean Sq F value
# A    1 2.20496 2.20496  3.9592
# B    1 0.13979 0.13979  0.2510
# A:B  1 1.23501 1.23501  2.2176

logLik(mod1)
# 'log Lik.' -63.53034 (df=8)
logLik(mod2)
# 'log Lik.' -63.53034 (df=8)

2つのアプローチは、単純な双方向の問題では完全に同等です。次に、3方向の問題に移ります。先ほど、あなたが提供したサンプルデータセットは病的であると述べました。したがって、サンプルデータセットを扱う前に、まず実際の分散コンポーネントモデルからデータセットを生成します(つまり、ゼロ以外の分散コンポーネントが真のモデルに組み込まれている場合)。最初に、私の推奨するパラメーター化が、提案したパラメーター化よりもうまく機能しているように見えることを示します。それから私はない分散成分を推定する別の方法を説明しますない彼らは非負でなければならないことを課しています。その後、元のサンプルデータセットの問題を確認できるようになります。

新しいデータセットは、50のサブジェクトを持つことを除いて、構造は同じです。

set.seed(9852903)
d2 <- expand.grid(A=c(-1,1), B=c(-1,1), C=c(-1,1), sub=seq(50))
d2 <- merge(d2, data.frame(sub=seq(50), int=rnorm(50), Ab=rnorm(50),
  Bb=rnorm(50), Cb=rnorm(50), ABb=rnorm(50), ACb=rnorm(50), BCb=rnorm(50)))
d2 <- within(d2, {
  y <- int + (1+Ab)*A + (1+Bb)*B + (1+Cb)*C + (1+ABb)*A*B +
    (1+ACb)*A*C + (1+BCb)*B*C + A*B*C + rnorm(50*2^3)
  a <- factor(A)
  b <- factor(B)
  c <- factor(C)
})

照合するF比は次のとおりです。

aovMod1 <- aov(y ~ a*b*c + Error(factor(sub)/(a*b*c)), data = d2)
tab <- lapply(summary(aovMod1), function(x) x[[1]][1,2:4])
do.call(rbind, tab)
#                          Sum Sq Mean Sq F value
# Error: factor(sub)       439.48    8.97        
# Error: factor(sub):a     429.64  429.64  32.975
# Error: factor(sub):b     329.48  329.48  27.653
# Error: factor(sub):c     165.44  165.44  17.924
# Error: factor(sub):a:b   491.33  491.33  49.694
# Error: factor(sub):a:c   305.46  305.46  41.703
# Error: factor(sub):b:c   466.09  466.09  40.655
# Error: factor(sub):a:b:c 392.76  392.76 448.101

これが2つのモデルです。

mod3 <- lmer(y ~ a*b*c + (1|sub)+(1|a:sub)+(1|b:sub)+(1|c:sub)+
  (1|a:b:sub)+(1|a:c:sub)+(1|b:c:sub), data = d2)
anova(mod3)
# Analysis of Variance Table
#       Df Sum Sq Mean Sq F value
# a      1  32.73   32.73  34.278
# b      1  21.68   21.68  22.704
# c      1  12.53   12.53  13.128
# a:b    1  60.93   60.93  63.814
# a:c    1  50.38   50.38  52.762
# b:c    1  57.30   57.30  60.009
# a:b:c  1 392.76  392.76 411.365

mod4 <- lmer(y ~ A*B*C + (1|sub)+(0+A|sub)+(0+B|sub)+(0+C|sub)+
  (0+A:B|sub)+(0+A:C|sub)+(0+B:C|sub), data = d2)
anova(mod4)
# Analysis of Variance Table
#       Df Sum Sq Mean Sq F value
# A      1  28.90   28.90  32.975
# B      1  24.24   24.24  27.653
# C      1  15.71   15.71  17.924
# A:B    1  43.56   43.56  49.694
# A:C    1  36.55   36.55  41.703
# B:C    1  35.63   35.63  40.655
# A:B:C  1 392.76  392.76 448.101

logLik(mod3)
# 'log Lik.' -984.4531 (df=16)
logLik(mod4)
# 'log Lik.' -973.4428 (df=16)

ご覧のとおり、2番目の方法のみがからの出力に一致しますaov()が、最初の方法は少なくともおおざっぱです。2番目の方法でも、対数尤度が高くなります。これらの2つの方法が異なる結果をもたらす理由はわかりません。繰り返しますが、これらは「原則として」同等であると思いますが、数値的または計算上の理由によるのかもしれません。あるいは、私は間違っているかもしれませんし、それらは原則的にも同等ではありません。

ここで、従来の分散分析の考え方に基づいて分散成分を推定する別の方法を示します。基本的に、私たちはあなたの設計に期待される平均二乗方程式を取り、平均二乗の観測値を代入し、分散成分を解きます。予想平均平方を得るために、我々はと呼ばれる、私が数年前に書いたRの機能を使用するEMS()文書化され、HERE。以下では、関数がすでにロードされていると想定しています。

# prepare coefficient matrix
r <- 1 # number of replicates
s <- 50 # number of subjects
a <- 2 # number of levels of A
b <- 2 # number of levels of B
c <- 2 # number of levels of C
CT <- EMS(r ~ a*b*c*s, random="s")
expr <- strsplit(CT[CT != ""], split="")
expr <- unlist(lapply(expr, paste, collapse="*"))
expr <- sapply(expr, function(x) eval(parse(text=x)))
CT[CT != ""] <- expr
CT[CT == ""] <- 0
mode(CT) <- "numeric"
# residual variance and A*B*C*S variance are confounded in
# this design, so remove the A*B*C*S variance component
CT <- CT[-15,-2]
CT
#        VarianceComponent
# Effect  e b:c:s a:c:s a:b:s a:b:c c:s b:s a:s b:c a:c a:b s   c   b   a
#   a     1     0     0     0     0   0   0   4   0   0   0 0   0   0 200
#   b     1     0     0     0     0   0   4   0   0   0   0 0   0 200   0
#   c     1     0     0     0     0   4   0   0   0   0   0 0 200   0   0
#   s     1     0     0     0     0   0   0   0   0   0   0 8   0   0   0
#   a:b   1     0     0     2     0   0   0   0   0   0 100 0   0   0   0
#   a:c   1     0     2     0     0   0   0   0   0 100   0 0   0   0   0
#   b:c   1     2     0     0     0   0   0   0 100   0   0 0   0   0   0
#   a:s   1     0     0     0     0   0   0   4   0   0   0 0   0   0   0
#   b:s   1     0     0     0     0   0   4   0   0   0   0 0   0   0   0
#   c:s   1     0     0     0     0   4   0   0   0   0   0 0   0   0   0
#   a:b:c 1     0     0     0    50   0   0   0   0   0   0 0   0   0   0
#   a:b:s 1     0     0     2     0   0   0   0   0   0   0 0   0   0   0
#   a:c:s 1     0     2     0     0   0   0   0   0   0   0 0   0   0   0
#   b:c:s 1     2     0     0     0   0   0   0   0   0   0 0   0   0   0
#   e     1     0     0     0     0   0   0   0   0   0   0 0   0   0   0

# get mean squares
(MSmod <- summary(aov(y ~ a*b*c*factor(sub), data=d2)))
#                   Df Sum Sq Mean Sq
# a                  1  429.6   429.6
# b                  1  329.5   329.5
# c                  1  165.4   165.4
# factor(sub)       49  439.5     9.0
# a:b                1  491.3   491.3
# a:c                1  305.5   305.5
# b:c                1  466.1   466.1
# a:factor(sub)     49  638.4    13.0
# b:factor(sub)     49  583.8    11.9
# c:factor(sub)     49  452.2     9.2
# a:b:c              1  392.8   392.8
# a:b:factor(sub)   49  484.5     9.9
# a:c:factor(sub)   49  358.9     7.3
# b:c:factor(sub)   49  561.8    11.5
# a:b:c:factor(sub) 49   42.9     0.9
MS <- MSmod[[1]][,"Mean Sq"]

# solve
ans <- solve(CT, MS)
cbind(rev(ans[c(grep("e",names(ans)),grep("s",names(ans)))])/
        c(1,2,2,2,4,4,4,1))
# s     1.0115549
# a:s   1.5191114
# b:s   1.3797937
# c:s   1.0441351
# a:b:s 1.1263331
# a:c:s 0.8060402
# b:c:s 1.3235126
# e     0.8765093
summary(mod4)
# Random effects:
#  Groups   Name        Variance Std.Dev.
#  sub      (Intercept) 1.0116   1.0058  
#  sub.1    A           1.5191   1.2325  
#  sub.2    B           1.3798   1.1746  
#  sub.3    C           1.0441   1.0218  
#  sub.4    A:B         1.1263   1.0613  
#  sub.5    A:C         0.8060   0.8978  
#  sub.6    B:C         1.3235   1.1504  
#  Residual             0.8765   0.9362  
# Number of obs: 400, groups:  sub, 50

では、元の例に戻りましょう。照合しようとしているF比は次のとおりです。

aovMod2 <- aov(y~a*b*c+Error(subject/(a*b*c)), data = d)
tab <- lapply(summary(aovMod2), function(x) x[[1]][1,2:4])
do.call(rbind, tab)
#                       Sum Sq Mean Sq F value
# Error: subject       13.4747  1.2250        
# Error: subject:a      1.4085  1.4085  1.2218
# Error: subject:b      3.1180  3.1180  5.5487
# Error: subject:c      6.3809  6.3809  5.2430
# Error: subject:a:b    1.5706  1.5706  2.6638
# Error: subject:a:c    1.0907  1.0907  1.5687
# Error: subject:b:c    1.4128  1.4128  2.3504
# Error: subject:a:b:c  0.1014  0.1014  0.1149

これが2つのモデルです。

mod5 <- lmer(y ~ a*b*c + (1|subject)+(1|a:subject)+(1|b:subject)+
  (1|c:subject)+(1|a:b:subject)+(1|a:c:subject)+(1|b:c:subject),
  data = d)
anova(mod5)
# Analysis of Variance Table
#       Df Sum Sq Mean Sq F value
# a      1 0.8830  0.8830  1.3405
# b      1 3.1180  3.1180  4.7334
# c      1 3.8062  3.8062  5.7781
# a:b    1 1.5706  1.5706  2.3844
# a:c    1 0.9620  0.9620  1.4604
# b:c    1 1.4128  1.4128  2.1447
# a:b:c  1 0.1014  0.1014  0.1539

mod6 <- lmer(y ~ A*B*C + (1|subject)+(0+A|subject)+(0+B|subject)+
  (0+C|subject)+(0+A:B|subject)+(0+A:C|subject)+
  (0+B:C|subject), data = d)
anova(mod6)
# Analysis of Variance Table
#       Df Sum Sq Mean Sq F value
# a      1 0.8830  0.8830  1.3405
# b      1 3.1180  3.1180  4.7334
# c      1 3.8062  3.8062  5.7781
# a:b    1 1.5706  1.5706  2.3844
# a:c    1 0.9620  0.9620  1.4604
# b:c    1 1.4128  1.4128  2.1447
# a:b:c  1 0.1014  0.1014  0.1539

logLik(mod5)
# 'log Lik.' -135.0351 (df=16)
logLik(mod6)
# 'log Lik.' -134.9191 (df=16)

この場合、2つのモデルのログの尤度はわずかに高くなりますが、2つのモデルは基本的に同じ結果になります。どちらの方法も一致しませんaov()。ただし、分散コンポーネントを負でないように制約しないANOVAプロシージャを使用して、分散コンポーネントを解決するときに得られる結果を見てみましょう(ただし、連続予測子がなくバランスの取れた設計でのみ使用できます。欠けているデータ;古典的な分散分析の仮定)。

# prepare coefficient matrix
r <- 1 # number of replicates
s <- 12 # number of subjects
a <- 2 # number of levels of A
b <- 2 # number of levels of B
c <- 2 # number of levels of C
CT <- EMS(r ~ a*b*c*s, random="s")
expr <- strsplit(CT[CT != ""], split="")
expr <- unlist(lapply(expr, paste, collapse="*"))
expr <- sapply(expr, function(x) eval(parse(text=x)))
CT[CT != ""] <- expr
CT[CT == ""] <- 0
mode(CT) <- "numeric"
# residual variance and A*B*C*S variance are confounded in
# this design, so remove the A*B*C*S variance component
CT <- CT[-15,-2]

# get mean squares
MSmod <- summary(aov(y ~ a*b*c*subject, data=d))
MS <- MSmod[[1]][,"Mean Sq"]

# solve
ans <- solve(CT, MS)
cbind(rev(ans[c(grep("e",names(ans)),grep("s",names(ans)))])/
        c(1,2,2,2,4,4,4,1))
# s      0.04284033
# a:s    0.03381648
# b:s   -0.04004005
# c:s    0.04184887
# a:b:s -0.03657940
# a:c:s -0.02337501
# b:c:s -0.03514457
# e      0.88224787
summary(mod6)
# Random effects:
#  Groups    Name        Variance  Std.Dev. 
#  subject   (Intercept) 7.078e-02 2.660e-01
#  subject.1 A           6.176e-02 2.485e-01
#  subject.2 B           0.000e+00 0.000e+00
#  subject.3 C           6.979e-02 2.642e-01
#  subject.4 A:B         1.549e-16 1.245e-08
#  subject.5 A:C         4.566e-03 6.757e-02
#  subject.6 B:C         0.000e+00 0.000e+00
#  Residual              6.587e-01 8.116e-01
# Number of obs: 96, groups:  subject, 12

これで、元の例について病理学的なものを確認できます。最も適合するモデルは、ランダムな分散成分のいくつかが負であることを意味するモデルです。しかしlmer()(および他のほとんどの混合モデルプログラム)、分散コンポーネントの推定値が負にならないように制約されます。もちろん、分散が真に負になることは決してないため、これは一般に賢明な制約と見なされます。ただし、この制約の結果、混合モデルは、負のクラス内相関を特徴とするデータセット、つまり同じクラスターからの観測が少ないデータセットを正確に表すことができません。(それ以上ではなく)データセットからランダムに描画された観測値と平均的に類似しており、その結果、クラスター内の分散がクラスター間の分散を大幅に上回ります。そのようなデータセットは、現実の世界で偶然目にする(または誤ってシミュレートする!)完全に妥当なデータセットですが、負の分散コンポーネントを意味するため、分散コンポーネントモデルではうまく説明できません。ただし、ソフトウェアで許可されている場合は、そのようなモデルで「無意味に」記述できます。aov()それを許可します。lmer()ではない。


+1。再I am not sure why these two methods give different results, as again I think they are "in principle" equivalent, but maybe it is for some numerical/computational reasons-あなたはおそらくこれを今(2年後)よりよく理解していますか?私は違いが何であるかを理解しようとしましたが、それも
わかり

@amoeba私の現在の考えはまだそれとほとんど同じです:ランダム効果がパラメーター化されていても、2つのモデルは統計的に同等です(データについて同じ予測を行い、同じ標準誤差を意味するという意味で)違う。観察された差異(時々のみ発生するように見える)は、単に計算上の問題が原因であると思います。特に、2つのモデルがまったく同じ答えを返すまで、オプティマイザーの設定(さまざまな開始点やより厳密な収束基準の使用など)をいじることができると思います。
ジェイクウェストフォール、2016年

お返事をありがとうございます。私はどちらかと言えば納得できません。オプティマイザの設定をいじってみましたが、結果を変更できませんでした。私の印象は、両方のモデルがうまく収束しているということです。これは別の質問になるかもしれません。
amoeba氏は、2016

Ak(1|A:sub)(0+A|sub)k1k(k1)/2k=2どちらの方法も1つのパラメーターを推定しますが、なぜそれらが一致しないのかはまだよくわかりません。
amoeba氏は、2016

この問題に背を取得...私は2つの2倍のケースのためにあることに気づいたlmerの呼び出しは同じ生産anova()参照:出力を、ランダム効果の分散はそれにもかかわらず、かなり異なっているVarCorr(mod1)VarCorr(mod2)。なぜこれが起こるのかよくわかりません。あなたは?との場合mod3mod47つの分散のうち4つmod3が実際にはゼロに等しいことがわかります(mod47つすべてがゼロではないため)。この「特異性」が、mod3おそらくanovaテーブルが異なる理由です。場合はそれとは別に、どのようにあなたの「好ましい方法」を使用するaと、b二つ以上のレベルを有していましたか?
アメーバはモニカを元に戻す

1

されているabc固定またはランダム効果?それらが修正されている場合、構文は単純になります

summary(aov(y~a*b*c+Error(subject), d))
Error: subject
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals 11  13.47   1.225               

Error: Within
          Df Sum Sq Mean Sq F value  Pr(>F)   
a          1   1.41   1.408   1.730 0.19235   
b          1   3.12   3.118   3.829 0.05399 . 
c          1   6.38   6.381   7.836 0.00647 **
a:b        1   1.57   1.571   1.929 0.16889   
a:c        1   1.09   1.091   1.339 0.25072   
b:c        1   1.41   1.413   1.735 0.19168   
a:b:c      1   0.10   0.101   0.124 0.72518   
Residuals 77  62.70   0.814  

library(lmerTest)
anova(lmer(y ~ a*b*c+(1|subject), data=d))
Analysis of Variance Table of type 3  with  Satterthwaite 
approximation for degrees of freedom
      Sum Sq Mean Sq NumDF  DenDF F.value   Pr(>F)   
a     1.4085  1.4085     1 76.991  1.7297 0.192349   
b     3.1180  3.1180     1 76.991  3.8291 0.053995 . 
c     6.3809  6.3809     1 76.991  7.8363 0.006469 **
a:b   1.5706  1.5706     1 76.991  1.9289 0.168888   
a:c   1.0907  1.0907     1 76.991  1.3394 0.250716   
b:c   1.4128  1.4128     1 76.991  1.7350 0.191680   
a:b:c 0.1014  0.1014     1 76.991  0.1245 0.725183  

それらは固定効果です。ただし、フィットするANOVAモデルは、古典的な反復測定ANOVAモデルのように見えるモデルではありません。たとえば、こちらを参照してください。あなたと私のケースでエラー層を参照してください。
Henrik

1
実際、彼らがそれを行う方法は正しくありません。完全に交差した階乗の反復測定計画(またはランダム化されたブロック階乗の計画)がある場合subject、すべての効果(つまりWithin)について、を除いて1つの誤差項のみを取得する必要があります。実験計画:手順の行動科学(2013)、カーク、第10章(p.458)または私の投稿はこちら
中沢正人

とりあえずこの質問を避けて、私が適合したモデルが正しいモデルであると仮定しましょう。これを使用してどのように適合しlmerますか?それでも私はカーク(第2版のみ)のコピーを入手し、その内容を確認します。
Henrik

私はあなたがカークの章についてどう思うか知りたいです。第2版​​の章番号だと思います。違います。その間、私は異なるlmerモデルに適合しようとします。モデルの適合をチェックする最良の方法はlmerTest、KR近似がexactdf、ひいてはp値を与えることが想定されているため、を使用してそれらのdfをチェックすることです。
中沢正人2014年

1
私はカークの第2版を持っています。関連する議論はpp。443-449にあり、双方向(3方向ではない)の例について説明しています。AとBの加法性を仮定するかどうかに関係なく、期待される平均二乗がpに与えられます。447. AとBが固定されており、サブジェクト/ブロックがランダムであると仮定すると、カークによって「非加法モデル」の下にリストされた予想平均二乗から、A、B、およびABのテストにはそれぞれ異なる誤差項が含まれることがわかります。ブロック/サブジェクトとの関連する相互作用。同じ原則が、現在の3方向の例にも当てはまります。
Jake Westfall、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.