ANCOVA en R : comparer des moyennes ajustées sur une covariable

L’analyse de covariance à la manière moderne — comparez des moyennes de groupes ajustées tout en contrôlant une covariable continue, vérifiez les hypothèses de l’ANCOVA et menez les comparaisons post-hoc

Apprenez à mener une ANCOVA (analyse de covariance) à un et à deux facteurs en R avec rstatix. Comparez des moyennes de groupes ajustées tout en contrôlant une covariable, vérifiez chaque hypothèse de l’ANCOVA — linéarité, homogénéité des pentes de régression, normalité des résidus, égalité des variances et valeurs aberrantes — calculez les moyennes ajustées (moyennes marginales estimées), menez les comparaisons post-hoc de Bonferroni, et placez les p-value sur le graphique.

Date de publication

23 juin 2026

Modifié

12 juillet 2026

AstucePoints clés
  • L’ANCOVA (analyse de covariance) compare des moyennes de groupes sur une variable réponse après ajustement sur une covariable continue — elle répond à la question « les groupes diffèrent-ils une fois les conditions égalisées ? »
  • Menez-la avec rstatix anova_test(outcome ~ covariate + group) — la covariable vient en premier (on retire son effet avant de tester le groupe), puis lisez les moyennes ajustées avec get_emmeans().
  • L’ANCOVA ajoute deux hypothèses à la liste de l’ANOVA : une relation linéaire entre covariable et résultat dans chaque groupe, et l’homogénéité des pentes de régression (pas d’interaction covariable × groupe).
  • Faites suivre un effet de groupe significatif de comparaisons par paires avec emmeans_test() sur les moyennes ajustées, corrigées par Bonferroni — puis tracez les moyennes ajustées avec les p-value dessus.
  • Une ANCOVA à deux facteurs ajuste sur une covariable tout en testant deux facteurs et leur interaction ; une interaction significative se décompose à l’aide des effets simples principaux, exactement comme dans une ANOVA à deux facteurs.

Introduction

L’ANCOVA — analyse de covariance — compare les moyennes d’une variable réponse entre des groupes tout en contrôlant une ou plusieurs variables continues, appelées covariables. Elle combine ANOVA et régression : l’effet de la covariable est retiré d’abord, et les groupes sont comparés sur les moyennes ajustées qui subsistent. Une ANCOVA à un facteur est une ANOVA à un facteur plus une covariable ; une ANCOVA à deux facteurs ajoute un second facteur et l’interaction entre eux.

Le scénario classique : une équipe teste si un programme d’exercice réduit l’anxiété, mais les participants partent de différents niveaux d’anxiété de référence — et toute amélioration dépend vraisemblablement de votre point de départ. L’ANCOVA compare l’anxiété post-test des groupes d’exercice après ajustement sur cette référence, afin que la différence entre groupes ne soit pas simplement le reflet de qui a commencé plus serein. Cette leçon déroule le flux de travail complet avec rstatix (avec, à côté, l’aov() de base R), en utilisant les jeux de données anxiety et stress, et couvre les cas à un et à deux facteurs.

Note

Hypothèses de l’ANCOVA (à un facteur). H₀ : après ajustement sur la covariable, les moyennes de groupes ajustées sont égales. Hₐ : au moins une moyenne de groupe ajustée diffère. La covariable n’est pas l’objet du test — elle est retirée afin que la comparaison entre groupes soit équitable.

Avertissement

Hypothèses de l’ANCOVA — vérifiez-les avant de faire confiance au test. Au-delà de l’indépendance des observations : une relation linéaire entre la covariable et le résultat dans chaque groupe ; l’homogénéité des pentes de régression (l’interaction covariable × groupe n’est pas significative — les droites sont parallèles) ; des résidus distribués normalement ; une variance résiduelle égale entre les groupes (homoscédasticité) ; et aucune valeur aberrante extrême (résidus standardisés dans ±3). En cas d’échec marqué, utilisez une ANCOVA robuste (paquet WRS2).

ANCOVA à un facteur

Les données : trois groupes d’exercice, ajustement sur la référence

Nous utilisons le jeu de données anxiety de datarium : le score d’anxiété de personnes réparties en trois groupes d’exercice physique (grp1 faible, grp2 modéré, grp3 élevé), mesuré avant et après un programme de six mois. Nous prenons le score pré-test comme covariable (pretest) et le score post-test comme résultat (posttest), et demandons si les groupes diffèrent au post-test une fois la référence prise en compte. Préparez les colonnes avec base R :

library(rstatix)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19          # one edited value, as in the source example

set.seed(123)
anx %>% sample_n_by(group, size = 1)
# A tibble: 3 × 4
  id    group pretest posttest
  <fct> <fct>   <dbl>    <dbl>
1 15    grp1     19.8     19.4
2 30    grp2     19.3     17.7
3 33    grp3     15.5     11  

Vérifiez les hypothèses

Linéarité — covariable vs résultat, par groupe

L’ANCOVA suppose que la covariable et le résultat sont liés linéairement au sein de chaque groupe. Un nuage de points groupé avec une droite de régression par groupe est la vérification — des droites à peu près rectilignes et de pentes similaires sont ce que vous recherchez :

library(rstatix)
library(ggpubr)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

ggscatter(
  anx, x = "pretest", y = "posttest", color = "group", palette = "jco",
  add = "reg.line"
) +
  stat_regline_equation(aes(label = after_stat(rr.label), color = group))

A scatter plot of post-test against pre-test anxiety score with one colour and regression line per exercise group; within each group the points follow a straight line, and the three lines have visibly similar slopes.

La relation est linéaire dans chaque groupe.

Homogénéité des pentes de régression

Les pentes de ces droites doivent être parallèles — formellement, il n’y a aucune interaction covariable × groupe. Testez-la en ajoutant le terme d’interaction et en confirmant qu’il n’est pas significatif :

library(rstatix)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

anx %>% anova_test(posttest ~ group * pretest)
ANOVA Table (type II tests)

         Effect DFn DFd       F        p p<.05   ges
1         group   2  39 209.314 1.40e-21     * 0.915
2       pretest   1  39 572.828 6.36e-25     * 0.936
3 group:pretest   2  39   0.127 8.81e-01       0.006

L’interaction group:pretest n’est pas significative, F(2, 39) = 0.13, p = 0.88 — les pentes sont homogènes, donc l’ANCOVA est valide.

Normalité et égalité des variances des résidus, et valeurs aberrantes

Ajustez le modèle ANCOVA avec lm() (covariable en premier), puis dérivez les résidus et les résidus standardisés avec base R (residuals() et rstandard() — pas de paquet supplémentaire). Shapiro-Wilk teste la normalité, le test de Levene vérifie l’égalité de la variance résiduelle entre les groupes, et tout |std.resid| > 3 signale une valeur aberrante :

library(rstatix)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

model <- lm(posttest ~ pretest + group, data = anx)
model.metrics <- data.frame(
  group     = anx$group,
  resid     = residuals(model),
  std.resid = rstandard(model)
)

shapiro_test(model.metrics$resid)                 # normality of residuals
# A tibble: 1 × 3
  variable            statistic p.value
  <chr>                   <dbl>   <dbl>
1 model.metrics$resid     0.975   0.444
model.metrics %>% levene_test(resid ~ group)      # equal variance
# A tibble: 1 × 4
    df1   df2 statistic     p
  <int> <int>     <dbl> <dbl>
1     2    42      2.27 0.116
model.metrics[abs(model.metrics$std.resid) > 3, ] # outliers (|std.resid| > 3)
[1] group     resid     std.resid
<0 rows> (or 0-length row.names)

Shapiro-Wilk est non significatif (p = 0.44, résidus normaux), le test de Levene est non significatif (p = 0.12, variances égales), et aucune ligne n’a de résidu standardisé au-delà de ±3 — toutes les hypothèses sont vérifiées.

Mener l’ANCOVA à un facteur

L’ordre des termes compte : placez la covariable en premier. Vous voulez retirer l’effet de la covariable avant de tester le groupe, alors écrivez outcome ~ covariate + group.

Avec rstatix (recommandé)

library(rstatix)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

res.aov <- anx %>% anova_test(posttest ~ pretest + group)
get_anova_table(res.aov)
ANOVA Table (type II tests)

   Effect DFn DFd       F        p p<.05   ges
1 pretest   1  41 598.321 4.48e-26     * 0.936
2   group   2  41 218.629 1.35e-22     * 0.914

Après ajustement sur le score pré-test, il y a une différence statistiquement significative d’anxiété post-test entre les groupes, F(2, 41) = 218.63, p < 0.0001.

Avec base R

aov() donne le même effet de groupe ajusté — à condition que la covariable soit saisie en premier (base R utilise des sommes des carrés séquentielles, de Type I, donc l’ordre compte) :

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

summary(aov(posttest ~ pretest + group, data = anx))
            Df Sum Sq Mean Sq F value Pr(>F)    
pretest      1  99.40   99.40   587.2 <2e-16 ***
group        2  74.02   37.01   218.6 <2e-16 ***
Residuals   41   6.94    0.17                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La ligne group indique F = 218.63 — identique au résultat de rstatix. Cette correspondance n’est pas automatique :

Avertissement

Placez la covariable en premier, sinon vous obtenez une réponse différente. L’aov() de base R ajuste chaque terme uniquement sur les termes qui le précèdent. Avec posttest ~ pretest + group, l’effet de groupe est ajusté sur la covariable (F = 218.63, correspondant à l’anova_test() de Type II de rstatix). Inversez l’ordre en posttest ~ group + pretest et le F du groupe passe à 213.05 — le groupe n’est plus ajusté sur la référence, ce qui n’est pas une ANCOVA. Écrivez toujours outcome ~ covariate + group.

Post-hoc : comparer les moyennes ajustées

Un effet de groupe significatif se prolonge par des comparaisons par paires des moyennes ajustées (moyennes marginales estimées)emmeans_test() avec l’argument covariate, corrigées par Bonferroni. get_emmeans() affiche les moyennes ajustées elles-mêmes :

library(rstatix)
library(emmeans)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

pwc <- anx %>%
  emmeans_test(posttest ~ group, covariate = pretest, p.adjust.method = "bonferroni")
pwc
# A tibble: 3 × 9
  term        .y.   group1 group2    df statistic        p    p.adj p.adj.signif
* <chr>       <chr> <chr>  <chr>  <dbl>     <dbl>    <dbl>    <dbl> <chr>       
1 pretest*gr… post… grp1   grp2      41      4.24 1.26e- 4 3.77e- 4 ***         
2 pretest*gr… post… grp1   grp3      41     19.9  1.19e-22 3.58e-22 ****        
3 pretest*gr… post… grp2   grp3      41     15.5  9.21e-19 2.76e-18 ****        
get_emmeans(pwc)
# A tibble: 3 × 8
  pretest group emmean    se    df conf.low conf.high method      
    <dbl> <fct>  <dbl> <dbl> <dbl>    <dbl>     <dbl> <chr>       
1    16.9 grp1    16.4 0.106    41     16.2      16.7 Emmeans test
2    16.9 grp2    15.8 0.107    41     15.6      16.0 Emmeans test
3    16.9 grp3    13.5 0.106    41     13.2      13.7 Emmeans test

Le score d’anxiété moyen ajusté était significativement plus élevé dans grp1 (≈ 16.4) que dans grp2 (≈ 15.8) et grp3 (≈ 13.5), et toutes les différences par paires sont significatives (p.adj < 0.001) — plus l’intensité de l’exercice est élevée, plus l’anxiété ajustée est faible.

Tracer les moyennes ajustées avec les p-value

La figure de présentation trace les moyennes ajustées (et non les moyennes brutes) avec leurs intervalles de confiance, le résultat de l’ANCOVA dans le sous-titre, et les comparaisons significatives sous forme de crochets :

library(rstatix)
library(ggpubr)
library(emmeans)

data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx[14, "posttest"] <- 19

res.aov <- anx %>% anova_test(posttest ~ pretest + group)
pwc <- anx %>%
  emmeans_test(posttest ~ group, covariate = pretest, p.adjust.method = "bonferroni") %>%
  add_xy_position(x = "group", fun = "mean_se")

ggline(get_emmeans(pwc), x = "group", y = "emmean") +
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = 0.2) +
  stat_pvalue_manual(pwc, hide.ns = TRUE, tip.length = FALSE) +
  labs(
    subtitle = get_test_label(res.aov, detailed = TRUE),
    caption = get_pwc_label(pwc)
  )

A line plot of adjusted anxiety score across the three exercise groups with 95% confidence bars; the score falls from grp1 to grp3, the ANCOVA F(2,41)=218.63, p<0.0001 is in the subtitle, and the significant pairwise brackets are drawn above the points.

Rapport (à un facteur)

Une ANCOVA a été menée pour déterminer l’effet du groupe d’exercice sur l’anxiété post-test après contrôle de l’anxiété de référence. Après ajustement sur le score pré-test, il y avait une différence statistiquement significative d’anxiété post-test entre les groupes, F(2, 41) = 218.63, p < 0.0001. L’analyse post-hoc avec un ajustement de Bonferroni a montré que toutes les différences par paires étaient significatives (p < 0.001) ; le score d’anxiété moyen ajusté était le plus élevé dans grp1 (≈ 16.4) et le plus faible dans grp3 (≈ 13.5).

ANCOVA à deux facteurs

Une ANCOVA à deux facteurs teste deux facteurs et leur interaction sur le résultat tout en ajustant sur une covariable. Nous utilisons le jeu de données stress (datarium) : le score de réduction du stress par treatment (no, yes) et exercise (low, moderate, high), avec ajustement sur age.

library(rstatix)

data("stress", package = "datarium")
stress %>% sample_n_by(treatment, exercise, size = 1)
# A tibble: 6 × 5
     id score treatment exercise   age
  <dbl> <dbl> <fct>     <fct>    <dbl>
1     3  97.2 yes       low         70
2    20  85.4 yes       moderate    57
3    22  65.8 yes       high        56
4    36  87   no        low         63
5    45  88.4 no        moderate    65
6    54  75.7 no        high        58

Les hypothèses sont les mêmes, vérifiées de la même manière (un nuage de points à facettes pour la linéarité, une interaction covariable × facteur non significative pour l’homogénéité des pentes, Shapiro/Levene sur les résidus, |std.resid| dans 3). La vérification de l’homogénéité des pentes croise la covariable avec les deux facteurs :

library(rstatix)

data("stress", package = "datarium")

stress %>% anova_test(
  score ~ age + treatment + exercise +
    treatment:exercise + age:treatment + age:exercise + age:treatment:exercise
)
ANOVA Table (type II tests)

                  Effect DFn DFd      F        p p<.05      ges
1                    age   1  48  8.359 6.00e-03     * 0.148000
2              treatment   1  48  9.907 3.00e-03     * 0.171000
3               exercise   2  48 18.197 1.31e-06     * 0.431000
4     treatment:exercise   2  48  3.303 4.50e-02     * 0.121000
5          age:treatment   1  48  0.009 9.25e-01       0.000189
6           age:exercise   2  48  0.235 7.91e-01       0.010000
7 age:treatment:exercise   2  48  0.073 9.30e-01       0.003000

Aucun des termes d’interaction age:* n’est significatif (p > 0.05), donc les pentes sont homogènes.

Mener l’ANCOVA à deux facteurs

La covariable d’abord, puis les deux facteurs et leur interaction :

library(rstatix)

data("stress", package = "datarium")

res.aov <- stress %>% anova_test(score ~ age + treatment * exercise)
get_anova_table(res.aov)
ANOVA Table (type II tests)

              Effect DFn DFd      F        p p<.05   ges
1                age   1  53  9.110 4.00e-03     * 0.147
2          treatment   1  53 11.096 2.00e-03     * 0.173
3           exercise   2  53 20.820 2.13e-07     * 0.440
4 treatment:exercise   2  53  4.446 1.60e-02     * 0.144

Après ajustement sur l’âge, il y a une interaction treatment:exercise statistiquement significative, F(2, 53) = 4.45, p = 0.016 — l’effet de l’exercice sur le stress dépend de treatment, donc (exactement comme dans une ANOVA à deux facteurs) nous la décomposons à l’aide des effets simples principaux plutôt que de lire les effets principaux seuls.

Post-hoc : effets principaux simples

Analysez l’effet de treatment au sein de chaque niveau d’exercise — groupez par exercise, menez une ANCOVA à un facteur de treatment avec ajustement sur age :

library(rstatix)

data("stress", package = "datarium")

stress %>%
  group_by(exercise) %>%
  anova_test(score ~ age + treatment)
# A tibble: 6 × 8
  exercise Effect      DFn   DFd      F        p `p<.05`   ges
* <fct>    <chr>     <dbl> <dbl>  <dbl>    <dbl> <chr>   <dbl>
1 low      age           1    17  2.25  0.152    ""      0.117
2 low      treatment     1    17  0.437 0.517    ""      0.025
3 moderate age           1    17  6.65  0.02     "*"     0.281
4 moderate treatment     1    17  0.419 0.526    ""      0.024
5 high     age           1    17  0.794 0.385    ""      0.045
6 high     treatment     1    17 18.7   0.000455 "*"     0.524

À un seuil corrigé par Bonferroni de 0.05 / 3 = 0.0167, l’effet de treatment est significatif uniquement dans le groupe d’exercice de haute intensité (p = 0.00045), pas dans les groupes faible (p = 0.52) ni modéré (p = 0.53). Les comparaisons par paires confirment où treatment importe :

library(rstatix)
library(emmeans)

data("stress", package = "datarium")

pwc <- stress %>%
  group_by(exercise) %>%
  emmeans_test(score ~ treatment, covariate = age, p.adjust.method = "bonferroni")

pwc[pwc$exercise == "high", c("exercise", "group1", "group2", "p.adj", "p.adj.signif")]
# A tibble: 1 × 5
  exercise group1 group2     p.adj p.adj.signif
  <fct>    <chr>  <chr>      <dbl> <chr>       
1 high     yes    no     0.0000597 ****        

Pour les pratiquants de haute intensité, treatment yes diffère significativement de no (p.adj < 0.0001) — donc le traitement aide le plus ceux qui s’entraînent déjà intensément.

La décomposition est symétrique — vous pouvez aussi tester l’effet d’exercise au sein de chaque niveau de treatment. Groupez par treatment et menez une ANCOVA à un facteur d’exercise avec ajustement sur age :

library(rstatix)

data("stress", package = "datarium")

stress %>%
  group_by(treatment) %>%
  anova_test(score ~ age + exercise)
# A tibble: 4 × 8
  treatment Effect     DFn   DFd     F         p `p<.05`   ges
* <fct>     <chr>    <dbl> <dbl> <dbl>     <dbl> <chr>   <dbl>
1 yes       age          1    26  2.37 0.136     ""      0.083
2 yes       exercise     2    26 17.3  0.0000164 "*"     0.572
3 no        age          1    26  7.26 0.012     "*"     0.218
4 no        exercise     2    26  3.99 0.031     "*"     0.235

À un seuil corrigé par Bonferroni de 0.05 / 2 = 0.025, exercise a un effet significatif dans le groupe treatment = yes (F(2, 26) = 17.3, p < 0.0001) mais pas dans le groupe no (p = 0.031) — les deux vues d’effets simples principaux décrivent ensemble où vit l’interaction.

Rapport (à deux facteurs)

Une ANCOVA à deux facteurs a examiné les effets de treatment et d’exercise sur la réduction du stress, avec contrôle de l’âge. Il y avait une interaction statistiquement significative entre treatment et exercise, F(2, 53) = 4.45, p = 0.016. Les analyses d’effets simples principaux (corrigées par Bonferroni) ont montré que l’effet de treatment était significatif dans le groupe d’exercice de haute intensité (p < 0.001) mais pas dans les groupes faible (p = 0.52) ni modéré (p = 0.53).

Tracez les moyennes ajustées par exercise, colorées par treatment, avec la comparaison significative marquée — la figure de présentation pour une ANCOVA à deux facteurs :

library(rstatix)
library(ggpubr)
library(emmeans)

data("stress", package = "datarium")

res.aov <- stress %>% anova_test(score ~ age + treatment * exercise)
pwc <- stress %>%
  group_by(exercise) %>%
  emmeans_test(score ~ treatment, covariate = age, p.adjust.method = "bonferroni") %>%
  add_xy_position(x = "exercise", fun = "mean_se", step.increase = 0.2)

ggline(get_emmeans(pwc), x = "exercise", y = "emmean", color = "treatment", palette = "jco") +
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high, color = treatment), width = 0.1) +
  stat_pvalue_manual(pwc[pwc$exercise == "high", ], hide.ns = TRUE, tip.length = 0, bracket.size = 0) +
  labs(
    subtitle = get_test_label(res.aov, detailed = TRUE),
    caption = get_pwc_label(pwc)
  )

A line plot of adjusted stress score across the three exercise levels, with one coloured line per treatment group and 95% confidence bars; the two lines diverge at high-intensity exercise, where the treatment-yes vs treatment-no comparison is significant, and the two-way ANCOVA F and p-value are in the subtitle.

L’ANCOVA ajuste un modèle linéaire avec la covariable et le facteur ensemble, \(y_{ij} = \mu + \tau_i + \beta\,(x_{ij} - \bar{x}) + \varepsilon_{ij}\), où \(\tau_i\) est l’effet de groupe et \(\beta\) la pente intra-groupe commune sur la covariable \(x\). Le groupe est testé après que la covariable a absorbé sa part de la variation — la comparaison des moyennes ajustées. L’hypothèse d’homogénéité des pentes est exactement l’affirmation qu’un seul \(\beta\) convient à tous les groupes (pas de pente propre à un groupe), ce qui explique pourquoi une interaction covariable × groupe significative invalide le modèle.

Essayez en direct

Menez une ANCOVA à un facteur sur une nouvelle question — mpg diffère-t-il selon le nombre de cylindres une fois ajusté sur le poids de la voiture ? Dans mtcars, wt est la covariable, cyl le groupe. Modifiez et relancez ; le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « Je veux comparer des moyennes de groupes mais j’ai une covariable à contrôler — mène une ANCOVA à un facteur sur mes données, vérifie l’hypothèse d’homogénéité des pentes, et donne-moi les moyennes ajustées » — elle répond avec du code rstatix que vous pouvez exécuter sur vos propres données, puis vous aide à lire les moyennes ajustées et les comparaisons post-hoc. The runtime is the judge. Demander à Prova →

Problèmes courants

Vous avez saisi la covariable après le groupe. L’ANCOVA ajuste l’effet de groupe sur la covariable, ce qui dans l’aov() séquentiel de base R ne se produit que si la covariable est listée en premier (outcome ~ covariate + group). Le mauvais ordre donne silencieusement un F de groupe différent, non ajusté. L’anova_test() de rstatix utilise par défaut le Type II et est donc moins sensible à l’ordre, mais écrivez quand même la covariable en premier, par souci de clarté.

L’hypothèse d’homogénéité des pentes échoue. Si l’interaction covariable × groupe est significative, les groupes ont des pentes différentes et une comparaison unique de moyennes ajustées est trompeuse — la différence entre groupes dépend de la valeur de la covariable. Ne menez pas une ANCOVA standard ; modélisez explicitement l’interaction (une analyse de modération) ou comparez les groupes à des valeurs de covariable précises.

Vous avez rapporté les moyennes de groupes brutes. Les comparaisons post-hoc et le graphique de présentation utilisent les moyennes ajustées (moyennes marginales estimées) issues de get_emmeans(), et non le mean() du résultat brut — les moyennes ajustées sont tout l’intérêt de l’ANCOVA.

Questions fréquentes

L’ANCOVA (analyse de covariance) compare des moyennes de groupes sur un résultat tout en contrôlant une covariable continue. Utilisez-la lorsqu’une variable parasite ou de référence (score pré-test, âge, dose) influence le résultat et que vous voulez une comparaison de groupes équitable ajustée sur elle — par exemple comparer des scores post-traitement entre des groupes partis de références différentes.

L’ANOVA compare directement les moyennes de groupes ; l’ANCOVA compare les moyennes de groupes ajustées après retrait de l’effet d’ une ou plusieurs covariables continues. Mécaniquement, l’ANCOVA ajoute la covariable au modèle (outcome ~ covariate + group) et teste l’effet de groupe sur la variation résiduelle, ajustée sur la covariable — ce qui augmente généralement la puissance en réduisant le terme d’erreur.

Elle exige que la relation covariable–résultat ait la même pente dans chaque groupe — c.-à-d. aucune interaction covariable × groupe. Testez-la en ajustant outcome ~ group * covariate et en confirmant que le terme d’interaction n’est pas significatif. S’il l’est, les groupes répondent à la covariable différemment et une comparaison unique de moyennes ajustées n’est pas valide.

L’aov() de base R utilise des sommes des carrés séquentielles (de Type I), ajustant chaque terme uniquement sur les termes qui le précèdent. Écrire outcome ~ covariate + group ajuste le groupe sur la covariable (vraie ANCOVA) ; l’ordre inverse non. L’anova_test() de rstatix utilise par défaut le Type II, insensible à l’ordre, mais lister la covariable en premier garde l’intention sans ambiguïté.

Ce sont les moyennes de groupes prédites à une valeur commune de la covariable (en général sa moyenne globale) — les moyennes que vous attendriez si chaque groupe avait la même référence moyenne. get_emmeans() les renvoie, et les comparaisons post-hoc et le graphique de présentation les utilisent plutôt que les moyennes de groupes brutes.

Testez vos connaissances

  1. Menez-la. Dans la cellule interactive ci-dessous, menez une ANCOVA à un facteur de l’anxiété posttest par group, avec ajustement sur pretest. Remplissez les blancs (covariable en premier !). L’effet de groupe est-il significatif après ajustement ?
  2. Conceptuel. Avant de faire confiance à l’ANCOVA, quelle hypothèse supplémentaire — au-delà de la normalité et de l’égalité des variances — devez-vous vérifier, et comment la teste-t-on ?

Remplissez les blancs pour que la formule soit posttest ~ pretest + group — la covariable (pretest) vient en premier, puis + group. Regardez la colonne p de la ligne group. Pour la question 2, rappelez-vous que l’ANCOVA suppose que la pente de la covariable est la même dans chaque groupe.

library(rstatix)
library(datarium)
data("anxiety", package = "datarium")
anx <- as.data.frame(anxiety[, c("id", "group", "t1", "t3")])
names(anx)[names(anx) %in% c("t1", "t3")] <- c("pretest", "posttest")
anx %>% anova_test(posttest ~ pretest + group)
#> group is significant after adjusting for pretest: F(2, 41) ≈ 218, p < 0.0001.

L’effet de groupe est significatif après ajustement.

Pour la question 2 : vous devez vérifier l’homogénéité des pentes de régression — ajustez posttest ~ group * pretest et confirmez que l’interaction group:pretest n’est pas significative. Si elle l’est, les groupes ont des pentes différentes et une ANCOVA standard n’est pas valide.

AstuceQuel test, quand ?
  • Comparer des moyennes de groupes, sans covariableANOVA à un facteur.
  • Comparer des moyennes de groupes, avec ajustement sur une covariable continueANCOVA à un facteur (cette leçon).
  • Deux facteurs + une covariableANCOVA à deux facteurs (cette leçon).
  • Deux facteurs, sans covariableANOVA à deux facteurs.
  • Pentes covariable × groupe différentes (l’homogénéité des pentes échoue) → modélisez l’interaction (modération), et non une ANCOVA standard.

Conclusion

Vous savez maintenant mener une ANCOVA à un et à deux facteurs en R : placez la covariable en premier (outcome ~ covariate + group), vérifiez les hypothèses propres à l’ANCOVA — linéarité et homogénéité des pentes de régression — en plus des vérifications habituelles de normalité, d’égalité des variances et de valeurs aberrantes, puis comparez les moyennes ajustées (moyennes marginales estimées) avec emmeans_test() et reportez-les sur le graphique. L’ANCOVA donne une comparaison de groupes plus équitable que l’ANOVA dès qu’une covariable continue façonne le résultat — et une ANCOVA à deux facteurs décompose une interaction significative avec le même flux de travail d’effets simples principaux qu’une ANOVA à deux facteurs.

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 = {ANCOVA en R : comparer des moyennes ajustées sur une
    covariable},
  date = {2026-06-23},
  url = {https://www.datanovia.com/learn/biostatistics/anova/ancova-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“ANCOVA en R : comparer des moyennes ajustées sur une covariable.” 2026. June 23. https://www.datanovia.com/learn/biostatistics/anova/ancova-in-r.