ANOVA à mesures répétées en R : comparer des moyennes dans le temps
Tester si les moyennes des mêmes sujets diffèrent sur trois points temporels ou plus — avec rstatix, la méthode moderne, en direct dans votre navigateur
Apprenez à exécuter une ANOVA à mesures répétées à un facteur en R — le test intra-sujets qui compare trois mesures ou plus prises sur les mêmes individus. Utilisez anova_test() de rstatix pour un résultat ordonné avec une taille d’effet ges et la correction automatique de sphéricité de Greenhouse-Geisser, vérifiez les hypothèses de valeurs aberrantes, de normalité et de sphéricité (Mauchly), puis enchaînez avec des t-tests appariés par paires sur une boîte à moustaches ggpubr. Éditez et exécutez chaque exemple en direct.
Date de publication
23 juin 2026
Modifié
11 juillet 2026
AstucePoints clés
Une ANOVA à mesures répétées à un facteur compare trois moyennes ou plus mesurées sur les mêmes sujets — l’extension intra-sujets du t-test apparié. Mesurer les mêmes personnes supprime la variation inter-sujets, ce qui la rend plus puissante.
Utilisez anova_test(dv, wid, within) de rstatix : elle renvoie le F-test, la taille d’effet ges, le test de Mauchly de sphéricité, et les p-values corrigées par Greenhouse-Geisser / Huynh-Feldt — le tout en un seul appel.
La sphéricité est l’hypothèse supplémentaire essentielle : les variances des différences entre chaque paire de points temporels doivent être égales. get_anova_table() applique la correction de Greenhouse-Geisser automatiquement lorsqu’elle est violée.
Vérifiez les hypothèses : aucune valeur aberrante extrême (identify_outliers()) et normalité par point temporel (shapiro_test()). Si elles échouent, utilisez plutôt le test de Friedman, non paramétrique.
Faites suivre un résultat significatif de t-tests appariés par paires (pairwise_t_test(..., paired = TRUE, p.adjust.method = "bonferroni")), tracés sur une boîte à moustaches ggpubr avec stat_pvalue_manual().
Introduction
Une ANOVA à mesures répétées à un facteur répond à une question que l’ANOVA ordinaire ne peut pas traiter : les mêmes sujets ont-ils changé sur trois points temporels ou conditions, voire davantage ? Comme chaque personne est mesurée de façon répétée — par exemple l’estime de soi à trois moments d’un régime — le plan est intra-sujets, et le test est l’extension du t-test pour échantillons appariés au-delà de deux mesures.
L’avantage de mesurer les mêmes personnes, c’est la puissance : chaque sujet agit comme son propre témoin, de sorte que le test supprime les différences inter-sujets (certaines personnes ont simplement des valeurs plus élevées que d’autres) et teste directement le changement intra-sujets. Cette leçon déroule l’ensemble du flux de travail à la manière moderne et compatible avec le pipe de rstatix — anova_test() avec les arguments dv/wid/within — en utilisant les données intégrées datarium::selfesteem, et montre les vérifications d’hypothèses (dont la vérification supplémentaire, la sphéricité) qui vous disent si vous pouvez vous fier au F-test.
Note
Hypothèses des mesures répétées.Nulle : les moyennes à tous les points temporels sont égales. Alternative : au moins une moyenne de point temporel diffère. Avec exactement deux points temporels, l’ANOVA à mesures répétées et le t-test apparié donnent des résultats identiques.
Comment fonctionne l’ANOVA à mesures répétées
Comme une ANOVA ordinaire, elle décompose la variation de la variable de réponse — mais elle en isole une troisième part :
Variance inter-sujets — l’écart global entre les sujets. Une ANOVA à mesures répétées retire cette part du terme d’erreur (c’est de là que vient sa puissance supplémentaire).
Variance intra-sujets — décomposée en l’effet du facteur temps (ce que nous testons) et le résidu restant (l’interaction sujet × temps).
La statistique F est le rapport de l’effet du temps à ce résidu.
Comme les mêmes sujets apparaissent à chaque point temporel, les mesures sont corrélées, et c’est pourquoi le test porte une hypothèse supplémentaire — la sphéricité — que l’ANOVA inter-sujets ordinaire n’a pas.
NoteLes mathématiques (optionnel)
Dans un plan intra-sujets, la variation totale (\(SS_T\)) est décomposée de sorte que l’effet sujet (\(SS_S\)) soit retiré du terme d’erreur — laissant l’effet du temps (\(SS_W\)) et le résidu (\(SS_R\)) :
\[SS_T = SS_S + SS_W + SS_R\]
Extraire \(SS_S\) est exactement ce qui confère au test sa puissance supplémentaire — le niveau de base de chaque personne ne gonfle plus l’erreur. La statistique F pour l’effet du temps est alors le rapport du carré moyen du temps au carré moyen du résidu (sujet × temps) :
\[F = \frac{MS_W}{MS_R}\]
avec \(df_W = k - 1\) pour \(k\) points temporels et \(df_R = (k - 1)(n - 1)\) pour \(n\) sujets. Lorsque la sphéricité est violée, les deux degrés de liberté sont multipliés par l’epsilon de Greenhouse-Geisser \(\hat{\varepsilon}\) avant de lire la p-value.
Préparation des données
Nous utilisons le jeu de données selfesteem du package datarium — le score d’estime de soi pour 10 individus mesurés à trois points temporels (t1, t2, t3) durant un régime. Il se présente au format large (une ligne par sujet, une colonne par temps), mais rstatix a besoin du format long (une ligne par mesure). Nous le remettons en forme au format long avec base R — en empilant les trois colonnes de temps en une seule colonne score et un facteur time — en conservant id et time comme facteurs (aucun package supplémentaire nécessaire) :
# A tibble: 3 × 4
id t1 t2 t3
<int> <dbl> <dbl> <dbl>
1 1 4.01 5.18 7.11
2 2 2.56 6.91 6.31
3 3 3.24 4.44 9.78
selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))head(selfesteem, 3)
id time score
1 1 t1 4.005027
2 2 t1 2.558124
3 3 t1 3.244241
La table longue comporte trois colonnes — id (le sujet), time (le facteur intra-sujets, t1/t2/t3) et score (la variable de réponse). Chaque bloc ci-dessous reconstruit cette table longue afin de s’exécuter de façon autonome.
Regardez d’abord les données
Toujours résumer, puis tracer, avant de tester. Posez d’abord les chiffres sur la table avec get_summary_stats() de rstatix — la moyenne et l’écart-type à chaque point temporel :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))selfesteem %>%group_by(time) %>%get_summary_stats(score, type ="mean_sd")
# A tibble: 3 × 5
time variable n mean sd
<fct> <fct> <dbl> <dbl> <dbl>
1 t1 score 10 3.14 0.552
2 t2 score 10 4.93 0.863
3 t3 score 10 7.64 1.14
À présent, visualisez-le. Une boîte à moustaches ggpubr du score par time, avec la p-value globale de l’ANOVA et les crochets de comparaison par paires de t appariés affichés sur le panneau, montre la trajectoire d’un coup d’œil :
library(rstatix)library(ggpubr)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))# Pairwise paired t-tests, positioned for the bracketspwc <- selfesteem %>%pairwise_t_test(score ~ time, paired =TRUE, p.adjust.method ="bonferroni") %>%add_xy_position(x ="time")res.aov <-anova_test(data = selfesteem, dv = score, wid = id, within = time)ggboxplot(selfesteem, x ="time", y ="score", fill ="time", palette ="jco",xlab ="Time point", ylab ="Self-esteem score") +stat_pvalue_manual(pwc, hide.ns =TRUE, tip.length =0.01) +labs(subtitle =get_test_label(res.aov, detailed =TRUE))
L’estime de soi grimpe régulièrement de t1 à t3, et les crochets signalent quels points temporels diffèrent. L’image suggère un changement réel au fil du régime — confirmons-le avec le test, après les hypothèses.
La boîte à moustaches masque la véritable force du plan : ce sont les mêmes sujets qui sont suivis dans le temps. Reliez les trois mesures de chaque sujet pour voir les trajectoires individuelles — la plupart des lignes montant ensemble est exactement le changement intra-sujets qu’une ANOVA à mesures répétées est conçue pour détecter :
library(ggpubr)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))ggplot(selfesteem, aes(x = time, y = score, group = id)) +geom_line(color ="#3a86d4", alpha =0.6) +geom_point(color ="#3a86d4", size =1.6) +labs(x ="Time point", y ="Self-esteem score") +theme_minimal()
Vérifiez les hypothèses
Une ANOVA à mesures répétées repose sur trois hypothèses à vérifier (au-delà de l’indépendance des sujets) : aucune valeur aberrante extrême, normalité de la variable de réponse à chaque point temporel, et sphéricité des différences. Les deux premières précèdent le test ; la sphéricité est rapportée par le test.
Aucune valeur aberrante extrême
identify_outliers() signale les points au-delà des moustaches de la boîte par groupe — is.extreme == TRUE marque ceux qui peuvent fausser le résultat :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))selfesteem %>%group_by(time) %>%identify_outliers(score)
# A tibble: 2 × 5
time id score is.outlier is.extreme
<fct> <fct> <dbl> <lgl> <lgl>
1 t1 6 2.05 TRUE FALSE
2 t2 2 6.91 TRUE FALSE
Il n’y avait aucune valeur aberrante extrême. Si vous en avez une, il peut s’agir d’une erreur de saisie ; vous pouvez réexécuter l’ANOVA avec et sans elle pour évaluer son influence, ou utiliser une ANOVA robuste (le package WRS2).
Normalité par point temporel
La variable de réponse doit être approximativement normale à chaque point temporel. Testez-la avec Shapiro-Wilk par groupe (p > 0.05 → pas d’écart à la normalité) :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))selfesteem %>%group_by(time) %>%shapiro_test(score)
# A tibble: 3 × 4
time variable statistic p
<fct> <chr> <dbl> <dbl>
1 t1 score 0.967 0.859
2 t2 score 0.876 0.117
3 t3 score 0.923 0.380
Le score est distribué normalement à chaque point temporel (tous les p > 0.05). Confortez-le par un Q-Q plot par point temporel — les points doivent épouser la droite de référence :
library(ggpubr)library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))ggqqplot(selfesteem, "score", facet.by ="time")
Sphéricité — le test de Mauchly (géré pour vous)
La sphéricité est l’hypothèse propre aux plans à mesures répétées : les variances des différences entre chaque paire de points temporels doivent être égales. Elle est testée par le test de sphéricité de Mauchly, et vous ne l’exécutez pas séparément — anova_test() la rapporte automatiquement en parallèle du F-test. Surtout, lorsque la sphéricité est violée, get_anova_table() applique la correction de Greenhouse-Geisser automatiquement (en ajustant les degrés de liberté), de sorte que la p-value que vous lisez est déjà corrigée. Vous verrez tout cela dans la section suivante.
Exécuter l’ANOVA à mesures répétées
anova_test() prend les données plus trois arguments — dv (la variable de réponse), wid (l’identifiant de sujet) et within (le facteur intra-sujets) — et renvoie une liste avec l’ANOVA, le test de Mauchly et les corrections de sphéricité :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))res.aov <-anova_test(data = selfesteem, dv = score, wid = id, within = time)res.aov
ANOVA Table (type III tests)
$ANOVA
Effect DFn DFd F p p<.05 ges
1 time 2 18 55.469 2.01e-08 * 0.829
$`Mauchly's Test for Sphericity`
Effect W p p<.05
1 time 0.551 0.092
$`Sphericity Corrections`
Effect GGe DF[GG] p[GG] p[GG]<.05 HFe DF[HF] p[HF]
1 time 0.69 1.38, 12.42 2.16e-06 * 0.774 1.55, 13.94 6.03e-07
p[HF]<.05
1 *
L’affichage comporte trois parties : la table d’ANOVA (F, DFn/DFd, p, et ges — la taille d’effet eta-carré généralisée), le test de Mauchly de sphéricité (uniquement affiché pour les facteurs à > 2 niveaux, la sphéricité étant automatique pour deux), et les corrections de sphéricité (epsilons de Greenhouse-Geisser GGe et de Huynh-Feldt HFe avec leurs p-values corrigées).
get_anova_table() renvoie la table unique que vous devriez rapporter — automatiquement la ligne corrigée lorsque le test de Mauchly est significatif, la ligne standard sinon :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))res.aov <-anova_test(data = selfesteem, dv = score, wid = id, within = time)get_anova_table(res.aov)
ANOVA Table (type III tests)
Effect DFn DFd F p p<.05 ges
1 time 2 18 55.469 2.01e-08 * 0.829
Ici, l’estime de soi diffère significativement entre les trois points temporels, F(2, 18) = 55,5, p < .0001, et ges est grande (≈ 0,83) — time explique la majeure partie de la variation intra-sujets. Selon les conventions de Cohen pour ges, un petit effet vaut ≈ 0,01, un effet moyen ≈ 0,06 et un grand effet ≥ 0,14, donc 0,83 est exceptionnellement grand. Le test de Mauchly était non significatif, donc la sphéricité tenait et aucune correction n’était nécessaire ; s’il avait été violé, get_anova_table() aurait renvoyé à la place la ligne corrigée par Greenhouse-Geisser.
Astuce
Exécutez-le sur vos propres données. Chargez votre fichier large — mydata <- read.csv("my-file.csv") — remettez en forme les colonnes répétées au format long (base R reshape(), ou tidyr::pivot_longer() si vous utilisez le tidyverse), faites des colonnes id et time des facteurs, puis appelez anova_test(data = mydata, dv = score, wid = id, within = time).
Note
La voie classique en base R. Vous pouvez ajuster le même modèle avec aov(score ~ time + Error(id/time), data = selfesteem) et le lire avec summary(). Il calcule le même F-test, mais il ne rapporte pas le test de Mauchly et n’applique pas la correction de sphéricité à votre place — la raison pour laquelle anova_test() est ici la solution principale. N’utilisez base R que lorsque vous avez besoin de l’objet aov brut.
Choisir la correction de sphéricité : Greenhouse-Geisser ou Huynh-Feldt
Lorsque la sphéricité est violée, vous corrigez le F-test, et le bloc Sphericity Corrections vous offre deux options — Greenhouse-Geisser (GGe) et Huynh-Feldt (HFe). Les deux fonctionnent par le biais d’epsilon (ε), un nombre qui mesure à quel point les données s’écartent de la sphéricité : ε = 1 signifie aucun écart du tout, et plus ε descend en dessous de 1, plus la violation est grave. Chaque correction multiplie les degrés de liberté par ε avant de lire la p-value — un ε plus petit réduit davantage les degrés de liberté, rendant le test plus conservateur. (La statistique F elle-même ne change jamais ; seuls les degrés de liberté et la p-value changent.)
Les deux estimateurs font des compromis dans des directions opposées : Greenhouse-Geisser est le plus conservateur (il peut surcorriger lorsque le vrai ε est proche de 1), tandis que Huynh-Feldt est le moins conservateur (il peut sous-corriger lorsque ε est petit). La règle empirique standard choisit entre les deux selon l’epsilon de Greenhouse-Geisser :
ε < 0.75 → utilisez la correction de Greenhouse-Geisser (le choix le plus sûr en cas de forte violation).
ε > 0.75 → utilisez la correction de Huynh-Feldt (Greenhouse-Geisser est trop conservateur ici).
Ce seuil de 0.75 est la recommandation classique de la monographie ANOVA: Repeated Measures de Girden (Girden, E. R. (1992). ANOVA: Repeated Measures. Newbury Park, CA: Sage), et c’est ce que la plupart des logiciels de statistique implémentent.
Par défaut, get_anova_table() utilise correction = "auto" : elle applique la correction de Greenhouse-Geisser lorsque le test de Mauchly est significatif et laisse la table non corrigée lorsqu’il ne l’est pas. Pour suivre vous-même la règle de l’ε, passez correction explicitement — "GG" (Greenhouse-Geisser), "HF" (Huynh-Feldt) ou "none" (le F-test non corrigé) :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))res.aov <-anova_test(data = selfesteem, dv = score, wid = id, within = time)get_anova_table(res.aov, correction ="GG") # Greenhouse-Geisser
ANOVA Table (type III tests)
Effect DFn DFd F p p<.05 ges
1 time 1.38 12.42 55.469 2.16e-06 * 0.829
ANOVA Table (type III tests)
Effect DFn DFd F p p<.05 ges
1 time 2 18 55.469 2.01e-08 * 0.829
Comparez les trois lignes. Le test non corrigé conserve les degrés de liberté complets (DFn = 2, DFd = 18) ; Greenhouse-Geisser les multiplie tous deux par son epsilon (ε ≈ 0.69 ici) jusqu’à 1.38 et 12.42, et Huynh-Feldt par son epsilon légèrement plus grand (ε ≈ 0.77) jusqu’à 1.55 et 13.94. Des degrés de liberté plus petits lisent le même F = 55.5 face à une référence plus stricte, si bien que la p-value grimpe de 2e-08 (non corrigée) à 2e-06 (GG) — toujours massivement significative car l’effet est énorme. Sur un résultat limite, le choix de la correction peut faire basculer le verdict, ce qui est précisément pourquoi la règle de l’ε compte. Notez qu’ici l’ε de Greenhouse-Geisser (0.69) se situe en dessous de 0.75, donc la règle favoriserait la ligne Greenhouse-Geisser si vous corrigiez — mais le test de Mauchly était non significatif, donc "auto" rapporte la table non corrigée.
Post-hoc : quels points temporels diffèrent ?
Un test omnibus significatif indique que certaines moyennes de points temporels ont changé — pour trouver quelles paires, exécutez des t-tests appariés par paires entre les niveaux de temps, avec une correction pour comparaisons multiples (bonferroni) :
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))pwc <- selfesteem %>%pairwise_t_test( score ~ time, paired =TRUE,p.adjust.method ="bonferroni" )pwc
Chaque ligne est une paire de points temporels. Lisez p.adj (la p-value ajustée par Bonferroni) pour voir quelles comparaisons sont significatives — ici, chaque différence par paire l’est, donc l’estime de soi a augmenté significativement à chaque étape du régime. L’argument paired = TRUE est essentiel : il apparie les mesures de chaque sujet, correspondant au plan intra-sujets.
Astuce
Pourquoi apparié ? Comme les mêmes sujets sont mesurés à chaque point temporel, un t-test non apparié gaspillerait l’appariement et perdrait la puissance du plan. Passez toujours paired = TRUE pour un post-hoc intra-sujets.
Rapporter le résultat
Une rédaction de style publication réunit le résultat omnibus, la taille d’effet et les comparaisons par paires significatives en un seul énoncé — par exemple :
Une ANOVA à mesures répétées à un facteur a montré que l’estime de soi différait significativement entre les trois points temporels, F(2, 18) = 55.5, p < .0001, η² généralisé = 0.83. Les t-tests appariés par paires avec un ajustement de Bonferroni ont trouvé chaque paire significativement différente (tous les p.adj < .05), l’estime de soi augmentant de t1 à t2 à t3.
Si le test de Mauchly avait été significatif, vous ajouteriez une note de sphéricité — par ex. « l’hypothèse de sphéricité a été violée (W de Mauchly, p < .05), donc les degrés de liberté ont été corrigés avec l’estimation de Greenhouse-Geisser » — et citeriez le F et les degrés de liberté corrigés.
Essayez en direct
Exécutez le flux de travail complet de bout en bout sur les données selfesteem. Modifiez les colonnes, le jeu de données ou la méthode post-hoc et réexécutez ; le bac à sable démarre au premier Run.
🟢 Avec un agent IA
Demandez à Prova« J’ai mesuré les mêmes sujets à trois points temporels — exécute une ANOVA à mesures répétées sur mes données, vérifie la sphéricité et dis-moi quels points temporels diffèrent » — elle répond avec du code rstatix que vous pouvez exécuter sur vos propres données, puis vous aide à lire le F-test, la correction de sphéricité et la table post-hoc appariée. The runtime is the judge.Demander à Prova →
Problèmes courants
anova_test() génère une erreur avec « wid » ou des valeurs en double. Chaque sujet doit apparaître une fois par niveau du facteur intra, et wid doit identifier le sujet. Assurez-vous d’avoir remis en forme au format long et que id est un facteur — un id numérique ou des mesures manquantes brisent le plan.
Il n’y a pas de test de Mauchly ni de correction de sphéricité dans la sortie. La sphéricité ne s’applique que lorsque le facteur within a plus de deux niveaux — avec exactement deux points temporels, elle tient automatiquement, donc rstatix l’omet. C’est attendu, et non un bug.
Mes paires post-hoc semblent trop significatives / non appariées. Vérifiez que vous avez passé paired = TRUE à pairwise_t_test(). Sans cela, vous exécutez des t-tests non appariés, qui ignorent l’appariement intra-sujets, perdent en puissance et ne correspondent pas à l’ANOVA que vous avez rapportée.
Questions fréquentes
NoteQu’est-ce qu’une ANOVA à mesures répétées ?
Une ANOVA à mesures répétées teste si les moyennes de trois mesures ou plus prises sur les mêmes sujets diffèrent — par exemple les mêmes personnes mesurées à trois points temporels. Comme chaque sujet est son propre témoin, elle supprime la variation inter-sujets et est plus puissante que la comparaison de groupes indépendants. En rstatix : anova_test(data = mydata, dv = score, wid = id, within = time).
NoteQuelle est la différence entre une ANOVA à mesures répétées et une ANOVA à un facteur ?
Une ANOVA à un facteur (inter-sujets) compare des groupes différents et indépendants ; une ANOVA à mesures répétées (intra-sujets) compare les mêmes sujets mesurés plusieurs fois. Le plan à mesures répétées retire le niveau de référence de chaque sujet du terme d’erreur, de sorte qu’elle détecte le changement intra-sujets avec plus de puissance — mais elle ajoute l’hypothèse de sphéricité que l’ANOVA inter-sujets n’a pas.
NoteQu’est-ce que la sphéricité, et qu’est-ce que le test de Mauchly ?
La sphéricité signifie que les variances des différences entre chaque paire de niveaux intra-sujets sont égales — la version mesures répétées de l’égalité des variances. Le test de Mauchly la vérifie ; un résultat significatif (p < 0.05) signifie que la sphéricité est violée. La fonction anova_test() de rstatix rapporte le test de Mauchly automatiquement et, lorsqu’il est violé, get_anova_table() applique la correction de Greenhouse-Geisser aux degrés de liberté à votre place.
NoteQuel test post-hoc utiliser après une ANOVA à mesures répétées ?
Utilisez des t-tests appariés par paires entre les niveaux intra-sujets, avec une correction de multiplicité : pairwise_t_test(score ~ time, paired = TRUE, p.adjust.method = "bonferroni"). L’argument paired = TRUE est essentiel — il respecte le plan intra-sujets. N’exécutez le post-hoc qu’après un test omnibus significatif.
NoteEt si mes données ne sont pas normales ou comportent des valeurs aberrantes extrêmes ?
Si la normalité échoue à un ou plusieurs points temporels, ou si vous avez des valeurs aberrantes extrêmes que vous ne pouvez justifier, utilisez le test de Friedman non paramétrique — l’alternative basée sur les rangs à l’ANOVA à mesures répétées à un facteur — suivi de tests de Wilcoxon signés-rangs par paires. Pour les valeurs aberrantes dues à des erreurs, corrigez-les ou supprimez-les ; pour les conserver, une ANOVA robuste (le package WRS2) est une option.
Testez vos connaissances
ImportantPratique
Exécutez-la. Dans la cellule en direct ci-dessous, remplissez les blancs pour exécuter l’ANOVA à mesures répétées de score selon time sur les données selfesteem, puis affichez la table prête à rapporter. Le changement au fil du temps est-il significatif ?
Conceptuel. Le test de Mauchly dans votre sortie est significatif (p < 0.05). Quelle ligne de l’ANOVA devriez-vous rapporter, et qu’a fait le logiciel à vos degrés de liberté ?
NoteIndice
La variable de réponse est score, l’identifiant de sujet est id, et le facteur intra-sujets est time. Lisez la colonne p de get_anova_table() pour la significativité. Pour la question 2, rappelez-vous ce que le test de Mauchly vérifie et ce que fait get_anova_table() lorsqu’il est violé.
NoteSolution
library(rstatix)data("selfesteem", package ="datarium")selfesteem <-data.frame(id =factor(rep(selfesteem$id, times =3)),time =factor(rep(c("t1", "t2", "t3"), each =nrow(selfesteem))),score =c(selfesteem$t1, selfesteem$t2, selfesteem$t3))res.aov <-anova_test(data = selfesteem, dv = score, wid = id, within = time)get_anova_table(res.aov)#> F(2, 18) = 55.5, p < .0001 → highly significant change across time.
Pour la question 2 : un test de Mauchly significatif signifie que la sphéricité est violée, donc vous rapportez la ligne corrigée pour la sphéricité — get_anova_table() la renvoie automatiquement. Le logiciel multiplie les degrés de liberté (DFn, DFd) par l’epsilon de Greenhouse-Geisser, ce qui les abaisse et rend le test plus conservateur.
Quel test, quand ?
Choisissez le test à partir de votre plan, et non l’inverse :
Trois mesures répétées ou plus sur les mêmes sujets → ANOVA à mesures répétées à un facteur (cette leçon).
Exactement deux points temporels sur les mêmes sujets → le t-test apparié — l’ANOVA à mesures répétées s’y réduit.
Groupes indépendants (sujets différents par condition) → l’ANOVA à un facteur inter-sujets.
Normalité ou sphéricité fortement violée → le test de Friedman non paramétrique, l’alternative fondée sur les rangs à l’ANOVA à mesures répétées.
Conclusion
Vous savez maintenant exécuter et interpréter une ANOVA à mesures répétées à un facteur en R à la manière ordonnée de rstatix : remettez en forme les données larges au format long avec id et time comme facteurs, puis anova_test(dv = score, wid = id, within = time) pour le F-test, la taille d’effet ges, et la gestion automatique de la sphéricité. Vérifiez les hypothèses — aucune valeur aberrante extrême (identify_outliers), normalité par point temporel (shapiro_test), et sphéricité (Mauchly, corrigée par get_anova_table()) — lisez le F-test omnibus, puis enchaînez un résultat significatif avec des t-tests appariés par paires. Lorsque les hypothèses échouent, le test de Friedman non paramétrique est la solution de repli.
Leçons connexes
ANOVA à un facteur en R — la version inter-sujets, pour des groupes indépendants. · ANOVA mixte — combiner un facteur intra-sujets et un facteur inter-sujets. · Test de Friedman — l’alternative non paramétrique lorsque la normalité échoue.
Chaque résultat de cette page a été produit par le code montré, exécuté au moment du build contre un environnement R figé — modifiez n’importe quel bloc et faites Run pour le reproduire vous-même.
@online{2026,
author = {},
title = {ANOVA à mesures répétées en R : comparer des moyennes dans le
temps},
date = {2026-06-23},
url = {https://www.datanovia.com/learn/biostatistics/anova/repeated-measures-anova-in-r},
langid = {fr}
}
Comment fonctionne l’ANOVA à mesures répétées
Comme une ANOVA ordinaire, elle décompose la variation de la variable de réponse — mais elle en isole une troisième part :
Comme les mêmes sujets apparaissent à chaque point temporel, les mesures sont corrélées, et c’est pourquoi le test porte une hypothèse supplémentaire — la sphéricité — que l’ANOVA inter-sujets ordinaire n’a pas.
Dans un plan intra-sujets, la variation totale (\(SS_T\)) est décomposée de sorte que l’effet sujet (\(SS_S\)) soit retiré du terme d’erreur — laissant l’effet du temps (\(SS_W\)) et le résidu (\(SS_R\)) :
\[SS_T = SS_S + SS_W + SS_R\]
Extraire \(SS_S\) est exactement ce qui confère au test sa puissance supplémentaire — le niveau de base de chaque personne ne gonfle plus l’erreur. La statistique F pour l’effet du temps est alors le rapport du carré moyen du temps au carré moyen du résidu (sujet × temps) :
\[F = \frac{MS_W}{MS_R}\]
avec \(df_W = k - 1\) pour \(k\) points temporels et \(df_R = (k - 1)(n - 1)\) pour \(n\) sujets. Lorsque la sphéricité est violée, les deux degrés de liberté sont multipliés par l’epsilon de Greenhouse-Geisser \(\hat{\varepsilon}\) avant de lire la p-value.