> Statistiques > Tests statistiques > ANOVA
ANOVA
ANOVA standard
L'objectif est de savoir si une variable numérique a des valeurs significativement différentes selon plusieurs catégories (i.e., selon les valeurs d'un facteur). Plus précisémment, on teste l'hypothèse nulle : il y a au moins deux catégories pour lesquelles les moyennes de la variable sont différentes. C'est une généralisation du t-test dans le cas où il y a plus de deux catégories.
- l'ANOVA suppose que la variable numérique suit une loi normale dont la moyenne dépend éventuellement de la valeur des facteurs, mais dont la variance ne dépend pas des facteurs (hypothèse d'homoscedasticité).
- l'ANOVA n'est pas très sensible à un non normalité des variables.
- par contre, l'ANOVA est très sensible au non-respect de l'hypothèse d'homoscedasticité (variances non identiques).
- analyse de la variance à un facteur : un seul facteur pour les catégories ("one way ANOVA")
- analyse de la variance à deux facteurs : deux facteurs pour les catégories ("two way ANOVA")
- si une différence significative est notée, l'ANOVA ne dit pas quelles catégories sont concernées.
- l'ANOVA calcule le rapport F de la variabilité intergroupe (variabilité dû au facteur) et de la variabilité intergroupe (variabilité résiduel) chacun d'eux étant normalisé par le nombre de degrés de liberté (en fait, rapport des carrés moyens). F suit alors une loi de Fisher Snedecor (distribution F).
ANOVA à un facteur :
- fait l'hypothèse de variances identiques.
-
fr <- data.frame(var = c(10, 4, 5, 3, 3, 7, 2, 6, 2, 8, 5, 9, 5),
categ = factor(c("c", "a", "b", "a", "b", "b", "a", "b", "a", "c", "c", "c", "b")))
test <- aov(var ~ categ, fr)
summary(test)
donne une différence significative avec une p-value = 0.003 :
Df Sum Sq Mean Sq F value Pr(>F)
categ 2 55.22 27.610 10.81 0.00317 **
Residuals 10 25.55 2.555
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
- Df : degrés de liberté.
- Sum Sq : variance (dû au facteur categ et résiduelle respectivement).
- Mean Sq : carrés moyens (normalisés au nombre de degrés de liberté).
- F : valeur de la statististique (qui suit ici une loi F à 2 et 10 degrés de liberté).
- pour avoir la p-value, on pourrait aussi faire manuellement : pf(27.601 / 2.555, 2, 10, lower.tail = FALSE)
- la valeur retournée est de la classe aov et lm.
- si l'objet d'appelle test,
- test$residuals : les résidus.
- test$fitted.values : les valeurs fittées.
Pour faire une ANOVA, on peut aussi utiliser :
test <- anova(lm(var ~ categ, fr))
- ca donne exactement le même résultat, mais l'objet est de la classe anova et data.frame.
- la variable renvoyée (ici test) donne directement le data.frame de statistiques (test[1, 5] pour avoir la p-value).
Test de Bartlett : permet de tester l'hypothèse nulle de variances égales entre les groupes :
- test <- bartlett.test(var ~ categ, fr)
- le résultat renvoyé est de la classe htest. Accès à la p-value par test$p.value
ANOVA à un facteur sans supposer que les variances sont égales :
-
fr <- data.frame(var = c(10, 4, 5, 3, 3, 7, 2, 6, 2, 8, 5, 9, 5),
categ = factor(c("c", "a", "b", "a", "b", "b", "a", "b", "a", "c", "c", "c", "b")))
test <- oneway.test(var ~ categ, fr)
- on peut récupérer la p-value en faisant test$p.value (valeur renvoyée est de la classe htest)
- on peut supposer les variances égales en faisant : test <- oneway.test(var ~ categ, fr, var.equal = TRUE), on retrouve alors exactement les mêmes résultats qu'avec aov, mais on n'a pas le détail des variances, etc ...
Si l'hypothèse de normalité n'est pas vérifiée, on peut faire un test non paramétrique de Krukal-Wallis :
-
fr <- data.frame(var = c(10, 4, 5, 3, 3, 7, 2, 6, 2, 8, 5, 9, 5),
categ = factor(c("c", "a", "b", "a", "b", "b", "a", "b", "a", "c", "c", "c", "b")))
tes <- kruskal.test(var ~ categ, fr)
summary(fit)
- le résultat est de la classe htest (donc accès à la p-value par tes$p.value)
Une fois que l'ANOVA a montré une différence significative, on peut faire un test de Tukey Honestly Significant Difference pour savoir entre quels facteurs il y a une différence (à condition qu'il y ait à peu près le même nombre d'observations dans chaque catégorie) :
ANOVA à deux facteurs :
fr <- data.frame(var = c(10, 4, 5, 3, 3, 7, 2, 6, 2, 8, 5),
categ = factor(c("c", "a", "b", "a", "b", "b", "a", "b", "a", "c", "c")),
categ2 = factor(c("A", "B", "B", "B", "B", "A", "B", "A", "B", "A", "A")))
fit <- aov(var ~ categ * categ2, fr)
summary(fit)
donne :
Df Sum Sq Mean Sq F value Pr(>F)
categ 2 41.833 20.917 8.1721 0.01476 *
categ2 1 6.250 6.250 2.4419 0.16211
Residuals 7 17.917 2.560
On peut aussi faire :
anova(lm(var ~ categ * categ2, fr)).
ANOVA avec mesures répétées
C'est la généralisation du paired t-test à plus de 2 facteurs, avec souvent un design traitement x sujet et on veut juger si le traitement est efficace, mais ce sont les mêmes sujets qui sont toujours testés.
On veut voir si 3 traitements sont significativement différents quand testés contre les même individus (donc mesures non indépendantes)
- données : fr <- data.frame(val = c(1, 2, 5, 2, 6, 8, 7, 8, 15), trait = factor(rep(c("A", "B", "C"), each = 3)), pers = rep(c("Jean", "Pierre", "Paul"), times = 3))
- formule pour tester le modèle : mdl <- aov(val ~ trait + Error(pers/trait), fr) : donne ici une p-value de 0.0103 significative, alors qu'une ANOVA simple ne l'aurait pas été car beaucoup de variabilité entre individus.
On peut alors faire un pairwise t-test de type paired pour savoir quelles sont les paires de facteurs qui sont statistiquement significatives :
Test non paramétrique pour des mesures répétées :
- friedman.test(val ~ trait | pers, fr)
Comparaison entre une ANOVA avec mesures répétées et un paired t-test dans le cas où seulement 2 valeurs du facteur :
- fr <- data.frame(val = c(1, 5, 6, 9, 18, 24), trait = factor(rep(c("A", "B"), each = 3)), pers = rep(c("Jean", "Pierre", "Paul"), times = 2))
- summary(aov(val ~ trait + Error(pers/trait), fr)) : donne une p-value de 0.0459.
- t.test(fr$val[fr$trait == "A"], fr$val[fr$trait == "B"], paired = TRUE) : donne la même p-value de 0.0459.
Copyright Aymeric Duclert
programmer en R, tutoriel R, graphes en R