Comment effectuer une ANOVA unidirectionnelle dans R
Une ANOVA unidirectionnelle est utilisée pour déterminer s’il existe ou non une différence statistiquement significative entre les moyennes de trois groupes indépendants ou plus.
Ce type de test est appelé ANOVA unidirectionnelle car nous analysons l’impact d’une variable prédictive sur une variable de réponse.
Remarque : Si nous étions plutôt intéressés par l’impact de deux variables prédictives sur une variable de réponse, nous pourrions effectuer une ANOVA bidirectionnelle .
Comment effectuer une ANOVA unidirectionnelle dans R
L’exemple suivant illustre comment effectuer une ANOVA unidirectionnelle dans R.
Arrière-plan
Supposons que nous souhaitions déterminer si trois programmes d’exercices différents ont un impact différent sur la perte de poids. La variable prédictive que nous étudions est le programme d’exercice et la variable de réponse est la perte de poids, mesurée en livres.
Nous pouvons effectuer une ANOVA unidirectionnelle pour déterminer s’il existe une différence statistiquement significative entre la perte de poids résultant des trois programmes.
Nous recrutons 90 personnes pour participer à une expérience dans laquelle nous assignons au hasard 30 personnes à suivre soit le programme A, soit le programme B, soit le programme C pendant un mois.
Le code suivant crée le bloc de données avec lequel nous allons travailler :
#make this example reproducible
set.seed(0)
#create data frame
data <- data.frame(program = rep(c("A", "B", "C"), each = 30),
weight_loss = c(runif(30, 0, 3),
runif(30, 0, 5),
runif(30, 1, 7)))
#view first six rows of data frame
head(data)
# program weight_loss
#1 A 2.6900916
#2 A 0.7965260
#3 A 1.1163717
#4 A 1.7185601
#5 A 2.7246234
#6 A 0.6050458
La première colonne du bloc de données montre le programme auquel la personne a participé pendant un mois et la deuxième colonne montre la perte de poids totale que la personne a subie à la fin du programme, mesurée en livres.
Explorer les données
Avant même d’ajuster le modèle ANOVA unidirectionnel, nous pouvons mieux comprendre les données en trouvant la moyenne et l’écart type de la perte de poids pour chacun des trois programmes à l’aide du package dplyr :
#load dplyr package library(dplyr) #find mean and standard deviation of weight loss for each treatment group data %>% group_by(program) %>% summarise(mean = mean(weight_loss), sd = sd(weight_loss)) # A tibble: 3 x 3 # program mean sd # #1 A 1.58 0.905 #2 B 2.56 1.24 #3 C 4.13 1.57
Nous pouvons également créer un boxplot pour chacun des trois programmes afin de visualiser la répartition de la perte de poids pour chaque programme :
#create boxplots
boxplot(weight_loss ~ program,
data = data,
main = "Weight Loss Distribution by Program",
xlab = "Program",
ylab = "Weight Loss",
col = "steelblue",
border = "black")
À partir de ces diagrammes en boîte, nous pouvons voir que la perte de poids moyenne est la plus élevée pour les participants au programme C et que la perte de poids moyenne est la plus faible pour les participants au programme A.
Nous pouvons également voir que l’écart type (la « longueur » du boxplot) pour la perte de poids est un peu plus élevé dans le programme C par rapport aux deux autres programmes.
Ensuite, nous adapterons le modèle ANOVA unidirectionnel à nos données pour voir si ces différences visuelles sont réellement statistiquement significatives.
Ajustement du modèle ANOVA unidirectionnel
La syntaxe générale pour ajuster un modèle ANOVA unidirectionnel dans R est la suivante :
aov (variable de réponse ~ prédicteur_variable, données = ensemble de données)
Dans notre exemple, nous pouvons utiliser le code suivant pour ajuster le modèle ANOVA unidirectionnel, en utilisant poids_perte comme variable de réponse et programme comme variable prédictive. Nous pouvons ensuite utiliser la fonction summary() pour afficher le résultat de notre modèle :
#fit the one-way ANOVA model model <- aov(weight_loss ~ program, data = data) #view the model output summary(model) # Df Sum Sq Mean Sq F value Pr(>F) #program 2 98.93 49.46 30.83 7.55e-11 *** #Residuals 87 139.57 1.60 #--- #Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
À partir des résultats du modèle, nous pouvons voir que le programme de variables prédictives est statistiquement significatif au niveau de signification de 0,05.
En d’autres termes, il existe une différence statistiquement significative entre la perte de poids moyenne résultant des trois programmes.
Vérification des hypothèses du modèle
Avant d’aller plus loin, nous devons vérifier que les hypothèses de notre modèle sont remplies afin que nos résultats du modèle soient fiables. En particulier, une ANOVA unidirectionnelle suppose :
1. Indépendance – les observations de chaque groupe doivent être indépendantes les unes des autres. Puisque nous avons utilisé une conception randomisée (c’est-à-dire que nous avons assigné les participants aux programmes d’exercices de manière aléatoire), cette hypothèse devrait être satisfaite afin que nous n’ayons pas trop à nous en soucier.
2. Normalité – la variable dépendante doit avoir une distribution approximativement normale pour chaque niveau de la variable prédictive.
3. Variance égale – les variances pour chaque groupe sont égales ou approximativement égales.
Une façon de vérifier les hypothèses de normalité et d’égalité de variance consiste à utiliser la fonction plot() , qui produit quatre tracés de vérification de modèle. En particulier, nous nous intéressons particulièrement aux deux parcelles suivantes :
- Résidus vs ajustés – ce graphique montre la relation entre les résidus et les valeurs ajustées. Nous pouvons utiliser ce graphique pour évaluer approximativement si la variance entre les groupes est approximativement égale ou non.
- Graphique QQ – ce graphique affiche les résidus standardisés par rapport aux quantiles théoriques. Nous pouvons utiliser ce graphique pour évaluer approximativement si l’hypothèse de normalité est satisfaite ou non.
Le code suivant peut être utilisé pour produire ces tracés de vérification de modèle :
plot(model)
Le graphique QQ ci-dessus nous permet de vérifier l’hypothèse de normalité. Idéalement, les résidus standardisés se situeraient le long de la ligne diagonale droite du tracé. Cependant, dans le graphique ci-dessus, nous pouvons voir que les résidus s’écartent un peu de la ligne vers le début et la fin. Cela indique que notre hypothèse de normalité pourrait être violée.
Le graphique Résidus vs Ajustés ci-dessus nous permet de vérifier notre hypothèse de variances égales. Idéalement, nous aimerions que les résidus soient répartis de manière égale pour chaque niveau des valeurs ajustées.
Nous pouvons voir que les résidus sont beaucoup plus étalés pour les valeurs ajustées les plus élevées, ce qui indique que notre hypothèse d’égalité des variances pourrait être violée.
Pour tester formellement des variances égales, nous pourrions effectuer le test de Levene en utilisant le package car :
#load car package library(car) #conduct Levene's Test for equality of variances leveneTest(weight_loss ~ program, data = data) #Levene's Test for Homogeneity of Variance (center = median) # Df F value Pr(>F) #group 2 4.1716 0.01862 * # 87 #--- #Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La valeur p du test est de 0,01862 . Si nous utilisons un niveau de signification de 0,05, nous rejetterions l’hypothèse nulle selon laquelle les variances sont égales entre les trois programmes. Cependant, si nous utilisons un niveau de signification de 0,01, nous ne rejetterons pas l’hypothèse nulle.
Même si nous pourrions tenter de transformer les données pour nous assurer que nos hypothèses de normalité et d’égalité des variances sont respectées, pour le moment, nous ne nous en soucierons pas trop.
Analyser les différences de traitement
Une fois que nous avons vérifié que les hypothèses du modèle sont satisfaites (ou raisonnablement satisfaites), nous pouvons alors effectuer un test post hoc pour déterminer exactement quels groupes de traitement diffèrent les uns des autres.
Pour notre test post hoc, nous utiliserons la fonction TukeyHSD() pour effectuer le test de Tukey pour des comparaisons multiples :
#perform Tukey's Test for multiple comparisons
TukeyHSD(model, conf.level=.95)
# Tukey multiple comparisons of means
# 95% family-wise confidence level
#
#Fit: aov(formula = weight_loss ~ program, data = data)
#
#$program
# diff lwr upr p adj
#B-A 0.9777414 0.1979466 1.757536 0.0100545
#C-A 2.5454024 1.7656076 3.325197 0.0000000
#C-B 1.5676610 0.7878662 2.347456 0.0000199
La valeur p indique s’il existe ou non une différence statistiquement significative entre chaque programme. Les résultats montrent qu’il existe une différence statistiquement significative entre la perte de poids moyenne de chaque programme au niveau de signification de 0,05.
Nous pouvons également visualiser les intervalles de confiance à 95 % résultant du test de Tukey en utilisant la fonction plot(TukeyHSD()) dans R :
#create confidence interval for each comparison
plot(TukeyHSD(model, conf.level=.95), las = 2)
Les résultats des intervalles de confiance sont cohérents avec les résultats des tests d’hypothèses.
En particulier, nous pouvons constater qu’aucun des intervalles de confiance pour la perte de poids moyenne entre les programmes ne contient la valeur zéro , ce qui indique qu’il existe une différence statistiquement significative dans la perte moyenne entre les trois programmes.
Cela concorde avec le fait que toutes les valeurs p de nos tests d’hypothèse sont inférieures à 0,05.
Rapport des résultats de l’ANOVA unidirectionnelle
Enfin, nous pouvons rapporter les résultats de l’ANOVA unidirectionnelle de manière à résumer les résultats :
Une ANOVA unidirectionnelle a été réalisée pour examiner les effets du programme d’exercice sur la perte de poids (mesurée en livres). Il y avait une différence statistiquement significative entre les effets des trois programmes sur la perte de poids (F(2, 87) = 30,83, p = 7,55e-11). Des tests post-hoc HSD de Tukey ont été effectués.
La perte de poids moyenne des participants au programme C est significativement supérieure à la perte de poids moyenne des participants au programme B (p < 0,0001).
La perte de poids moyenne des participants au programme C est significativement supérieure à la perte de poids moyenne des participants au programme A (p < 0,0001).
De plus, la perte de poids moyenne des participants au programme B est significativement supérieure à la perte de poids moyenne des participants au programme A (p = 0,01).
Ressources additionnelles
Les didacticiels suivants fournissent des informations supplémentaires sur les ANOVA unidirectionnelles :
Une introduction à l’ANOVA unidirectionnelle
Un guide d’utilisation des tests post-hoc avec ANOVA
Le guide complet : Comment rapporter les résultats de l’ANOVA