Como uma ANOVA é calculada para um projeto de medidas repetidas: aov () vs lm () em R

13

O título diz tudo, e estou confuso. A seguir, executamos medidas repetidas aov () em R e executamos o que eu pensava ser uma chamada lm () equivalente, mas elas retornam diferentes resíduos de erro (embora as somas de quadrados sejam as mesmas).

Claramente, os resíduos e valores ajustados de aov () são os usados ​​no modelo, porque suas somas de quadrados somam cada uma das somas de quadrados modelo / residuais relatadas em resumo (my.aov). Então, quais são os modelos lineares reais aplicados a um design de medidas repetidas?

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
fonte
1
Eu não tenho certeza se é isso que você quer dizer, mas você vai encontrar todas as SS quando também se encaixam a interação com participant, como emanova(lm(value ~ factor1*factor2*participant, DFlong))
caracal
1
Ah, isso é útil, ok, então, a partir do modelo lm (valor ~ fator1 * fator2 * participante, DFlong), como as somas de quadrados são realmente calculadas? ou seja, o que anova () está fazendo?
trev

Respostas:

13

Uma maneira de pensar sobre ele é para tratar a situação como uma 3-fatorial entre sujeitos ANOVA com IVs participant, factor1, factor2, e um tamanho de célula de 1. anova(lm(value ~ factor1*factor2*participant, DFlong))calcula todo o SS para todos os efeitos neste 3-way ANOVA (3 efeitos principais, 3 interações de primeira ordem, 1 interação de segunda ordem). Como há apenas 1 pessoa em cada célula, o modelo completo não possui erros e a chamada acima anova()não pode computar testes-F. Mas o SS é o mesmo que o fatorial 2 dentro do design.

Como anova()realmente calcula o SS para um efeito? Através de comparações sequenciais de modelos (tipo I): ele se encaixa em um modelo restrito sem o efeito em questão e em um modelo irrestrito que inclui esse efeito. O SS associado a esse efeito é a diferença no erro SS entre os dois modelos.

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

Agora vamos verificar o efeito SS associado à interação id:IV1subtraindo o erro SS do modelo irrestrito do erro SS do modelo restrito.

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

Agora que você tem todo o efeito "bruto" do SS, é possível criar os testes dentro dos sujeitos simplesmente escolhendo o termo de erro correto para testar um efeito do SS. Por exemplo, teste o efeito SS factor1contra o efeito de interação SS de participant:factor1.

Para uma excelente introdução à abordagem de comparação de modelos, recomendo Maxwell e Delaney (2004). Projetando experimentos e analisando dados.

caracal
fonte
Ótima resposta, isso realmente me ajudou a finalmente entender o que uma ANOVA está fazendo! Obrigado também pela referência do livro!
trev