Pourquoi une ANOVA et pas une pile de tests t
Un test t compare deux moyennes. Avec trois groupes ou plus, la tentation est de tester chaque paire - et c'est exactement le piège. Chaque test réalisé au seuil de 0,05 porte un risque de 5 % de faux positif, et les risques s'accumulent : avec 4 groupes cela fait 6 tests par paires et environ 26 % de chances d'obtenir au moins un résultat « significatif » fallacieux ; avec 5 groupes (10 tests), environ 40 %. Tu fabriquerais des découvertes à partir de pur bruit.
L'ANOVA (ANalysis Of VAriance, analyse de la variance) corrige ça en posant une question avec une p-valeur : toutes les moyennes de groupes sont-elles identiques, ou au moins une diffère-t-elle ? Malgré son nom, elle compare des moyennes - elle le fait simplement en analysant la variance : si les moyennes de groupes sont plus dispersées que ne peut l'expliquer le bruit interne aux groupes, il se passe quelque chose de réel.
ANOVA à un facteur avec aov()
PlantGrowth est fait pour ça : des poids de plantes sous un témoin et deux conditions de traitement. Ajuste avec aov(), puis - important - affiche la table avec summary() :
Lis la formule comme « weight dépend-il de group ? ». La variable de groupement doit être un facteur - PlantGrowth$group en est déjà un, mais si tes groupes sont codés en nombres (doses, identifiants de lots), enveloppe-les : aov(y ~ factor(dose), ...). Sinon aov() ajuste silencieusement une droite de régression à travers les codes de groupes au lieu de comparer des moyennes de groupes - mauvais modèle, aucun message d'erreur.
Lire la table d'ANOVA
La table a deux lignes - le facteur et les résidus - et cinq colonnes. Cellule par cellule :
Df Sum Sq Mean Sq F value Pr(>F)
group 2 3.766 1.8832 4.846 0.0159
Residuals 27 10.492 0.3886
- Df - les degrés de liberté. La ligne du facteur reçoit groupes − 1 (3 groupes → 2) ; la ligne des résidus reçoit observations − groupes (30 − 3 = 27). Un contrôle rapide que R a bien vu le plan que tu voulais.
- Sum Sq - la variation, séparée en deux tas. La ligne
groupest le tas inter-groupes : à quelle distance les moyennes de groupes se situent de la moyenne globale.Residualsest le tas intra-groupe : de combien les plantes varient autour de la moyenne de leur propre groupe. Ensemble, ils totalisent la variation totale des données. - Mean Sq - chaque Sum Sq divisé par son Df, transformant des tas de variation en taux comparables par degré de liberté. Le Mean Sq résiduel (0,389) est le niveau de bruit.
- F value - le rapport : Mean Sq de
groupsur Mean Sq deResiduals(1,8832 / 0,3886 ≈ 4,85). Si toutes les moyennes de groupes étaient réellement égales, ce rapport tournerait autour de 1. Plus F grandit, plus les différences inter-groupes dépassent ce que le bruit peut expliquer. - Pr(>F) - la p-valeur : la probabilité d'un F aussi grand si les trois moyennes vraies étaient identiques. Ici 0,016 - assez petit au seuil conventionnel de 0,05 pour rejeter « toutes égales ». Comme toujours, ce n'est pas la probabilité que l'hypothèse nulle soit vraie, et ça ne dit rien sur quels groupes diffèrent ni de combien.
Ce dernier point est la limitation cruciale : un F significatif dit « une différence, quelque part ». Rien de plus.
Quels groupes diffèrent ? TukeyHSD()
La question suivante appelle un test post-hoc. La Honest Significant Difference de Tukey teste chaque paire tout en maintenant le taux d'erreur par famille à 5 % sur l'ensemble des comparaisons :
Une ligne par paire, quatre nombres par ligne :
- diff - la différence estimée des moyennes (le groupe nommé en second moins le premier).
- lwr, upr - l'intervalle de confiance à 95 % par famille pour cette différence.
- p adj - la p-valeur, déjà ajustée pour tenir compte des trois comparaisons.
Pour PlantGrowth : trt2-trt1 montre une différence d'environ 0,87 avec p adj ≈ 0,012 et un intervalle qui ne touche pas zéro - le traitement 2 fait mieux pousser que le traitement 1. Les deux lignes traitement contre témoin (trt1-ctrl, trt2-ctrl) ont des intervalles qui chevauchent zéro et des p adj bien au-dessus de 0,05 - aucun traitement n'est distinguable du témoin sur cet échantillon. La règle empirique reflète celle des intervalles de confiance partout : l'intervalle exclut zéro ⇔ p adj inférieure à 0,05.
Remarque comme le F global a dit « une différence existe » tandis que Tukey la localise dans exactement une paire - cette structure en deux temps est toute la conception : un test global honnête, puis un travail d'enquête par paires correctement corrigé.
ANOVA à deux facteurs : deux facteurs et leur interaction
Avec deux variables de groupement, un seul appel teste les deux - plus le fait qu'elles interagissent ou non. ToothGrowth croise le type de supplément (supp) avec la dose (0,5, 1, 2 mg - numérique, donc il faut factor()) :
supp * factor(dose) se développe en trois effets, une ligne de table chacun :
- supp - en moyenne sur les doses, le type de supplément compte-t-il ? (Oui : p ≈ 0,0002.)
- factor(dose) - en moyenne sur les suppléments, la dose compte-t-elle ? (Catégoriquement : p est minuscule.)
- supp:factor(dose) - l'interaction : l'effet du supplément change-t-il selon la dose ? Ici p ≈ 0,022 - oui. Le jus d'orange bat l'acide ascorbique à faibles doses, mais l'écart se referme à la dose de 2 mg.
Une interaction significative est une étiquette d'avertissement sur les effets principaux : « le type de supplément compte » n'est vrai qu'en moyenne, et la moyenne masque une histoire qui dépend de la dose. Quand l'interaction est significative, décris les combinaisons (un TukeyHSD(fit2, "supp:factor(dose)") ou une table de moyennes de groupes via les résumés par groupe) plutôt que de rapporter les effets principaux seuls. N'utilise + au lieu de * que si tu veux délibérément un modèle sans interaction.
Hypothèses - et la solution de repli fondée sur les rangs
Les mathématiques de l'ANOVA s'appuient sur trois hypothèses, par ordre décroissant de négociabilité :
- L'indépendance - les observations ne s'influencent pas entre elles. Rien ne répare une violation après coup ; c'est une propriété du plan d'étude.
- L'égalité des variances entre groupes - le Mean Sq résiduel est une estimation unique et commune du bruit, donc les groupes devraient être à peu près également bruyants. Contrôle en une ligne :
bartlett.test(weight ~ group, data = PlantGrowth)(une grande p-valeur signifie aucune preuve de variances inégales). - Des résidus à peu près normaux - c'est ce qui compte le moins avec des plans équilibrés et des groupes de taille correcte ; jette un œil à un histogramme ou à une boîte à moustaches des résidus via
residuals(fit).
Quand les données sont fortement asymétriques, ordinales ou truffées de valeurs aberrantes, l'alternative fondée sur les rangs à l'ANOVA à un facteur est kruskal.test(weight ~ group, data = PlantGrowth) - le frère à plusieurs groupes de wilcox.test(). Ça tient en une ligne, et ça échange un peu de puissance contre de la robustesse.
Ce que tu retiens
- L'ANOVA pose une question unique sur 3 moyennes de groupes ou plus avec une p-valeur unique - la solution à la multiplicité des tests t.
fit <- aov(y ~ group, data = df); summary(fit)- et la variable de groupement doit être un facteur.- La valeur F est le signal inter-groupes sur le bruit intra-groupe ; un
Pr(>F)petit signifie « une différence quelque part », et rien de plus. TukeyHSD(fit)trouve quelles paires diffèrent, avec la correction pour comparaisons multiples intégrée.a * bajuste deux facteurs plus leur interaction ; une interaction significative signifie que les effets principaux ne racontent pas l'histoire à eux seuls.- Vérifie l'égalité des variances (
bartlett.test) et la normalité des résidus ;kruskal.test()est la solution de repli fondée sur les rangs.
Prochaine étape : passer de la comparaison de moyennes de groupes à la modélisation d'une relation - la régression linéaire avec lm().
Questions fréquentes
Comment réaliser une ANOVA en R ?
Ajuste le modèle avec aov() en utilisant une formule, puis affiche la table avec summary() : fit <- aov(weight ~ group, data = PlantGrowth); summary(fit). La variable de groupement doit être un facteur - si elle est stockée sous forme de nombres, enveloppe-la dans factor() à l'intérieur de la formule.
Comment interpréter la table d'ANOVA en R ?
La valeur F est le rapport entre la variation inter-groupes (Mean Sq du facteur) et la variation intra-groupe (Mean Sq des résidus). Pr(>F) est la p-valeur : si elle est petite, au moins une moyenne de groupe diffère des autres - mais la table ne dit pas laquelle. Lance TukeyHSD(fit) pour le découvrir.
Que fait Tukey HSD en R ?
TukeyHSD(fit) teste chaque paire de groupes en corrigeant le fait que tu réalises de nombreuses comparaisons. Chaque ligne donne la différence estimée (diff), un intervalle de confiance par famille (lwr, upr), et une p-valeur ajustée (p adj). Les paires dont l'intervalle exclut zéro diffèrent significativement.
Pourquoi ne pas simplement enchaîner plusieurs tests t au lieu d'une ANOVA ?
Chaque test t porte son propre risque de faux positif, et les risques s'accumulent. Avec 5 groupes il faudrait 10 tests t par paires, et à un seuil de 0,05 chacun, la probabilité d'au moins un faux positif grimpe à environ 40 %. L'ANOVA pose d'abord une question globale unique, puis le HSD de Tukey réalise les comparaisons par paires avec le taux d'erreur correctement contrôlé.