Analyse de la variance (ANOVA) avec R : tests à un et deux facteurs avec exemples

⚡ Résumé intelligent

L'ANOVA dans R compare les moyennes de trois groupes ou plus en décomposant la variation totale en composantes inter-groupes et intra-groupes. Ce tutoriel applique des tests à un et deux facteurs à l'ensemble de données sur les poisons, vérifie les hypothèses et identifie les paires de valeurs significativement différentes à l'aide du test HSD de Tukey.

  • (I.e. Statistique principale : Le rapport F divise la variabilité entre les groupes par la variabilité au sein des groupes ; des valeurs plus élevées plaident donc contre l'égalité des moyennes.
  • 🧪 Syntaxe unidirectionnelle : aov(time~poison, data = df) suivi de summary() renvoie les degrés de liberté, la valeur F et la valeur p.
  • Vérifications des hypothèses : Vérifiez l'indépendance et la normalité des résidus avec shapiro.test(), ainsi que l'égalité des variances avec leveneTest() avant de vous fier à la p-valeur.
  • ???? Analyse post hoc : TukeyHSD() compare chaque paire de groupes tout en maintenant le taux d'erreur familial au niveau indiqué.
  • 🧮 Extension bidirectionnelle : aov(time~poison + treat, data = df) ajoute un deuxième facteur, et poison:treat ajoute le terme d'interaction.
  • (I.e. Résultats de lecture : Une valeur p inférieure à 0.05 rejette l'hypothèse nulle d'égalité des moyennes, mais n'identifie jamais quel groupe diffère.

ANOVA dans R : une à un facteur, deux à deux facteurs

Qu'est-ce que l'ANOVA ?

Analyse de la variance L'ANOVA (analyse de la variance) est une technique statistique utilisée pour comparer les moyennes de deux groupes ou plus. Ce test fonctionne en décomposant la variation totale d'une mesure en une part expliquée par l'appartenance au groupe et une part restante correspondant au bruit aléatoire. L'ANOVA dans R indique donc si au moins une moyenne de groupe diffère des autres, sans préciser laquelle. C'est une extension directe de l'ANOVA. test t aux situations où la variable facteur comporte plus de deux niveaux.

Avant d'effectuer un test, il est utile de savoir quel membre de la famille ANOVA correspond à votre plan d'expérience.

Types de tests ANOVA dans R

L’ANOVA désigne une famille de tests plutôt qu’une procédure unique. Le choix du test approprié dépend du nombre de facteurs et de la méthode de collecte des données.

Test Quand l'utiliser Appel R
ANOVA unidirectionnelle Un facteur comportant trois niveaux ou plus aov(y ~ x, données = df)
ANOVA bidirectionnelle Deux facteurs indépendants aov(y ~ x1 + x2, données = df)
Interaction bidirectionnelle L'effet d'un facteur dépend de l'autre. aov(y ~ x1 * x2, données = df)
ANOVA à mesures répétées Les mêmes sujets mesurés plus d'une fois aov(y ~ x + Erreur(sujet/x))
ANCOVE Une covariable continue doit être contrôlée pour aov(y ~ x + covariable, données = df)
MANOVA Deux variables de réponse ou plus simultanément manova(cbind(y1, y2) ~ x)

Ce tutoriel couvre les trois premières variantes. Les autres utilisent la même interface aov(), donc une fois que vous savez lire une table de sortie, vous pouvez toutes les lire.

ANOVA vs Test T dans R : Principales différences

Ces deux tests comparent des moyennes, il est donc important de préciser où l'un remplace l'autre.

Critères Test T ANOVA
Nombre de groupes Exactement deux Deux ou plus
Statistique de test t F est égal à t au carré lorsqu'il y a deux groupes.
Résultat Indique le sens de la différence Seuls les rapports faisant état d'une différence existent
Un suivi est nécessaire Aucun Tests post hoc tels que le test HSD de Tukey
Fonction R t.test() aov()

La tentation, avec trois groupes, est d'effectuer trois tests t distincts. Il faut y résister. Chaque test comporte un risque d'erreur de 5 %, ce qui porte le risque de faux positif à environ 14 % avec trois comparaisons. L'ANOVA répond à la même question avec un seul test, et le test HSD de Tukey gère ensuite les comparaisons deux à deux en maîtrisant le risque d'erreur. Pour le cas de deux groupes, voir la section suivante : Tutoriel sur le test t.

ANOVA unidirectionnelle

Il existe de nombreuses situations dans lesquelles vous devez comparer la moyenne entre plusieurs groupes. Par exemple, le service marketing souhaite savoir si trois équipes ont les mêmes performances commerciales.

  • Équipe : 3 facteurs de niveau : A, B et C
  • Vente : une mesure de performance

Le test ANOVA permet de savoir si les trois groupes ont des performances similaires.

Pour clarifier si les données proviennent de la même population, vous pouvez effectuer une analyse de variance unidirectionnelle (Désignée ci-après par l'acronyme ANOVA à un facteur). Comme tout test statistique, elle permet de déterminer si l'hypothèse nulle H0 peut être rejetée. Il est important de noter que ne pas rejeter H0 ne signifie pas la confirmer.

Hypothèse dans le test ANOVA unidirectionnel

  • H0 : Les moyennes entre les groupes sont identiques
  • H1 : Au moins, la moyenne d'un groupe est différente

En d'autres termes, ne pas rejeter H0 signifie qu'il n'y a pas suffisamment de preuves pour conclure qu'une moyenne de groupe diffère des autres.

Ce test est similaire au test t, mais l'ANOVA est le choix approprié lorsqu'il y a plus de deux groupes. Avec exactement deux groupes, les deux tests sont équivalents et la statistique F est égale au carré de la statistique t.

Hypothèses

L'ANOVA à un facteur repose sur trois conditions : les observations sont échantillonnées aléatoirement et sont indépendantes les unes des autres, les résidus au sein de chaque groupe suivent approximativement une loi normale et la variance est identique dans tous les groupes (homogénéité des variances). La section ci-dessous consacrée à la vérification des hypothèses explique comment tester chacune d'elles dans R.

Interpréter le test ANOVA

La statistique F est utilisée pour tester si les données proviennent de populations significativement différentes, c'est-à-dire de moyennes d'échantillon différentes.

Pour calculer la statistique F, vous devez diviser le variabilité entre les groupes au cours de la variabilité intra-groupe.

Le entre-groupes La variabilité reflète l'écart entre la moyenne de chaque groupe et la moyenne générale. Comparez les deux graphiques ci-dessous pour mieux comprendre.

Le graphique de gauche montre très peu de variation entre les trois groupes, de sorte que les moyennes des trois groupes sont proches de global signifier.

Le graphique de droite représente trois distributions très éloignées les unes des autres, sans aucun chevauchement ; l'écart entre la moyenne générale et la moyenne de chaque groupe est donc important.

Interpréter le test ANOVA

Le au sein du groupe La variabilité mesure l'écart entre les observations individuelles et la moyenne de leur groupe. Certaines valeurs sont très éloignées de cette moyenne, et le terme intra-groupe traduit précisément cette dispersion, qui correspond à l'erreur d'échantillonnage.

Pour comprendre visuellement le concept de variabilité au sein du groupe, regardez le graphique ci-dessous.

La partie gauche représente la distribution de trois groupes différents. Vous avez augmenté la dispersion de chaque échantillon et il est clair que la variance individuelle est importante. La statistique F diminue, vous ne pouvez donc pas rejeter l'hypothèse nulle.

La partie droite présente des échantillons ayant les mêmes moyennes mais une dispersion beaucoup plus faible. Cela augmente la statistique F et plaide en faveur de l'hypothèse alternative.

Interpréter le test ANOVA

Vous pouvez utiliser les deux mesures pour construire les statistiques F. Il est très intuitif de comprendre la statistique F. Si le numérateur augmente, cela signifie que la variabilité entre les groupes est élevée et qu'il est probable que les groupes de l'échantillon proviennent de distributions complètement différentes.

Autrement dit, une faible statistique F indique peu ou pas de différence significative entre les moyennes des groupes.

Exemple de test ANOVA unidirectionnel

Vous utiliserez l'ensemble de données sur les poisons pour mettre en œuvre le test ANOVA unidirectionnel. L'ensemble de données contient 48 lignes et 3 variables :

  • Temps : Temps de survie de l'animal
  • poison : Type de poison utilisé : niveau de facteur : 1,2 et 3
  • traiter : Type de traitement utilisé : niveau de facteur : 1,2 et 3

Avant de commencer à calculer le test ANOVA, vous devez préparer les données comme suit :

  • Étape 1 : Importer les données
  • Étape 2 : Supprimez les variables inutiles
  • Étape 3 : Convertir le poison variable en niveau ordonné
library(dplyr)
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv"
df <- read.csv(PATH) %>%
select(-X) %>% 
mutate(poison = factor(poison, ordered = TRUE))
glimpse(df)

Sortie :

## Observations: 48
## Variables: 3
## $ time   <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0...
## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2...
## $ treat  <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...		

Notre objectif est de tester l’hypothèse suivante :

  • H0 : Il n'y a pas de différence dans la durée moyenne de survie entre les groupes
  • H1 : La moyenne des durées de survie est différente pour au moins un groupe.

Autrement dit, vous souhaitez savoir s'il existe une différence statistique entre la durée moyenne de survie selon le type de poison administré au cobaye.

Vous procéderez comme suit :

  • Étape 1 : Vérifiez le format de la variable poison
  • Étape 2 : Imprimez la statistique récapitulative : nombre, moyenne et écart type
  • Étape 3 : Tracer une boîte à moustaches
  • Étape 4 : Calculer le test ANOVA unidirectionnel
  • Étape 5 : Effectuer une comparaison par paires avec Tukey HSD

Étape 1) Vérifiez les niveaux de poison avec le code ci-dessous. Vous devriez voir trois valeurs de caractères, car la fonction mutate a converti la colonne en un facteur ordonné.

levels(df$poison)

Sortie :

## [1] "1" "2" "3"

Étape 2) Vous calculez la moyenne et l’écart type.

df %>%
	group_by(poison) %>%
	summarise(
		count_poison = n(),
		mean_time = mean(time, na.rm = TRUE),
		sd_time = sd(time, na.rm = TRUE)
	)

Sortie :

## 
# A tibble: 3 x 4
##   poison count_poison mean_time    sd_time
##    <ord>        <int>     <dbl>      <dbl>
## 1      1           16  0.617500 0.20942779
## 2      2           16  0.544375 0.28936641
## 3      3           16  0.276250 0.06227627

Étape 3) À la troisième étape, vous pouvez vérifier graphiquement s’il existe une différence entre les distributions. Notez que vous incluez le point instable.

ggplot(df, aes(x = poison, y = time, fill = poison)) +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(0.21)) +
    theme_classic()

Sortie :

Exemple de test ANOVA unidirectionnel

Étape 4) Vous pouvez exécuter le test ANOVA unidirectionnel avec la commande aov. La syntaxe de base d'un test ANOVA est la suivante :

aov(formula, data)
Arguments:			
- formula: The equation you want to estimate
- data: The dataset used	

La syntaxe de la formule est :

y ~ X1+ X2+...+Xn # X1 +  X2 +... refers to the independent variables
y ~ . # use all the remaining variables as independent variables

Vous pouvez maintenant répondre à la question suivante : existe-t-il une différence de durée de survie entre les cobayes, compte tenu du type de poison administré ?

Stockez le modèle dans un objet et transmettez-le à summary() pour obtenir un affichage lisible des résultats.

anova_one_way <- aov(time~poison, data = df)
summary(anova_one_way)

Code Explication

  • aov(time ~ poison, data = df) : Exécutez le test ANOVA avec la formule suivante
  • summary(anova_one_way) : Imprimer le résumé du test

Sortie :

##             Df Sum Sq Mean Sq F value   Pr(>F)
## poison       2  1.033  0.5165   11.79 7.66e-05 ***
## Residuals   45  1.972  0.0438                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La p-valeur est de 7.66 × 05⁻⁵, bien inférieure au seuil habituel de 0.05, et les trois astérisques indiquent la plus forte significativité. On peut donc rejeter H0 et conclure qu'au moins un groupe de poison présente une durée de survie moyenne différente.

Comment vérifier les hypothèses de l'ANOVA dans R

La valeur p d'une ANOVA n'est fiable que si les trois conditions mentionnées précédemment sont remplies. Chacune d'elles peut être vérifiée directement dans R, et toutes les vérifications sont effectuées sur l'objet du modèle ajusté.

1. Indépendance des observations. Il s'agit d'une caractéristique du protocole expérimental, et non des données elles-mêmes ; aucun test ne peut donc y remédier. Chaque cobaye doit être mesuré une seule fois et assigné à son groupe de manière aléatoire. Si un même sujet apparaît dans plusieurs séries, un modèle à mesures répétées est nécessaire.

2. Normalité des résidus. L'ANOVA suppose que les résidus, et non les données brutes, suivent approximativement une loi normale. Examinez le graphique QQ et confirmez la normalité par le test de Shapiro-Wilk.

par(mfrow = c(2, 2))
plot(anova_one_way)          # four diagnostic plots

shapiro.test(residuals(anova_one_way))

Les points proches de la diagonale du graphique QQ normal indiquent des résidus normaux. Une valeur p du test de Shapiro-Wilk supérieure à 0.05 signifie qu'on ne peut pas rejeter l'hypothèse de normalité.

3. Homogénéité de la variance. Chaque groupe devrait présenter une dispersion similaire. Le graphique des résidus en fonction des valeurs ajustées devrait ressembler à une bande plate plutôt qu'à un entonnoir. Confirmez-le avec le test de Levene, plus robuste à la non-normalité que celui de Bartlett.

library(car)
leveneTest(time ~ poison, data = df)

bartlett.test(time ~ poison, data = df)

Une valeur p supérieure à 0.05 indique des variances égales.

Que faire lorsqu'une hypothèse s'avère fausse ? Si les variances sont inégales, effectuez un test d'homozygotie (ANOVA) avec correction de Welch (oneway.test(time ~ poison, data = df, var.equal = FALSE)). Si les résidus ne suivent pas une loi normale et que l'échantillon est petit, utilisez le test de rangs de Kruskal-Wallis (kruskal.test(time ~ poison, data = df)). Avec de grands échantillons équilibrés, l'ANOVA est relativement robuste aux écarts modérés à la normalité ; un résultat limite au test de Shapiro-Wilk est donc rarement problématique.

Comparaison par paire

Un test F significatif indique que les moyennes des groupes ne sont pas toutes égales, mais ne précise pas quelle paire diffère. Le test de Tukey (HSD) répond à cette question en comparant chaque paire tout en contrôlant le risque d'erreur global.

TukeyHSD(anova_one_way)

Sortie :

Comparaison par paire

Lisez la sortie ligne par ligne. diff La colonne indique la différence entre les moyennes des deux groupes. lwr et en haut délimiter l'intervalle de confiance à 95 % pour cette différence, et p adj La valeur p ajustée pour les comparaisons multiples est indiquée. Deux paires diffèrent significativement lorsque leur intervalle de confiance exclut zéro, c'est-à-dire lorsque la valeur p ajustée est inférieure à 0.05. Dans cet ensemble de données, les comparaisons impliquant le poison 3 sont significatives, ce qui correspond au diagramme en boîte : le groupe 3 présente un temps de survie moyen nettement inférieur à celui des groupes 1 et 2, tandis que les groupes 1 et 2 sont statistiquement indiscernables l'un de l'autre.

ANOVA bidirectionnelle

Une ANOVA à deux facteurs ajoute un deuxième facteur à la formule. Elle fonctionne exactement comme le test à un facteur, seule la formule change :

y ~ x1 + x2

Ici, y est la variable de réponse quantitative, tandis que x1 et x2 sont tous deux des facteurs catégoriels.

Hypothèse dans le test ANOVA bidirectionnel

  • H0 : Les moyennes des groupes sont égales pour les deux variables factorielles.
  • H1 : Au moins une moyenne de groupe diffère, pour au moins un des deux facteurs

Vous ajoutez la variable « traitement » au modèle. Cette variable enregistre le traitement administré au cobaye. La formule additive ci-dessous teste si chaque facteur influence individuellement la durée de survie, après avoir pris en compte les autres.

Modifiez le code en ajoutant « treat » à côté de la première variable indépendante.

anova_two_way <- aov(time~poison + treat, data = df)
summary(anova_two_way)

Sortie :

##             Df Sum Sq Mean Sq F value  Pr(>F)    
## poison       2 1.0330  0.5165   20.64 5.7e-07 ***
## treat        3 0.9212  0.3071   12.27 6.7e-06 ***
## Residuals   42 1.0509  0.0250                    
## ---

Les deux valeurs p (5.7e-07 pour le poison et 6.7e-06 pour le traitement) sont bien en dessous de 0.05, vous rejetez donc H0 pour les deux facteurs et concluez que le changement du poison ou du traitement affecte le temps de survie.

Ajout d'un terme d'interaction

Le modèle additif ci-dessus suppose que l'effet du poison est identique quel que soit le traitement. Pour tester cette hypothèse, remplacez le signe plus par un astérisque, qui prend en compte à la fois les effets principaux et leur interaction :

anova_interaction <- aov(time~poison * treat, data = df)
summary(anova_interaction)

Si la ligne poison:traitement n'est pas significative, le modèle additif est le meilleur choix car il utilise moins de degrés de liberté.

ANOVA dans R : Guide de référence rapide des tests

Le tableau ci-dessous répertorie chaque test utilisé ci-dessus, l'appel R qui l'exécute et l'hypothèse qu'il évalue :

Test Code Hypothèse Valeur P
ANOVA à sens unique
aov(y ~ X, data = df)
H1 : La moyenne est différente pour au moins un groupe 0.05
Par paire
TukeyHSD(ANOVA summary)
0.05
ANOVA à deux voies
aov(y ~ X1 + X2, data = df)
H1 : Au moins une moyenne de groupe diffère pour l'un ou l'autre facteur 0.05

FAQ

La valeur F correspond au rapport entre la variance intergroupes et la variance intragroupes. Des valeurs proches de 1 suggèrent que les moyennes des groupes sont similaires. Des valeurs élevées indiquent que les groupes proviennent de populations ayant des moyennes différentes.

Utilisez `oneway.test()` avec `var.equal = FALSE` lorsque les variances sont inégales, et `kruskal.test()` lorsque les résidus ne suivent manifestement pas une loi normale. La transformation logarithmique d'une variable réponse asymétrique permet souvent de rétablir la normalité et l'égalité des variances.

Chaque test t comporte un risque de faux positif de 5 %. Trois tests de comparaison par paires portent le taux d'erreur global à environ 14 %. L'ANOVA maintient un test global unique à 5 %, et le test HSD de Tukey ajuste les comparaisons par paires.

L'ANOVA est un filtre de sélection de caractéristiques standard : elle classe les prédicteurs catégoriels selon leur capacité à séparer une variable cible numérique. Les équipes d'IA l'utilisent également pour comparer différentes variantes de modèles lors de validations croisées.

Oui. Les assistants IA peuvent expliquer les degrés de liberté, traduire les valeurs p en langage clair et signaler les violations d'hypothèses dans les graphiques de diagnostic. Il est toujours conseillé de vérifier les résultats avec ceux obtenus par les tests de Levene et de Shapiro.

Résumez cet article avec :