lme4 :: lmer เทียบเท่ากับ ANOVA ที่ทำซ้ำสามทางคืออะไร?


11

คำถามของฉันอยู่บนพื้นฐานของการตอบสนองซึ่งแสดงให้เห็นว่าlme4::lmerรูปแบบใดที่สอดคล้องกับการวัดความแปรปรวนสองทางแบบ ANOVA:

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:

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

โปรดทราบว่ามีการถามคำถามที่คล้ายกันมากก่อนหน้านี้ อย่างไรก็ตามมันไม่มีข้อมูลตัวอย่าง (ซึ่งมีให้ที่นี่)


คุณแน่ใจหรือว่าคุณไม่ต้องการรูปแบบสองระดับของคุณจะy ~ a*b + (1 + a*b|subject), d[d$c == "1",]? หรือบางทีฉันหายไปบางอย่าง
Rasmus Bååth

@ RasmusBååthไปข้างหน้าและพยายามทำให้พอดีlmerจะบ่นเพราะเอฟเฟกต์แบบสุ่มจะไม่ถูกระบุอีกต่อไป ตอนแรกฉันก็คิดว่านี่เป็นรุ่นที่ฉันต้องการ แต่ไม่ใช่ ถ้าคุณเปรียบเทียบรุ่น lmer ที่ผมเสนอสำหรับกรณีที่ 2 ทางกับมาตรฐาน ANOVA คุณจะเห็นว่า F-ค่าตรงตรง ตามที่กล่าวไว้ในการตอบสนองฉันเชื่อมโยง
Henrik

3
สำหรับปัญหาสามทางlmerโมเดลแรกที่คุณเขียน (ซึ่งไม่รวมการโต้ตอบสองทางแบบสุ่ม) ไม่ได้คาดว่าจะเทียบเท่ากับ RM-ANOVA แบบ 3 ทาง แต่เป็นรุ่นที่สองที่คุณเขียน (ซึ่งรวมถึงการสุ่ม การโต้ตอบสองทาง) ควรเป็น สำหรับสาเหตุที่มีความคลาดเคลื่อนแม้กับโมเดลนั้นฉันมีลางสังหรณ์ว่าปัญหาคืออะไรไปจับอาหารเย็นแล้วจะดูชุดข้อมูลของเล่นเพิ่มเติม
Jake Westfall

คำตอบ:


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()เอาต์พุตฉันคิดว่ามีสองเหตุผล

  1. ชุดข้อมูลจำลองที่เรียบง่ายของคุณคือพยาธิวิทยาในแบบจำลองที่เหมาะสมที่สุดคือชุดข้อมูลที่แสดงถึงส่วนประกอบความแปรปรวนเชิงลบซึ่งโมเดลแบบผสมเหมาะสมกับlmer()(และโปรแกรมรูปแบบผสมอื่น ๆ ส่วนใหญ่) จะไม่อนุญาต
  2. แม้ว่าจะมีชุดข้อมูลที่ไม่ใช่ทางพยาธิวิทยา แต่วิธีการที่คุณมีแบบจำลองการตั้งค่าดังกล่าวข้างต้นดูเหมือนจะไม่ได้ทำงานได้ดีในทางปฏิบัติแม้ว่าฉันจะต้องยอมรับว่าฉันไม่เข้าใจว่าทำไม มันเป็นเรื่องธรรมดาในความคิดของฉัน แต่ก็เป็นอีกเรื่องหนึ่ง

ให้ฉันแสดงให้เห็นถึงการตั้งค่าพารามิเตอร์ที่ฉันต้องการในตัวอย่าง ANOVA สองทางเริ่มต้นของคุณ สมมติว่า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()ผลลัพธ์ รูปแบบที่ฉันชอบนั้นเกี่ยวข้องกับการเปลี่ยนแปลงสองอย่าง: การเปรียบเทียบความต่างกันของปัจจัยด้วยตนเองเพื่อให้เราไม่ได้ทำงานกับวัตถุปัจจัย 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)

ทั้งสองวิธีมีความเท่าเทียมกันโดยสิ้นเชิงในปัญหาแบบสองทาง ตอนนี้เราจะย้ายไปที่ปัญหา 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

นี่คือสองรุ่นของเรา:

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)

อย่างที่เราเห็นวิธีการที่สองเท่านั้นที่ตรงกับผลลัพธ์จากaov()แม้ว่าวิธีแรกอย่างน้อยใน ballpark วิธีที่สองยังให้โอกาสในการบันทึกสูงขึ้น ฉันไม่แน่ใจว่าทำไมทั้งสองวิธีให้ผลลัพธ์ที่แตกต่างกันอีกครั้งฉันคิดว่าพวกเขาเป็น "ในหลักการ" เทียบเท่า แต่อาจเป็นเพราะเหตุผลเชิงตัวเลข / การคำนวณ หรือบางทีฉันเข้าใจผิดและพวกเขาจะไม่เทียบเท่าแม้ในหลักการ

ตอนนี้ฉันจะแสดงอีกวิธีหนึ่งในการประเมินส่วนประกอบความแปรปรวนตามแนวคิด ANOVA แบบดั้งเดิม โดยทั่วไปเราจะใช้สมการกำลังสองเฉลี่ยสำหรับการออกแบบของคุณแทนที่ค่าที่สังเกตได้ของกำลังสองเฉลี่ยและแก้ปัญหาสำหรับส่วนประกอบผลต่าง จะได้รับการคาดหวังสี่เหลี่ยมหมายถึงเราจะใช้ฟังก์ชั่น R ที่ผมเขียนไม่กี่ปีที่ผ่านมาเรียกว่าEMS()ซึ่งเป็นเอกสารที่นี่ ด้านล่างฉันคิดว่าฟังก์ชั่นโหลดแล้ว

# 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

นี่คือสองรุ่นของเรา:

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)

ในกรณีนี้ทั้งสองรุ่นให้ผลลัพธ์ที่เหมือนกันแม้ว่าวิธีที่สองจะมีความเป็นไปได้สูงกว่าเล็กน้อย aov()วิธีการทั้งการแข่งขัน แต่ลองดูสิ่งที่เราได้รับเมื่อเราแก้ไขส่วนประกอบความแปรปรวนตามที่เราทำข้างต้นโดยใช้ขั้นตอน ANOVA ที่ไม่ จำกัด ส่วนประกอบความแปรปรวนให้เป็นแบบไม่เชิงลบ (แต่สามารถใช้ได้ในการออกแบบที่สมดุลเท่านั้น ข้อมูลที่ขาดหายไปสมมติฐาน 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()(และโปรแกรมแบบผสมอื่น ๆ ส่วนใหญ่) จำกัด การประมาณการของส่วนประกอบความแปรปรวนที่จะไม่เป็นลบ โดยทั่วไปถือว่าเป็นข้อ จำกัด ที่สมเหตุสมผลเนื่องจากความแปรปรวนสามารถไม่เคยเป็นเชิงลบอย่างแท้จริง อย่างไรก็ตามผลที่ตามมาของข้อ จำกัด นี้คือโมเดลที่ผสมกันไม่สามารถแสดงชุดข้อมูลที่มีความสัมพันธ์เชิงลบในระดับ intraclass นั่นคือชุดข้อมูลที่การสังเกตจากคลัสเตอร์เดียวกันนั้นน้อยกว่า(มากกว่ามากกว่า) คล้ายกันโดยเฉลี่ยมากกว่าการสังเกตที่สุ่มมาจากชุดข้อมูลและดังนั้นเมื่อความแปรปรวนภายในคลัสเตอร์เกินกว่าความแปรปรวนระหว่างคลัสเตอร์อย่างมาก ชุดข้อมูลดังกล่าวเป็นชุดข้อมูลที่เหมาะสมอย่างสมบูรณ์แบบซึ่งบางครั้งจะเจอในโลกแห่งความเป็นจริง (หรือจำลองโดยไม่ตั้งใจ!) แต่พวกเขาไม่สามารถอธิบายอย่างสมเหตุสมผลได้ด้วยรูปแบบองค์ประกอบความแปรปรวนเนื่องจากพวกเขาบอกถึงองค์ประกอบความแปรปรวนเชิงลบ อย่างไรก็ตามซอฟต์แวร์ดังกล่าวสามารถอธิบายได้ว่า "ไม่สมเหตุสมผล" หากซอฟต์แวร์อนุญาต aov()อนุญาตให้มัน lmer()ไม่.


+1 Re 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- คุณอาจจะเข้าใจในเรื่องนี้ดีกว่าวันนี้ (สองปีต่อมา)? ฉันพยายามที่จะคิดออกว่าเป็นความแตกต่าง แต่ไม่ได้รับมันทั้ง ...
อะมีบา

@amoeba ความคิดปัจจุบันของฉันยังค่อนข้างเหมือนเดิม: AFAIK ทั้งสองรุ่นมีความเท่าเทียมกันทางสถิติ (ในแง่ที่ว่าพวกเขาทำการทำนายแบบเดียวกันเกี่ยวกับข้อมูลและบ่งบอกถึงข้อผิดพลาดมาตรฐานเดียวกัน) ถึงแม้ว่าเอฟเฟกต์แบบสุ่มจะมีพารามิเตอร์ ต่างกัน ฉันคิดว่าความแตกต่างที่สังเกตเห็น - ซึ่งดูเหมือนว่าจะเกิดขึ้นบางครั้งเท่านั้น - เป็นเพราะปัญหาการคำนวณ โดยเฉพาะอย่างยิ่งฉันสงสัยว่าคุณสามารถคลุกคลีกับการตั้งค่าเครื่องมือเพิ่มประสิทธิภาพ (เช่นจุดเริ่มต้นที่แตกต่างกันหรือใช้เกณฑ์การบรรจบกันอย่างเข้มงวดมากขึ้น) จนกระทั่งทั้งสองรุ่นกลับคำตอบเดียวกันทั้งหมด
Jake Westfall

ขอบคุณสำหรับการตอบกลับของคุณ. ฉันค่อนข้างไม่มั่นใจ: ฉันพยายามเล่นซอกับการตั้งค่าเครื่องมือเพิ่มประสิทธิภาพและไม่สามารถเปลี่ยนแปลงอะไรในผลลัพธ์; ความประทับใจของฉันคือทั้งสองรุ่นมาบรรจบกัน ฉันอาจถามคำถามนี้เป็นคำถามแยกต่างหากในบางครั้ง
อะมีบา

Ak(1|A:sub)(0+A|sub)k1k(k1)/2k=2ทั้งสองวิธีประมาณหนึ่งพารามิเตอร์และฉันก็ยังไม่แน่ใจว่าทำไมพวกเขาไม่เห็นด้วย
อะมีบา

การเดินทางกลับไปที่ปัญหานี้ ... ผมสังเกตเห็นว่าสำหรับกรณีที่สองปัจจัยที่สองlmerสายการผลิตที่เหมือนกันanova()ออกสุ่มแปรปรวนผลเป็นยังคงแตกต่างกันค่อนข้างดูและVarCorr(mod1) VarCorr(mod2)ฉันไม่เข้าใจว่าทำไมสิ่งนี้เกิดขึ้น; ใช่ไหม สำหรับmod3และmod4, เราสามารถเห็นได้ว่าสี่ในเจ็ดผลต่างmod3นั้นมีค่าเท่ากับศูนย์ (สำหรับmod4ทั้งเจ็ดนั้นไม่ใช่ศูนย์); "ภาวะเอกฐาน" mod3นี้อาจเป็นสาเหตุที่ทำให้ตาราง anova แตกต่างกัน นอกเหนือจากที่วิธีการที่คุณจะใช้ "วิธีที่ต้องการ" ของคุณถ้าaและbมีมากกว่าสองระดับ?
อะมีบา

1

กำลังa, b, cคงที่หรือผลกระทบสุ่ม? หากพวกเขาได้รับการแก้ไขไวยากรณ์ของคุณก็จะเป็น

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 ดูเช่นที่นี่ ดูชั้นข้อผิดพลาดในกรณีของคุณและของฉัน
Henrik

1
ที่จริงแล้วพวกเขาทำมันไม่ถูกต้อง หากคุณมีการออกแบบการวัดซ้ำแบบข้ามปัจจัยอย่างเต็มรูปแบบ (หรือการออกแบบบล็อกแฟคทอเรียลแบบสุ่ม) คุณควรได้รับข้อผิดพลาดเพียง 1 คำนอกเหนือจากsubjectสำหรับเอฟเฟกต์ทั้งหมด (เช่นWithin) ดูการออกแบบการทดลอง: ขั้นตอนสำหรับพฤติกรรมศาสตร์ (2013) โดย Kirk, บทที่ 10 (หน้า 458) หรือโพสต์ของฉันที่นี่
Masato Nakazawa

ลองเลี่ยงคำถามนี้สักครู่แล้วคิดว่าโมเดลที่ฉันติดตั้งไว้จะเป็นโมเดลที่ถูกต้อง คุณจะใช้สิ่งนี้lmerอย่างไร ฉันจะยังคงได้รับสำเนาของ Kirk (รุ่นที่ 2 เท่านั้น) และดูสิ่งที่กล่าว
Henrik

ฉันอยากรู้ว่าคุณคิดอย่างไรกับบทของเคิร์ก ฉันคิดว่าหมายเลขบทในฉบับที่ 2 แตกต่างกัน ในขณะเดียวกันฉันจะพยายามปรับให้เข้ากับlmerโมเดลที่แตกต่างกัน วิธีที่ดีที่สุดในการตรวจสอบแบบจำลองคือการตรวจสอบ dfs ที่ใช้lmerTestเนื่องจากการประมาณ KR ควรให้exactdfs และ p-values
Masato Nakazawa

1
ฉันมี Kirk รุ่นที่ 2 ซึ่งฉันเชื่อว่าการสนทนาที่เกี่ยวข้องอยู่ในหน้า 443-449 ซึ่งกล่าวถึงตัวอย่างสองทาง (ไม่ใช่สามทาง) คาดว่าหมายถึงกำลังสองซึ่งสมมติว่าการเพิ่มความไวของ A และ B หรือไม่นั้นจะได้รับใน p 447. สมมติว่า A และ B ได้รับการแก้ไขแล้วและหัวเรื่อง / บล็อกเป็นแบบสุ่มเราสามารถดูได้จากค่าเฉลี่ยของสี่เหลี่ยมจัตุรัสที่ระบุโดย Kirk ภายใต้ "รูปแบบที่ไม่ใช่สารเติมแต่ง" ซึ่งการทดสอบของ A, B และ AB แต่ละข้อเกี่ยวข้องกับข้อผิดพลาดต่างๆ การโต้ตอบที่เกี่ยวข้องกับบล็อก / เรื่อง หลักการเดียวกันนี้รวมไปถึงตัวอย่างสามทางในปัจจุบัน
Jake Westfall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.