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 rstatixanova_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 exampleset.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"] <-19ggscatter( anx, x ="pretest", y ="posttest", color ="group", palette ="jco",add ="reg.line") +stat_regline_equation(aes(label =after_stat(rr.label), color = group))
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 :
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 :
[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.
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) :
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 :
# 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 :
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.
# 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 :
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 :
# 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 :
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
NoteQu’est-ce que l’ANCOVA et quand dois-je l’utiliser ?
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.
NoteQuelle est la différence entre ANOVA et ANCOVA ?
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.
NoteQu’est-ce que l’hypothèse d’homogénéité des pentes de régression ?
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.
NotePourquoi la covariable doit-elle venir en premier dans la formule ?
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é.
NoteQue sont les moyennes marginales estimées (ajustées) ?
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
ImportantPratique
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 ?
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 ?
NoteIndice
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.
NoteSolution
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.
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.
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 = {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}
}