Cách tính ANOVA cho thiết kế số đo lặp lại: aov () so với lm () trong R


13

Tiêu đề nói lên tất cả, và tôi bối rối. Sau đây chạy một số đo lặp lại aov () trong R và chạy những gì tôi nghĩ là một cuộc gọi lm () tương đương, nhưng chúng trả về các phần dư lỗi khác nhau (mặc dù các tổng bình phương là như nhau).

Rõ ràng phần dư và giá trị được trang bị từ aov () là giá trị được sử dụng trong mô hình, bởi vì tổng bình phương của chúng cộng với mỗi mô hình / tổng bình phương còn lại được báo cáo tóm tắt (my.aov). Vì vậy, các mô hình tuyến tính thực tế được áp dụng cho một thiết kế biện pháp lặp đi lặp lại là gì?

set.seed(1)
# make data frame,
# 5 participants, with 2 experimental factors, each with 2 levels
# factor1 is A, B
# factor2 is 1, 2
DF <- data.frame(participant=factor(1:5), A.1=rnorm(5, 50, 20), A.2=rnorm(5, 100, 20), B.1=rnorm(5, 20, 20), B.2=rnorm(5, 50, 20))

# get our experimental conditions
conditions <- names(DF)[ names(DF) != "participant" ]

# reshape it for aov
DFlong <- reshape(DF, direction="long", varying=conditions, v.names="value", idvar="participant", times=conditions, timevar="group")

# make the conditions separate variables called factor1 and factor2
DFlong$factor1 <- factor( rep(c("A", "B"), each=10) )
DFlong$factor2 <- factor( rep(c(1, 2), each=5) )

# call aov
my.aov <- aov(value ~ factor1*factor2 + Error(participant / (factor1*factor2)), DFlong)

# similar for an lm() call
fit <- lm(value ~ factor1*factor2 + participant, DFlong)

# what's aov telling us?
summary(my.aov)

# check SS residuals
sum(residuals(fit)^2)       # == 5945.668

# check they add up to the residuals from summary(my.aov)
2406.1 + 1744.1 + 1795.46   # == 5945.66

# all good so far, but how are the residuals in the aov calculated?
my.aov$"participant:factor1"$residuals

#clearly these are the ones used in the ANOVA:
sum(my.aov$"participant:factor1"$residuals ^ 2)

# this corresponds to the factor1 residuals here:
summary(my.aov)


# but they are different to the residuals reported from lm()
residuals(fit)
my.aov$"participant"$residuals
my.aov$"participant:factor1"$residuals
my.aov$"participant:factor1:factor2"$residuals

1
Tôi không chắc đây có phải ý bạn không, nhưng bạn sẽ tìm thấy tất cả SS khi bạn cũng phù hợp với sự tương tác với participant, như tronganova(lm(value ~ factor1*factor2*participant, DFlong))
caracal

1
À, thật là hữu ích, vậy, từ người tham gia mô hình lm (value ~ Fact1 * Fact2 *, DFlong), tổng các hình vuông thực sự được tính như thế nào? tức là anova () đang làm gì?
trev

Câu trả lời:


13

Một cách để suy nghĩ về nó là để điều trị tình trạng này như một 3-thừa giữa các đối tượng ANOVA với IV participant, factor1, factor2, và kích thước tế bào của 1. anova(lm(value ~ factor1*factor2*participant, DFlong))tính toán tất cả các SS cho tất cả các hiệu ứng trong này 3-way ANOVA (3 tác dụng chính, 3 tương tác bậc nhất, tương tác bậc 1). Vì chỉ có 1 người trong mỗi ô, nên mô hình đầy đủ không có lỗi và lệnh gọi trên để anova()không thể tính toán các phép thử F. Nhưng SS giống như trong 2 yếu tố trong thiết kế.

Làm thế nào để anova()thực sự tính toán SS cho một hiệu ứng? Thông qua so sánh mô hình tuần tự (loại I): ​​Nó phù hợp với một mô hình bị hạn chế mà không có hiệu ứng trong câu hỏi và một mô hình không bị hạn chế bao gồm hiệu ứng đó. SS liên quan đến hiệu ứng này là sự khác biệt về lỗi SS giữa cả hai mô hình.

# get all SS from the 3-way between subjects ANOVA
anova(lm(value ~ factor1*factor2*participant, DFlong))

dfL <- DFlong   # just a shorter name for your data frame
names(dfL) <- c("id", "group", "DV", "IV1", "IV2")   # shorter variable names

# sequential model comparisons (type I SS), restricted model is first, then unrestricted
# main effects first
anova(lm(DV ~ 1,      dfL), lm(DV ~ id,         dfL))  # SS for factor id
anova(lm(DV ~ id,     dfL), lm(DV ~ id+IV1,     dfL))  # SS for factor IV1
anova(lm(DV ~ id+IV1, dfL), lm(DV ~ id+IV1+IV2, dfL))  # SS for factor IV2

# now first order interactions
anova(lm(DV ~ id+IV1+IV2, dfL), lm(DV ~ id+IV1+IV2+id:IV1,  dfL))  # SS for id:IV1
anova(lm(DV ~ id+IV1+IV2, dfL), lm(DV ~ id+IV1+IV2+id:IV2,  dfL))  # SS for id:IV2
anova(lm(DV ~ id+IV1+IV2, dfL), lm(DV ~ id+IV1+IV2+IV1:IV2, dfL))  # SS for IV1:IV2

# finally the second-order interaction id:IV1:IV2
anova(lm(DV ~ id+IV1+IV2+id:IV1+id:IV2+IV1:IV2,            dfL),
      lm(DV ~ id+IV1+IV2+id:IV1+id:IV2+IV1:IV2+id:IV1:IV2, dfL))

Bây giờ, hãy kiểm tra SS hiệu ứng được liên kết với tương tác id:IV1bằng cách trừ SS lỗi của mô hình không bị hạn chế khỏi SS lỗi của mô hình bị hạn chế.

sum(residuals(lm(DV ~ id+IV1+IV2,        dfL))^2) -
sum(residuals(lm(DV ~ id+IV1+IV2+id:IV1, dfL))^2)

Bây giờ bạn đã có tất cả SS hiệu ứng "thô", bạn có thể xây dựng các bài kiểm tra bên trong chủ đề chỉ bằng cách chọn thuật ngữ lỗi chính xác để kiểm tra SS hiệu ứng. Ví dụ: kiểm tra SS hiệu ứng để factor1chống lại SS hiệu ứng tương tác participant:factor1.

Để có phần giới thiệu tuyệt vời về phương pháp so sánh mô hình, tôi khuyên dùng Maxwell & Delaney (2004). Thiết kế thí nghiệm và phân tích dữ liệu.


Câu trả lời tuyệt vời, điều đó thực sự đã giúp tôi cuối cùng hiểu được ANOVA đang làm gì! Cảm ơn cũng đã tham khảo cuốn sách!
trev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.