Tutoriel : ANOVA sur mesures répétées

 

L’ANOVA paramétrique à un facteur est une approche statistique qui permet de comparer plus de deux moyennes. Mais, pour être valide, cette méthode doit satisfaire trois critères :

  • indépendance des résidus (ou des données)
  • normalité des résidus (ou des données)
  • homogénéité des résidus (ou des données).
Lorsque l’hypothèse de normalité et/ou d’homogénéité n’est pas satisfaite, il suffit d’employer le test de Kruskal-Wallis qui est une alternative non paramétrique à l’ANOVA à un facteur.
En revanche, lorsque les données ne sont pas indépendantes – parce que les observations ont été réalisées sur les mêmes unités expérimentales– il est nécessaire d’employer une ANOVA pour mesures répétées. C’est ce que nous allons voir dans cet article.

 

Pré requis

Pour tirer pleinement profit de cet article,  je vous recommande de lire les articles dédiés à l’ANOVA à un facteur sur données indépendantes :

Introduction

Contexte

Une situation très classique est celle de mesures répétées dans le temps. A titre d’exemple, imaginons que 15 garçons ont été mesurés à trois reprises entre 8 et 9 ans (par exemple à 8 ans, 8 ans + 3 mois, et 8 ans + 9 mois que l’on nomme Time1, Time2, Time3). Les données pourraient être comme celles-ci (vous pouvez les télécharger en cliquant sur le lien: Taille )

 

Visualisation

Passage en format long

Afin de visualiser les données en utilisant le package ggplot2, il est préférable de passer les données dans un format dit “long”.
pivot table R
Pour cela, nous pouvons utiliser le code suivant, avec la nouvelle fonction pivot_longer du package dplyr.

 

Plots

Pour visualiser les données, nous pouvons faire ce type de graphique :
anova mesure repetees
Nous pouvons également subdiviser le graphique par sujet. Il est très facile de le faire avec ggplot2, en employant la fonction facet_wrap():
anova répétée R
Remarque : dans le cas de mesures répétées l’utilisation des boxplots est moins intéressante car elle ne permet pas de montrer que les  observations ont été faites sur les mêmes unités expérimentales.

 

Question posée

On souhaite évaluer si, globalement, les tailles moyennes des sujets, aux trois temps de mesure, sont identiques ou bien si elles sont différentes pour au moins deux temps.

 

Jargon

Lorsque les données ne sont pas indépendantes, c’est qu’il existe un cluster ou groupe sous-jacent.
Dans notre exemple, le cluster (ou groupe) sous-jacent est le sujet : les données appartiennent trois par trois à un même sujet.
L’Anova pour mesures répétées est parfois aussi nommée “ANOVA within” (en opposition à l’ANOVA betwwen lorsque les données sont indépendantes), ou encore “ANOVA à un facteur intra sujet”.
De manière plus générale, les méthodes statistiques pour analyser des données
non-indépendantes peuvent être appelées :
  • modèles hiérarchiques
  • analyses longitudinales (lorsque les données sont répétées dans le temps)
  • modèles mixtes (plus généraliste)
Le terme “mixte” correspond à la co-existence, dans le modèle :
  • d’une ou plusieurs variables à effet fixe (ici le temps)
  • une ou plusieurs variables à effet aléatoire (ici le sujet).
Le temps est dit à effet fixe car il a été convenu ou fixé en amont des mesures, à 8 ans, 8 ans + 3 mois, et 8 ans + 9 mois. Ce sont ces temps-là qui nous intéressent.
Le sujet est dit à effet aléatoire car le sujet en lui-même ne nous intéresse pas. Il est seulement un support de la mesure. Ces sujets ont été sélectionnés de manière aléatoire ; d’autres sujets
auraient pu être mesurés à leur place. Si nous refaisions l’expérience, d’autres sujets seraient mesurés, alors que les temps de mesures seraient identiques !

 

Principe

Décomposition de la dispersion

Pour répondre à la question posée (est-ce que globalement les tailles moyennes des sujets aux trois temps de mesure sont identiques ou bien sont elles différentes pour au moins deux temps), si les données étaient indépendantes, nous utiliserions une ANOVA à un facteur . Pour rappel, cette approche décompose la dispersion totale des données (SCT) en :
  • une dispersion factorielle (SCF, ici le temps)
  • une dispersion résiduelle (SCR, ce qui ne peut pas être affecté au temps).
L’ANOVA pour mesures répétées introduit ici une nouvelle source de dispersion: le cluster sous-jacent, ici le sujet. Ainsi, la dispersion totale (SCT) des données est décomposée en :
  • une dispersion factorielle (SCF : le temps)
  • une dispersion due au sujet (SCSujet)
  • une dispersion résiduelle (SCR’: ce qui ne peut pas être affecté au temps).

 

Impact sur la variance résiduelle

Cette prise en considération d’une nouvelle source de variabilité (le sujet) va impacter le calcul de la variance résiduelle (celle que nous aurions obtenue si les mesures étaient indépendantes).
Ainsi, une part (plus ou moins importante selon les situations) de la variance résiduelle, va être affectée à de la variance sujet. La variance résiduelle va donc diminuer.
Puisque la variance résiduelle est au dénominateur des tests F, la statistique du test va augmenter, et ainsi la puissance du test va également être augmentée.
anova données indépendantes mesures répétées
Remarque: Dans l’ANOVA à un facteur pour données indépendantes, la somme des carrés résiduelle est parfois appelée within. Personnellement, je n’aime pas cette nomenclature “between”/ “within”, je préfère l’utilisation des termes “factoriel”, “résiduel” et “sujet”.
Cette part de dispersion sera calculée, par la somme des distances au carré entre la moyenne du sujet et la moyenne générale (grand mean), multipliée par le nombre de modalités du facteur étudié (ici 3 pour le facteur Time).

 

Formules

Les notations suivantes sont utilisées :
  • i l’indice du cluster sous jacent (ici le sujet), va de 1 à n_i,
  • j l’indice des modalités du facteur étudié (ici le temps), va de 1 à k,
  • k le nombre de conditions,
  • y_ij la mesure du sujet i au temps j,
  • y_i la moyenne des mesures du sujet i,
  • y_j la moyenne des mesures au temps j
  • y_barre : la moyenne générale (grand mean)

 

Somme des carrés totaux (SCT)

$$\text{SCT}  = \sum_{i=1}^{n_i}\sum_{j=1}^{k} (y_{ij } – \overline{y})^2    $$
La SCT peut être représentée comme ceci :
anova SCT
La SCT peut se calculer manuellement comme ceci:

 

Somme des carrés factoriels (SCF)

$$ SCF = \sum_{j=1}^{k} n_i \times({y_j} – \overline{y})^2 $$
La SCF peut être représentée comme ceci :
anova SCF
La SCF peut se calculer manuellement comme ceci :

 

Somme des carrés sujet (SCSujet)

$$SCS_{ujet}  = k\sum_{i=1}^{n_i}(y_i – \bar{y})^2$$
Le calcul de cette somme des distances au carré peut être illustrée comme cela :
anova SCS
La somme des carrés sujets peut se calculer manuellement comme ceci :
La nouvelle somme des carrés résiduels est calculée comme ceci :
$$SCR’ = SCR-SCS_{ujet}$$
$$SCR’ = SCT-SCF-SCS_{ujet}$$
Ici SCR’ est égale à :

 

Les carrés moyens

Les carrés moyens deviennent alors :
$$\text{Variance Factorielle}  = \frac{SCF}{k-1}  $$
$$\text{Variance Résiduelle}  = \frac{SCR’}{(n_i-1)(k-1)}  $$

 

Le test

$$ F_{(k-1, N-k)} =\frac{ \frac{SCF}{(k-1)}}{\frac{SCR’}{(n_i-1)(k-1)}} $$

 

Conditions d’applications

Les conditions de l’ANOVA pour mesures répétées sont :
  • Normalité des résidus
  • Homogénéité des variances et des co-variances (puisque les observations ne sont plus indépendantes, un terme de covariance doit à présent être considéré).
L’hypothèse d’homogénéité des variances et des co-variances se nomme aussi hypothèse de Sphéricité. Elle est évaluée par le test de Mauchly. L’hypothèse nulle du test de Mauchly suppose la sphéricité.
En cas de défaut de normalité, une transformation peut être appliquée.
En cas de défaut de sphéricité, les résultats doivent être corrigés par les corrections de Huynh-Feldt ou de Greenhouse-Geisser.

 

ANOVA sur mesures répétées avec R

L’ANOVA sur mesures répétées peut être réalisée sous R avec différents packages et fonctions. J’utilise généralement la fonction aov du package stats (chargé par défaut), la fonction ezANOVA du package ez, ou plus généralement la fonction lmer() du package lme4 quipermet d’ajuster un modèle mixte.

 

La fonction ezANOVA et le test de Mauchly

La fonction ezANOVA du package ez est très pratique, car elle renvoit le test de Mauchly pour évaluer l’hypothèse de spéhricité, et propose les corrections à utiliser en cas de rejet :
Ici, le test de Mauchly ne rejette pas l’hypothèse de sphéricité (p=0.098), aucune correction n’est donc nécessaire.
L’effet propre de la variable Time est également renvoyé en sortie, dans l’élément $ANOVA. Ici la pvalue = 4.35e-20. Si l’hypothèse de Sphéricité avait été rejetée, il aurait fallu lire la pvalue correspondant à l’une p l’autre des corrections, au niveau de l’élément$Sphericity Corrections.
Le package ez permet également de réaliser une représentation graphique :
anova ezANOVA Mauchly

 

Obtenir la table de variance

Pour obtenir la table de variance, à ma connaissance, il est en revanche nécessaire d’utiliser la fonction aov , comme ceci :
Nous retrouvons bien ici, les différentes valeurs des sommes des carrés, calculées dans le chapitre des formules :
  • SCSujet = 255.7324
  • SCF = 184.6
  • SCR’=7.97

 

La fonction lmer et l’évaluation de l’hypothèse de normalité

L’ANOVA sur mesures répétées peut également être envisagée sous l’angle d’un modèle mixte, et donc être ajustée avec la fonction lmer du package lme4. Cette option permet d’évaluer très facilement la normalité des résidus, et de réaliser les comparaisons multiples.
L’ajout de l’effet aléatoire sujet se fait à l’aide du terme + (1|Sujet).
Aucune p-value n’est affichée dans la partie “Fixed effects”!
Pour les obtenir, il est nécessaire de passer par le package lmerTest (c’est une surcouche du package lme4)
Cette sortie permet d’obtenir les variances inter sujet et résiduelle (dans la partie Random effects). La variance résiduelle est égale à 0.2847. Vous pouvez retrouver cette valeur dans sortie de la fonction summary(mod1_aov) présentée précédemment, au niveau de la lignes Residuals et de la colonne Mean Sq.
Les résultats des effets fixes sont des résultats de type régression. Pour obtenir l’effet global, vous pouvez utiliser la fonction Anova du package car.
La normalité des résidus peut s’évaluer graphiquement par un qqPlot, et/ou par l’utilisation du test de Shapiro-Wilk:
anova Shapiro-Wilk

 

Comparaisons multiples

Celles-ci peuvent être obtenues à l’aide du package multcomp.

Procédure de Tukey :

La procédure de Tukey, consiste à réaliser toutes les comparaisons deux à deux :
 Ici, les moyennes sont toutes différentes deux à deux.

 

Procédure de Dunnett :

La procédure de Dunnet, consiste à réaliser tous les groupes à un groupe de référence, ici Time1 :

 

Pour aller plus loin :

Si  le sujet des ANOVA sur mesures répétées vous intéresse, je vous recommande les ressources suivantes :
  • https://ademos.people.uic.edu/Chapter21.html#1210_afex_defaults
  • http://www.pallier.org/easy-anova-with-r.html
Dans un prochain article, je vous montrerai comment réaliser une ANOVA sur mesure répétées en utilisant une approche non paramétrique. D’ici là, si vous avez d’autres routines R pour réaliser des ANOVA sur mesures répétées, n’hésitez pas à partager votre code en écrivant un commentaire.
Et si cet article vous a plu, ou vous a été utile, n’oubliez pas de le partager 😉
Crédits photos : MoteOo de Pixabay

 

Poursuivez votre lecture

Partager l'article
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

21 commentaires

  1. Gaël Répondre

    Bonjour,
    Merci pour cet article (encore) très clair.

    2 remarques:
    1. Pour éviter de faire tourner “aov” pour obtenir la table de variance, il suffit d’ajouter return_aov=TRUE lorsqu’on effectue le calcul avec ezanova:
    mod1 <- ezANOVA(dv=Taille,
    within=Time,
    wid=Sujet,
    data=tailleL,
    return_aov=TRUE)

    il est alors possible de taper:
    summary(mod1$aov)

    2. Êtes-vous sûre que le test de Tukey est adapté aux données dépendantes ? Celui-ci s'appuie sur la statistique d'écart studentisée et, de ce que j'en comprends, ne prend pas en compte le fait que les données sont acquises sur les mêmes sujets dans chaque condition de temps.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour Gaël,
      Merci pour l’astuce return.aov=TRUE !
      Concernant le point 2, je dirais qu’il s’agit d’une procédure de Tukey plutôt qu’un test de Tukey. Procédure de Tukey voulant dire que toutes les comparaisons deux à deux sont réalisées.
      Je suis assez persuadée que la fonction glht() prend en compte le caractère répété des données car les résultats obtenus avec une anova pour données indépendantes ne sont pas identiques (le pvalues sont plus élevée) car les erreurs standard sont alors plus élevées et donc les statistiques des tests plus faibles.
      > tailleL$Time <- as.factor(tailleL$Time) > library(lmerTest)
      > mod_rep <- lmer(Taille~Time+(1|Sujet), data=tailleL) > #summary(mod_rep)
      > library(multcomp)
      > mc_tukey <- glht(mod_rep,linfct=mcp(Time="Tukey") ) > summary(mc_tukey)

      Simultaneous Tests for General Linear Hypotheses

      Multiple Comparisons of Means: Tukey Contrasts

      Fit: lmer(formula = Taille ~ Time + (1 | Sujet), data = tailleL)

      Linear Hypotheses:
      Estimate Std. Error z value Pr(>|z|)
      Time2 – Time1 == 0 1.5667 0.1948 8.04 <1e-10 ***
      Time3 - Time1 == 0 4.8600 0.1948 24.94 <1e-10 ***
      Time3 - Time2 == 0 3.2933 0.1948 16.90 <1e-10 ***
      ---
      Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
      (Adjusted p values reported -- single-step method)

      > mod_ind <- lm(Taille~Time, data=tailleL) > #summary(mod_ind)
      > mc_tukey_ind <- glht(mod_ind,linfct=mcp(Time="Tukey") ) > summary(mc_tukey_ind)

      Simultaneous Tests for General Linear Hypotheses

      Multiple Comparisons of Means: Tukey Contrasts

      Fit: lm(formula = Taille ~ Time, data = tailleL)

      Linear Hypotheses:
      Estimate Std. Error t value Pr(>|t|)
      Time2 – Time1 == 0 1.567 0.915 1.712 0.21271
      Time3 – Time1 == 0 4.860 0.915 5.312 < 0.001 *** Time3 - Time2 == 0 3.293 0.915 3.599 0.00231 ** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Adjusted p values reported -- single-step method) Bonne continuation

  2. OUATTARA Répondre

    La nouvelle fonction pivot_longer du package “dplyr” ne marche pas avec ma version R 3.6.1

    Quelles sont les procédures à suivre afin que cette fonction puisse s’exécutée?

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,

      je suis très étonnée, car je suis encore en version 3.6.1 et cela fonctionne.
      Avez vous essayé les exemples de la page d’aide de la fonction pivot_longer ?
      Bonne continuation.

  3. Dany OTRON Répondre

    Merci, cet article m’a permis d’apprendre encore plus. Il est très bien rédigé également

  4. Hans BOURGEOIS Répondre

    Bonjour,
    J’ai réalisé une ANOVA, deux facteurs (Groupes-Temps) à mesures répétées.

    Mon facteur groupe est divisé en deux modalités : Controle / MVC
    Mon facteur Temps est divisé en quatre modalités : Pre T1 T2 T3

    J’observe une différence significative pour le facteur groupe, et le l’interaction groupe/temps.

    Je souhaites poursuivre mon analyse avec le test de DUNNETT, si j’applique votre code le test comparera la moyenne globale des deux modalités mélangées (MVC-CON) de mon facteur “groupe”, pour chaque modalités de T1 T2 T3. Est ce bien cela ?

    Maintenant si je souhaites comparer les moyennes séparément de mes deux modalités (CON et MVC) au cours du temps (cad MVC-Pre avec MVC-T1, MVC-Pre avec MVC-T2, MVC-Pre avec MVC-T3 puis CON-Pre avec CON-T1, CON-Pre avec CON-T2, CON-Pre avec CON-T3), comment puis je le faire ?

    Je débute en stat et sur R, j’espère avoir été clair…

    Merci pour votre travail !

  5. nicolas Répondre

    merci de ce post très agréable et utile.
    Pouvez-vous commenter en pour/contre l’anova sur mesures répétées vs les modèles mixtes?
    Il me semble que considérer la variable temps comme factorielle (cas de l’anova mais pas des modèles mixtes) peut être limitant et devrait faire préférer les modèles mixtes.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour Nicolas,

      vous avez raison l’ANOVA sur mesure répétées permet d”expliquer une réponse numérique continue en fonction d’une variable catégorielle. Si cette variable explicative est du temps, il faut donc la considérer en catégorie. En revanche, le modèle mixte est plus général, et peut être l’équivalent d’une régression linéaire (mise en relation d’une variable réponse continue et d’une variable explicative numérique continue aussi) avec mesure répétées. Si le temps est la variable prédictive, il n’est plus nécessaire de la catégoriser. Les modèles mixtes sous l’angle de la régression feront sans doute l’objet d’un prochain article.
      Bonne continuation

  6. Pascal Biauce Répondre

    Bonjour,
    Je vais sans doute bientôt passer de SAS à R.
    Bon outil pour gagner beaucoup de temps.
    Je vais largement partager avec mes collègues.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour Pascal,

      et si vous avez besoin d’un accompagnement plus important pour faciliter ce passage de SAS à R, je peux vous proposer une formation intra-entreprise sur mesure. N’hésitez pas à prendre contact avec moi via le formulaire de contact.
      Bonne continuation.

  7. Eve-Line Bérubé Beaulieu Répondre

    Bonjour,

    Merci beaucoup pour ce tutoriel. J’ai utilisé la fonction lmerTest::lmer, mais j’ai de la difficulté à interpréter les résultats:

    Fixed effects:
    Estimate Std. Error df t value Pr(>|t|)
    (Intercept) 0.53418 0.09442 8.74820 5.658 0.000345 ***
    condition1 0.37883 0.12876 42.25009 2.942 0.005271 **
    condition2 -0.04740 0.12876 42.25009 -0.368 0.714589
    pairing1 -0.16053 0.09113 44.45734 -1.762 0.085026 .
    condition1:pairing1 0.01961 0.12876 42.25009 0.152 0.879680
    condition2:pairing1 0.02261 0.12876 42.25009 0.176 0.861437

    Qu’est-ce que signifie le fait que seul intercept et condition1 soit significatif?

    Merci

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,

      la significativité de l’intercept n’a pas d’intérêt.
      Puisque les intercations sont NS, alors on peut regarder les effets propres des variables. Condition1 est significative, cela signifie que la moyenne associée à condition1 est significativement plus grande que celle associée à la condition de référence.
      Bonne continuation

      • Eve-Line Bérubé Beaulieu Répondre

        Merci pour votre réponse!

        Encore une petite chose m’embête: qu’est-ce que R considère comme condition 1 et condition de référence? Mes conditions sont nommés S,B et T, et ils n’aparraissent jamais comme tel dans mes résultats. Mes données sont pourtant organisées de la même façon que les vôtres…

  8. Sidy Répondre

    Bonjour Claire,
    Article très intéressant et surtout bien expliqué merci beaucoup. Concernant ces données répétées peut-on appliquer la même démarche dans le cas où nous n’avons pas le même nombre d’observations aux différents temps.
    Merci

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,

      je n’ai pas essayé mais je pense que soit R va renvoyer une erreur, soit il va supprimer les lignes qui ont une donnée manquante.
      Bonne continuation.

  9. Aurélien Répondre

    Bonjour,

    Si nous utilisons un modele lineaire mixte “lmer” à 2 facteurs, faut il parametrer le modele avec les contrastes (contrasts=list(x1=contr.sum, x2=contr.sum)) et ensuite faire une Anova du modele de type III ?
    Merci

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour Aurélien,

      oui c’est ça.
      Bonne continuation.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *