Jak obliczana jest ANOVA dla projektu z powtarzanymi pomiarami: aov () vs lm () w R

14

Tytuł mówi wszystko i jestem zdezorientowany. Poniżej uruchamiane są powtarzane miary aov () w R i uruchamiane jest to, co myślałem, że było równoważne wywołanie lm (), ale zwracają różne wartości resztkowe błędów (chociaż sumy kwadratów są takie same).

Najwyraźniej wartości resztowe i dopasowane z aov () są tymi stosowanymi w modelu, ponieważ ich sumy kwadratów sumują się do każdego modelu / sumy resztkowej kwadratów zgłoszonych w podsumowaniu (my.aov). Jakie są rzeczywiste modele liniowe zastosowane do projektu z powtarzanymi pomiarami?

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
trev
źródło
1
Nie jestem pewien, czy to jest to, co masz na myśli, ale znajdziesz wszystko SS podczas pasują także do interakcji z participant, jak wanova(lm(value ~ factor1*factor2*participant, DFlong))
Caracal
1
Ach, to jest pomocne, ok, więc z modelu lm (wartość ~ czynnik1 * czynnik2 * uczestnik, DFlong), w jaki sposób obliczane są sumy kwadratów? tj. co robi anova ()?
trev

Odpowiedzi:

14

Jednym ze sposobów myślenia o tym jest traktowanie sytuacji jako 3-czynnikowej między ANOVA badanych z IV participant, factor1i factor2, a wielkość komórki 1. anova(lm(value ~ factor1*factor2*participant, DFlong))oblicza wszystkie SS dla wszystkich efektów w tej 3-drogowej ANOVA (3 główne efekty, 3 interakcje pierwszego rzędu, 1 interakcja drugiego rzędu). Ponieważ w każdej komórce jest tylko jedna osoba, pełny model nie zawiera błędów i powyższe wezwanie doanova() nie może obliczyć testów F. Ale SS są takie same jak w 2-czynnikowym projekcie.

Jak anova()faktycznie oblicza SS dla efektu? Poprzez sekwencyjne porównania modeli (typ I): Pasuje do modelu ograniczonego bez danego efektu i nieograniczonego modelu, który obejmuje ten efekt. SS związane z tym efektem jest różnicą błędu SS między obydwoma modelami.

# 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))

Teraz sprawdźmy efekt SS związany z interakcją id:IV1, odejmując błąd SS modelu nieograniczonego od błędu SS modelu ograniczonego.

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

Teraz, gdy masz już wszystkie „surowe” efekty SS, możesz zbudować testy wewnątrz badanych, po prostu wybierając odpowiedni termin błędu, na którym chcesz przetestować efekt SS. Np. Przetestuj efekt SS pod kątem factor1efektu interakcji SS z participant:factor1.

Aby uzyskać doskonałe wprowadzenie do metody porównywania modeli, polecam Maxwell i Delaney (2004). Projektowanie eksperymentów i analiza danych.

karakal
źródło
Świetna odpowiedź, to naprawdę pomogło mi w końcu zrozumieć, co robi ANOVA! Dziękuję również za odniesienie do książki!
trev