ANOVA (Analyse de la variance) et ANCOVA (Analyse de la covariance)

En langage R

L'essentiel de cette page !

L'ANOVA est un test statistique permettant d'identifier la significativité de certains facteurs sur la variance de données. 

Il en existe 2 types schématiquement : l'anova de niveau 1 (one-way) et l'anova de niveau 2 (two-way).

Deux fonctions équivalentes font les anovas. On favorisera aov() pour les études d'anova (1way et 2way), même si la fonction anova() donne des résultats équivalents (cette  fonction est plutôt à appliquer aux régressions).

Cette même fonction permet de faire de l'ANCOVA (analyse de la covariance), approche qui permet de voir l'effet de variables catégorielles, mais aussi numériques.

La fonction aov() utilise la somme des carrés de type I (séquentielle) tandis que la fonction anova() utilise la somme des carrés de type III (partielle) [source].

0. Simulons des valeurs pour les exemples (à copier-coller)

Exemple : des mesures ont été réalisées sur des animaux dont on a le sexe et l'âge. Ce serait bien de voir si le sexe et l'âge ont un effet sur ces mesures.

# EXEMPLE :

valeurs = c(1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,4,4)

sexe = c("M","M","M","M","M","M","M","M","M","M","M","F","F","F","F","F","F","F","F","F","F","F","F", "F","F","F","F","F","F","F","F","F","F")

age = c(12,13,1,12,13,1,12,13,1,12,13,1,12,13,1,12,13,1,12,13,1,12,13,1,12,13,1,12,13,1,12,13,1)

On va faire une anova de niveau 1 pour voir si le sexe à un effet sur la moyenne des mesures.

Si cette anova renvoie une p-value faible (inférieure à 0,05 ou moins selon notre niveau d'exigence), c'est qu'on distingue une différence significative entre la moyenne des mâles et des femelles.

Cela dit, l'anova sert en théorie à comparer les variances. Pour utiliser l'anova pour prouver une différence de moyenne, il faut d'abord prouver que les variances des échantillons (2 ou plus autrement dit, mesure sur 2 catégories ou plus) sont équivalentes (avec un test de Bartlett). Ainsi, si les variances sont identiques, alors si l'anova voit une différence, c'est que cela se fait au niveau des moyennes.

# Remarque : penser d'abord à faire un test de Bartlett

# ce test de Bartlett doit renvoyer une p-value > 0,05 pour pouvoir continuer.

# Prendre les données de la partie 0 ci-dessus.

myaov= aov(valeurs~factor(sexe))

summary(myaov)

Attention : ne pas mettre dans facteur des valeurs continues : il faut des catégories afin d'établir un lien avec ces catégories. Sinon, le message "les tests F d'ANOVA sur un ajustement pratiquement parfait ne sont pas fiables" risque d'apparaître puisque R détectera autant de catégories que de mesures.

2. ANOVA DE NIVEAU 2 AVEC R (two-way, 2way anova)

Idéalement une anova de niveau 2 se fait en 2 étapes que l'on va faire figurer d'un point de vue théorique avant de donner un exemple plus bas.

Remarque : on peut aussi utiliser la fonction anova() : cela marche aussi.

ETAPE 1 - Compiler ensemble les données dont on dispose et les associer aux différents facteurs

resultat = aov(data~factor(facteur1)*factor(facteur2))

# resultat : nom donner à la compilation.

# data : liste des valeurs collectées dont on désire connaître les paramètres qui les influencent

# facteur 1 : liste des modalités pour un premier facteur

# facteur 2 : liste des modalités pour un deuxième facteur

# On peut ainsi mettre de très nombreux autres facteurs en ajoutant à la suite *factor(facteur)

Attention : ne pas mettre dans facteur des valeurs continues : il faut des catégories afin d'établir un lien avec ces catégories. Sinon, le message "les tests F d'ANOVA sur un ajustement pratiquement parfait ne sont pas fiables" risque d'apparaître puisque R détectera autant de catégories que de mesures.

ETAPE 2 - Faire analyser la compilation par la fonction ANOVA

analyse<-summary(resultat)

analyse # Permet d'afficher le résultat

# les étoiles indiquent les paramètres ayant un effet significatif comme pour le test de Student

Application d'un exemple sur le jeu de données ci-dessus (partie 0 ci-dessus), mais cette fois-ci avec anova()

# Prendre les données de la partie 0 ci-dessus.

compilation = lm(valeurs~factor(sexe)*factor(age))

analyse<-anova(compilation)

analyse

Les résultats sous R sont les suivants : les 3 étoiles associées au facteur sexe montrent que le sexe à un effet sur les valeurs contrairement au facteur âge. L'âge n'a en revanche pas d'effet sur les mesures ni l'interaction du sexe et de l'âge.

                        Df  Sum Sq Mean Sq F value    Pr(>F)    

factor(sexe)              1 19.6364 19.6364 58.7924 3.017e-08 ***

factor(age)               2  0.0466  0.0233  0.0697    0.9328    

factor(sexe):factor(age)  2  0.0265  0.0132  0.0396    0.9612    

Residuals                27  9.0179  0.3340                      

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Le graphique nécessaire sera un diagramme à barres regroupées.

Consulter l'aide correspondante.

Fonctions utiles : by() ; ftable() ; as.matrix() ; int.ech() de {KefiR} et barplot2() de {gplots}

3. ANCOVA

L’ANCOVA (Analyse de covariance) est une méthode statistique qui permet de tester l’effet sur une variable dépendante continue d’une ou plusieurs variables indépendantes catégorielles, indépendamment de l’effet d’autres facteurs quantitatifs continus, appelés covariables (source : Wikipedia).

Prenons un exemple simple : je souhaite comparer les performance de deux groupes indépendamment de l'âge et comme les individus n'y ont pas tous le même âge, je vais essayer d'évaluer un effet du groupe indépendamment de l'âge.

# Création des données

groupe <- c(rep("A", 10), rep("B", 10))

age <- c(20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28)

performance <- c(80, 85, 90, 95, 100, 105, 110, 115, 120, 125,

                 70, 75, 80, 85, 90, 95, 100, 105, 110, 115)

donnees <- data.frame(groupe = groupe,

                      age = age,

                      performance = performance)

# Réalisation de l'ANCOVA

resultat <- aov(performance ~ groupe + age,

                data = donnees)

# Affichage des résultats

summary(resultat)

Exercice pour s'entraîner

Exercice : Faire une ANOVA