Comment une ANOVA est-elle calculée pour un plan de mesures répétées: aov () vs lm () dans R

13

Le titre dit tout, et je suis confus. Ce qui suit exécute une mesure répétée aov () dans R, et exécute ce que je pensais être un appel lm () équivalent, mais ils renvoient des résidus d'erreur différents (bien que les sommes des carrés soient les mêmes).

Il est clair que les valeurs résiduelles et ajustées de aov () sont celles utilisées dans le modèle, car leurs sommes de carrés s'ajoutent à chacune des sommes de carrés / modèle rapportées en résumé (my.aov). Quels sont donc les modèles linéaires réels qui sont appliqués à un plan de mesures répétées?

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
la source
1
Je ne sais pas si c'est ce que vous voulez dire, mais vous trouverez tous les SS lorsque vous adapterez également l'interaction avec participant, comme dansanova(lm(value ~ factor1*factor2*participant, DFlong))
caracal
1
Ah c'est utile, ok, donc à partir du modèle lm (valeur ~ facteur1 * facteur2 * participant, DFlong), comment les sommes des carrés sont-elles réellement calculées? c'est-à-dire que fait anova ()?
trev

Réponses:

13

Une façon de penser est de traiter la situation comme un 3-factoriel entre les sujets ANOVA avec IVs participant, factor1, factor2et une taille de cellule de 1. anova(lm(value ~ factor1*factor2*participant, DFlong))calcule tous les SS pour tous les effets de cette 3 ANOVA (3 effets principaux, 3 interactions de premier ordre, 1 interaction de second ordre). Puisqu'il n'y a qu'une seule personne dans chaque cellule, le modèle complet n'a pas d'erreurs et l'appel ci-dessus à anova()ne peut pas calculer les tests F. Mais les SS sont les mêmes que dans la conception à 2 facteurs.

Comment anova()calcule- t-on réellement le SS pour un effet? Par le biais de comparaisons de modèles séquentiels (type I): il s'adapte à un modèle restreint sans l'effet en question, et à un modèle non restreint qui inclut cet effet. Le SS associé à cet effet est la différence d'erreur SS entre les deux modèles.

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

Vérifions maintenant l'effet SS associé à l'interaction id:IV1en soustrayant l'erreur SS du modèle non restreint de l'erreur SS du modèle restreint.

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

Maintenant que vous disposez de tous les SS d'effet "bruts", vous pouvez créer les tests intra-sujets simplement en choisissant le terme d'erreur correct pour tester un SS d'effet. Par exemple, tester l'effet SS par factor1rapport à l'effet d'interaction SS de participant:factor1.

Pour une excellente introduction à l'approche de comparaison de modèles, je recommande Maxwell & Delaney (2004). Conception d'expériences et analyse de données.

caracal
la source
Excellente réponse, cela m'a vraiment aidé à enfin comprendre ce que fait une ANOVA! Merci aussi pour la référence du livre!
trev