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 rstatixanova_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 :

  1. 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).
  2. 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).
  3. 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.

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) :

library(rstatix)

data("selfesteem", package = "datarium")
head(selfesteem, 3)
# 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 brackets
pwc <- 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))

A boxplot of self-esteem score at three time points (t1, t2, t3) measured on the same 10 subjects. Scores rise clearly from t1 to t3; the overall repeated measures ANOVA p-value and the three pairwise paired-t comparison brackets are printed above the boxes.

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()

A line plot with one line per subject connecting their self-esteem score at t1, t2 and t3; nearly every subject's line rises from t1 to t3, showing a consistent within-subject increase.

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")

Normal Q-Q plots of self-esteem score faceted by time point (t1, t2, t3); within each panel the points fall close to the 45-degree reference line inside the shaded confidence band, indicating approximately normal data at each 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
get_anova_table(res.aov, correction = "HF")     # Huynh-Feldt
ANOVA Table (type III tests)

  Effect  DFn   DFd      F        p p<.05   ges
1   time 1.55 13.94 55.469 6.03e-07     * 0.829
get_anova_table(res.aov, correction = "none")   # uncorrected F-test
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
# A tibble: 3 × 10
  .y.   group1 group2    n1    n2 statistic    df         p   p.adj p.adj.signif
* <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>     <dbl>   <dbl> <chr>       
1 score t1     t2        10    10     -4.97     9   7.72e-4 2.32e-3 **          
2 score t1     t3        10    10    -13.2      9   3.34e-7 1.00e-6 ****        
3 score t2     t3        10    10     -4.87     9   8.86e-4 2.66e-3 **          

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

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).

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.

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.

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.

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

  1. 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 ?
  2. 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é ?

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é.

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 sujetsANOVA à 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

Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série ANOVA en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“ANOVA à mesures répétées en R : comparer des moyennes dans le temps.” 2026. June 23. https://www.datanovia.com/learn/biostatistics/anova/repeated-measures-anova-in-r.