Important : Ce guide assume que vous savez comment :
Vous pouvez cliquer sur les liens ci-dessus pour consulter les guides associées.
Dans ce guide, nous étudierons des fleurs. La banque de données que
nous utiliserons (iris
) est inclue par défaut dans R. Pour
suivre, vous n’avez donc qu’à utiliser la syntaxe suivante :
# Packages
library(knitr)
library(tibble)
library(ggplot2)
library(car)
library(effectsize)
library(emmeans)
# Importer les données
data("iris")
df <- tibble(iris)
Voici à quoi devrait ressembler votre banque de données après l’étape de préparation :
df
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fct>
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## # … with 140 more rows
L’hypothèse alternative est qu’il existe au moins une distribution
dont la moyenne s’écarte des autres moyennes : \[
\begin{aligned}
H_0 & : \mu_1 = \mu_2 = \mu_3 = \mu \\
H_1 &: \exists(i,j) \: \text{tel que} \: \mu_i ≠ \mu_j \\
\end{aligned}
\] Note: l’hypothèse \(H_1\) se traduit comme suit : « Il
existe une combinaison de i et j tel que la moyenne \(\mu_i\) n’est pas égale à la moyenne \(\mu_j\) » (shoutout à cet
article wikipedia). Autrement dit, une ANOVA significative nous
indique qu’au moins une des affirmations suivantes est vraie :
\[
\begin{aligned}
\mu_{\text{setosa}} & ≠ \mu_{\text{versicolor}} \\
\mu_{\text{setosa}} & ≠ \mu_{\text{virginica}}\\
\mu_{\text{versicolor}} & ≠ \mu_{\text{virginica}}\\
\end{aligned}
\]
Voici un graphique pour visualiser l’analyse que nous allons effectuer :
ggplot(df, aes(x = Petal.Length, fill = Species)) +
geom_density(alpha = .5) +
geom_vline(lty = 2, col = "red", xintercept = mean(df[df$Species == "setosa",]$Petal.Length)) +
geom_vline(lty = 2, col = "green", xintercept = mean(df[df$Species == "versicolor",]$Petal.Length)) +
geom_vline(lty = 2, col = "blue", xintercept = mean(df[df$Species == "virginica",]$Petal.Length)) +
labs(x = "Longeur du sépale", y = "Densité") +
theme_classic()
df_setosa <- subset(df, df$Species == "setosa")
df_versicolor <- subset(df, df$Species == "versicolor")
df_virginica <- subset(df, df$Species == "virginica")
shapiro.test(df_setosa$Petal.Length)
##
## Shapiro-Wilk normality test
##
## data: df_setosa$Petal.Length
## W = 0.95498, p-value = 0.05481
shapiro.test(df_versicolor$Petal.Length)
##
## Shapiro-Wilk normality test
##
## data: df_versicolor$Petal.Length
## W = 0.966, p-value = 0.1585
shapiro.test(df_virginica$Petal.Length)
##
## Shapiro-Wilk normality test
##
## data: df_virginica$Petal.Length
## W = 0.96219, p-value = 0.1098
qqnorm(df_setosa$Petal.Length)
qqline(df_setosa$Petal.Length)
qqnorm(df_virginica$Petal.Length)
qqline(df_virginica$Petal.Length)
qqnorm(df_versicolor$Petal.Length)
qqline(df_versicolor$Petal.Length)
library(car)
leveneTest(df$Petal.Length ~ df$Species)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 19.48 3.129e-08 ***
## 147
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model <- lm(Petal.Length ~ Species, data = df)
anova(model)
## Analysis of Variance Table
##
## Response: Petal.Length
## Df Sum Sq Mean Sq F value Pr(>F)
## Species 2 437.10 218.551 1180.2 < 2.2e-16 ***
## Residuals 147 27.22 0.185
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
On peut conclure que la longueur moyennes des pétales diffère significativement selon l’espèce de fleur (\(F(2,147) = 1180,2; p < ,05\)).
library(effectsize)
eta_squared(model)
## For one-way between subjects designs, partial eta squared is equivalent
## to eta squared. Returning eta squared.
## # Effect Size for ANOVA
##
## Parameter | Eta2 | 95% CI
## -------------------------------
## Species | 0.94 | [0.93, 1.00]
##
## - One-sided CIs: upper bound fixed at [1.00].
cohens_f(model)
## For one-way between subjects designs, partial eta squared is equivalent
## to eta squared. Returning eta squared.
## # Effect Size for ANOVA
##
## Parameter | Cohen's f | 95% CI
## -----------------------------------
## Species | 4.01 | [3.60, Inf]
##
## - One-sided CIs: upper bound fixed at [Inf].
library(emmeans)
emmeans(model, tukey ~ Species)
## $emmeans
## Species emmean SE df lower.CL upper.CL
## setosa 1.46 0.0609 147 1.34 1.58
## versicolor 4.26 0.0609 147 4.14 4.38
## virginica 5.55 0.0609 147 5.43 5.67
##
## Confidence level used: 0.95
##
## $contrasts
## contrast estimate SE df t.ratio p.value
## setosa - versicolor -2.80 0.0861 147 -32.510 <.0001
## setosa - virginica -4.09 0.0861 147 -47.521 <.0001
## versicolor - virginica -1.29 0.0861 147 -15.012 <.0001
##
## P value adjustment: tukey method for comparing a family of 3 estimates
Le test de Kruskal-Wallis est souvent présenté comme une version
« robuste » de l’ANOVA et constitue une généralisation du Test U
Mann-Whitney (voir section 2 du guide test-t.html
).
Voici les postulats du test de Kruskal-Wallis :
kruskal.test(df$Petal.Length ~ df$Species)
##
## Kruskal-Wallis rank sum test
##
## data: df$Petal.Length by df$Species
## Kruskal-Wallis chi-squared = 130.41, df = 2, p-value < 2.2e-16
On peut encore une fois conclure que la longueur moyenne des pétales diffère significativement selon l’espèce de fleur (\(\chi^2(2) = 130,4; p < ,05\)).
pairwise.wilcox.test(df$Petal.Length, df$Species,
p.adjust.method = "bonferroni")
##
## Pairwise comparisons using Wilcoxon rank sum test with continuity correction
##
## data: df$Petal.Length and df$Species
##
## setosa versicolor
## versicolor < 2e-16 -
## virginica < 2e-16 2.7e-16
##
## P value adjustment method: bonferroni
Note: Le critère d’ajustement de la valeur de p de Tukey
n’est pas disponible pour cette méthode. J’utilise donc la méthode de
correction de Bonferroni. D’autres méthodes sont disponibles. Pour les
consulter, exécuter le code suivant dans la console :
?p.adjust.methods
Le test post-hoc avec correction de Bonferroni indique que toutes les différences sont significatives (\(p < ,05\)).