ANOVA mixte en R : un facteur inter-sujets et un facteur intra-sujets
Exécutez une ANOVA mixte à deux facteurs à la manière moderne — combinez un facteur inter-sujets et un facteur intra-sujets (à mesures répétées), vérifiez la sphéricité et décomposez l’interaction
Apprenez à exécuter une ANOVA mixte en R avec rstatix — un plan comportant un facteur inter-sujets et un facteur intra-sujets (à mesures répétées). Remodelez les données au format long, vérifiez les conditions y compris l’homogénéité des covariances (M de Box) et la sphéricité (test de Mauchly avec correction automatique de Greenhouse-Geisser), calculez les effets de groupe, de temps et d’interaction, et décomposez une interaction significative avec des effets principaux simples et des comparaisons par paires. Modifiez et exécutez en direct.
Date de publication
23 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
Une ANOVA mixte combine au moins un facteur inter-sujets (des participants différents par groupe) et au moins un facteur intra-sujets (les mêmes participants mesurés de façon répétée).
Ajustez-la avec rstatix anova_test(dv = score, wid = id, between = group, within = time), puis extrayez le tableau avec get_anova_table() — qui applique automatiquement la correction de Greenhouse-Geisser lorsque la sphéricité est violée.
Elle requiert les hypothèses des plans à mesures répétées : homogénéité des covariances (M de Box) et sphéricité (test de Mauchly, vérifié à l’intérieur de anova_test()), en plus des vérifications habituelles de valeurs aberrantes / normalité / variance.
Une interaction significative se décompose de deux façons : l’effet du facteur interà chaque niveau du facteur intra (un test inter à un facteur), et le facteur intraà chaque niveau du facteur inter (un test apparié).
Les données doivent être au format long — une ligne par mesure (id, group, time, score).
Introduction
Une ANOVA mixte (aussi appelée ANOVA split-plot) s’utilise lorsqu’un plan comporte à la fois un facteur inter-sujets — des participants différents dans chaque groupe — et un facteur intra-sujets — les mêmes participants mesurés sous plusieurs conditions ou au fil du temps. C’est le point de rencontre de l’ANOVA à deux facteurs (tout inter) et de l’ ANOVA à mesures répétées (tout intra).
Le scénario classique : trois groupes d’exercice (inter-sujets) dont on mesure l’anxiété à trois points temporels (intra-sujets) — et la question est de savoir si les groupes évoluent différemment au fil du temps, c’est-à-dire si le groupe et le temps interagissent. Cette leçon déroule l’ensemble du flux de travail avec rstatix en utilisant le jeu de données anxiety.
Note
Hypothèses de l’ANOVA mixte. Trois hypothèses nulles : aucun effet principal du facteur inter (moyennes des groupes égales), aucun effet principal du facteur intra (moyennes des temps égales), et aucune interaction (les groupes suivent le même profil temporel). L’interaction est généralement la question d’intérêt.
Les données : des groupes mesurés au fil du temps (format long)
Nous utilisons le jeu de données anxiety de datarium : le score d’anxiété de participants répartis en trois groupes d’exercice (grp1/grp2/grp3, inter-sujets), chacun mesuré à trois instants t1/t2/t3 (intra-sujets). Une ANOVA mixte exige le format long — une ligne par mesure — que nous construisons à partir des colonnes au format large avec base R :
Une boîte à moustaches de score selon time, colorée par group, montre si les groupes suivent des profils temporels différents — des motifs non parallèles laissent présager une interaction :
library(rstatix)library(ggpubr)data("anxiety", package ="datarium")n <-nrow(anxiety)long <-data.frame(id =factor(rep(anxiety$id, 3)), group =rep(anxiety$group, 3),time =factor(rep(c("t1", "t2", "t3"), each = n)), score =c(anxiety$t1, anxiety$t2, anxiety$t3))ggboxplot(long, x ="time", y ="score", color ="group", palette ="jco")
Vérifiez les hypothèses
Au-delà de l’indépendance des groupes et de l’absence de valeurs aberrantes extrêmes, une ANOVA mixte requiert la normalité du score dans chaque cellule, l’homogénéité de la variance à chaque temps (Levene), l’homogénéité des covariances entre les groupes inter (M de Box), et la sphéricité du facteur intra (Mauchly — vérifiée automatiquement par anova_test()).
# A tibble: 9 × 5
group time variable statistic p
<fct> <fct> <chr> <dbl> <dbl>
1 grp1 t1 score 0.964 0.769
2 grp1 t2 score 0.956 0.624
3 grp1 t3 score 0.949 0.506
4 grp2 t1 score 0.977 0.949
5 grp2 t2 score 0.935 0.328
6 grp2 t3 score 0.909 0.131
7 grp3 t1 score 0.954 0.588
8 grp3 t2 score 0.952 0.558
9 grp3 t3 score 0.925 0.232
# equal variance at each time pointlong %>%group_by(time) %>%levene_test(score ~ group)
# A tibble: 3 × 5
time df1 df2 statistic p
<fct> <int> <int> <dbl> <dbl>
1 t1 2 42 0.176 0.839
2 t2 2 42 0.249 0.781
3 t3 2 42 0.335 0.717
# homogeneity of covariances across groups (Box's M; judge at alpha = 0.001)box_m(long[, "score", drop =FALSE], long$group)
# A tibble: 1 × 4
statistic p.value parameter method
<dbl> <dbl> <dbl> <chr>
1 1.93 0.381 2 Box's M-test for Homogeneity of Covariance Matric…
Le score est normal dans chaque cellule, le test de Levene est non significatif à chaque temps, et le M de Box est non significatif — les hypothèses sont vérifiées. La sphéricité (test de Mauchly) est rapportée dans le cadre de l’ANOVA ci-dessous.
Exécuter l’ANOVA mixte
Passez les données longues avec dv (variable de réponse), wid (identifiant de sujet), between et within. get_anova_table() extrait le tableau et applique automatiquement la correction de Greenhouse-Geisser si le test de sphéricité de Mauchly est significatif :
library(rstatix)data("anxiety", package ="datarium")n <-nrow(anxiety)long <-data.frame(id =factor(rep(anxiety$id, 3)), group =rep(anxiety$group, 3),time =factor(rep(c("t1", "t2", "t3"), each = n)), score =c(anxiety$t1, anxiety$t2, anxiety$t3))res.aov <-anova_test(data = long, dv = score, wid = id, between = group, within = time)get_anova_table(res.aov)
ANOVA Table (type II tests)
Effect DFn DFd F p p<.05 ges
1 group 2 42 4.352 1.90e-02 * 0.168
2 time 2 84 394.909 1.91e-43 * 0.179
3 group:time 4 84 110.188 1.38e-32 * 0.108
Il y a une interaction group × time statistiquement significative, F(4, 84) = 110.19, p < 0.0001 — les groupes d’exercice évoluent différemment au fil du temps. Les deux effets principaux sont également significatifs (group F(2, 42) = 4.35, p = 0.02 ; time F(2, 84) = 394.91, p < 0.0001), mais en présence d’une interaction significative c’est l’interaction que nous décomposons.
Astuce
La sphéricité est gérée pour vous.anova_test() exécute le test de Mauchly en interne ; ici il est non significatif (p = 0.08), donc la sphéricité est vérifiée et aucune correction n’est nécessaire. Lorsque Mauchly est significatif, get_anova_table() renvoie par défaut le tableau corrigé par Greenhouse-Geisser — voir la leçon sur l’ANOVA à mesures répétées pour les détails de la sphéricité.
Post-hoc : décomposer l’interaction
Une interaction significative se décompose dans deux directions.
Effet du groupe à chaque temps — un test inter-sujets à un facteur à chaque point temporel, suivi de comparaisons par paires :
# A tibble: 3 × 8
time Effect DFn DFd F p `p<.05` ges
* <fct> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
1 t1 group 2 42 0.365 0.696 "" 0.017
2 t2 group 2 42 5.84 0.006 "*" 0.218
3 t3 group 2 42 13.8 0.0000248 "*" 0.396
Les groupes ne diffèrent pas à t1 (p = 0.7) mais diffèrent significativement à t2 (p = 0.006) et t3 (p < 0.0001) — l’effet de groupe émerge au fil du temps, ce qui est l’interaction en action.
Effet du temps dans chaque groupe — un test intra-sujets (apparié) à l’intérieur de chaque groupe :
# A tibble: 3 × 8
group Effect DFn DFd F p `p<.05` ges
<fct> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
1 grp1 time 2 28 14.8 4.05e- 5 * 0.024
2 grp2 time 2 28 77.5 3.88e-12 * 0.086
3 grp3 time 2 28 490. 1.64e-22 * 0.531
L’anxiété change significativement au fil du temps dans chaque groupe, mais le plus fortement dans grp3 — cohérent avec les profils divergents observés sur le graphique.
Le tracer avec les p-values
La figure de rapport montre les comparaisons de groupe à chaque temps sur la boîte à moustaches, avec le résultat de l’ANOVA mixte en sous-titre :
library(rstatix)library(ggpubr)data("anxiety", package ="datarium")n <-nrow(anxiety)long <-data.frame(id =factor(rep(anxiety$id, 3)), group =rep(anxiety$group, 3),time =factor(rep(c("t1", "t2", "t3"), each = n)), score =c(anxiety$t1, anxiety$t2, anxiety$t3))res.aov <-anova_test(data = long, dv = score, wid = id, between = group, within = time)pwc <- long %>%group_by(time) %>%tukey_hsd(score ~ group) %>%add_xy_position(x ="time")ggboxplot(long, x ="time", y ="score", color ="group", palette ="jco") +stat_pvalue_manual(pwc, hide.ns =TRUE, tip.length =0) +labs(subtitle =get_test_label(res.aov, detailed =TRUE),caption =get_pwc_label(pwc) )
Rapport
Une ANOVA mixte a examiné l’effet du groupe d’exercice (inter) et du temps (intra) sur le score d’anxiété. Il y avait une interaction statistiquement significative entre le groupe et le temps, F(4, 84) = 110.19, p < 0.0001. Les analyses d’effets principaux simples n’ont montré aucune différence de groupe à t1 (p = 0.7) mais des différences significatives à t2 (p = 0.006) et t3 (p < 0.0001) ; l’anxiété a diminué significativement au fil du temps dans chaque groupe.
ANOVA mixte à trois facteurs : deux inter + un intra
Un plan mixte peut porter davantage de facteurs. La première disposition à trois facteurs comporte deux facteurs inter-sujets et un facteur intra-sujets (un plan 2-inter, 1-intra). Nous utilisons le jeu de données performance : le score de performance mesuré à deux instants (time, intra), avec gender et stress comme les deux facteurs inter-sujets. Construisez le format long avec base R :
Il y a une interaction à trois facteurs significative entre gender, stress et time, F(2, 54) = 6.10, p = 0.004 — le motif gender × stress lui-même change au fil du temps. Décomposez-la exactement comme une ANOVA à trois facteurs : l’interaction simple à deux facteurs gender × stress à chaque point temporel (en groupant par time) :
library(rstatix)data("performance", package ="datarium")np <-nrow(performance)perf <-data.frame(id =factor(rep(performance$id, 2)), gender =rep(performance$gender, 2),stress =rep(performance$stress, 2), time =factor(rep(c("t1", "t2"), each = np)),score =c(performance$t1, performance$t2))perf %>%group_by(time) %>%anova_test(dv = score, wid = id, between =c(gender, stress))
L’interaction gender × stress est significative à t2 (F(2, 54) = 4.95, p = 0.011) mais pas à t1 — à partir de là, vous exécuteriez les effets principaux simples simples (par exemple l’effet du stress chez les femmes à t2, F(2, 27) = 10.5, p = 0.0004) et des comparaisons par paires, exactement comme dans l’ANOVA à trois facteurs.
ANOVA mixte à trois facteurs : un inter + deux intra
La seconde disposition comporte un facteur inter-sujets et deux facteurs intra-sujets (1-inter, 2-intra). Nous utilisons le jeu de données weightloss, en traitant exercises comme le facteur inter et à la foisdiet et time comme facteurs intra. Les données nécessitent un ajustement — chacun des 24 individus apparaît dans deux essais de régime, donc l’id est répété entre eux :
library(rstatix)data("weightloss", package ="datarium")weightloss$id <-factor(rep(1:24, 2)) # same 24 people across the two diet trialsnw <-nrow(weightloss)wl <-data.frame(id =factor(rep(weightloss$id, 3)),diet =rep(weightloss$diet, 3),exercises =rep(weightloss$exercises, 3),time =factor(rep(c("t1", "t2", "t3"), each = nw)),score =c(weightloss$t1, weightloss$t2, weightloss$t3))
Passez l’unique facteur inter et les deux facteurs intra avec within = c(diet, time) :
library(rstatix)data("weightloss", package ="datarium")weightloss$id <-factor(rep(1:24, 2))nw <-nrow(weightloss)wl <-data.frame(id =factor(rep(weightloss$id, 3)), diet =rep(weightloss$diet, 3),exercises =rep(weightloss$exercises, 3), time =factor(rep(c("t1", "t2", "t3"), each = nw)),score =c(weightloss$t1, weightloss$t2, weightloss$t3))res.aov <-anova_test(data = wl, dv = score, wid = id, between = exercises, within =c(diet, time))get_anova_table(res.aov)
Il y a une interaction à trois facteurs significative entre exercises, diet et time, F(2, 44) = 9.97, p < 0.001 — le motif diet × time diffère entre les sportifs et les non-sportifs. La décomposition suit la même recette : l’interaction simple à deux facteurs à chaque niveau du facteur inter, puis les effets principaux simples simples et les comparaisons par paires, les facteurs intra-sujets étant pris en charge par la mécanique des mesures répétées (correction de sphéricité, post-hoc apparié).
NoteLes mathématiques (optionnel)
Une ANOVA mixte décompose la variation totale en une strate inter-sujets et une strate intra-sujets, chacune avec son propre terme d’erreur : les effets inter sont testés contre l’erreur de sujet à sujet, tandis que chaque effet intra (et toute interaction l’impliquant) est testé contre sa propre erreur sujet × effet. Les F-tests intra-sujets supposent la sphéricité — l’égalité des variances des différences par paires entre les niveaux répétés — c’est pourquoi le test de Mauchly et la correction de Greenhouse-Geisser ne s’appliquent qu’aux lignes intra et d’interaction, jamais au facteur purement inter-sujets.
Essayez en direct
Exécutez vous-même l’ANOVA mixte et modifiez l’étape post-hoc. Le calcul intra-sujets est lourd dans le navigateur, donc la cellule augmente d’abord la limite d’expressions de R (sinon webR échoue avec « evaluation nested too deeply »). Le bac à sable démarre au premier Run.
🟢 Avec un agent IA
Demandez à Prova« J’ai un groupe inter-sujets et un facteur temps intra-sujets — exécute une ANOVA mixte sur mes données au format long, vérifie la sphéricité et décompose l’interaction » — elle répond avec du code rstatix que vous pouvez exécuter sur vos propres données, puis vous aide à lire l’interaction et les suivis par effets principaux simples. The runtime is the judge.Demander à Prova →
Problèmes courants
Vos données sont au format large. Une ANOVA mixte exige le format long — une ligne par mesure avec id, le facteur inter, le facteur intra et le score. Remodelez d’abord les colonnes larges (ici, empilez t1/t2/t3 dans une seule colonne score avec une étiquette time).
Vous avez oublié wid.anova_test() a besoin de l’identifiant de sujet (wid = id) pour savoir quelles lignes sont des mesures répétées du même participant ; sans lui, le facteur intra est traité comme inter-sujets et le résultat est faux. Faites de id un facteur.
« evaluation nested too deeply » dans le navigateur. Le modèle intra-sujets dépasse la limite d’expressions par défaut de webR. Mettez options(expressions = 5e5) comme première ligne de la cellule live (c’est une particularité propre à webR ; le rendu statique n’est pas affecté).
Questions fréquentes
NoteQu’est-ce qu’une ANOVA mixte ?
Une ANOVA mixte teste un plan comportant à la fois un facteur inter-sujets (des participants différents par groupe) et un facteur intra-sujets (les mêmes participants mesurés de façon répétée). Elle rapporte un effet principal pour chaque facteur plus leur interaction — typiquement la question est de savoir si les groupes évoluent différemment à travers la condition répétée.
NoteQuelle est la différence entre une ANOVA mixte et une ANOVA à mesures répétées ?
Une ANOVA à mesures répétées ne comporte que des facteurs intra-sujets (chaque participant vit chaque condition). Une ANOVA mixte ajoute au moins un facteur inter-sujets, de sorte que les participants sont répartis en groupes indépendants et mesurés de façon répétée. Mixte = inter + intra dans un seul modèle.
NoteDois-je vérifier la sphéricité dans une ANOVA mixte ?
Oui — pour le facteur intra-sujets. anova_test() exécute automatiquement le test de Mauchly, et get_anova_table() applique la correction de Greenhouse-Geisser lorsque la sphéricité est violée (Mauchly p ≤ 0.05). Le facteur inter-sujets n’a pas besoin d’une vérification de sphéricité.
NoteComment décomposer une interaction significative dans une ANOVA mixte ?
Dans deux directions. (1) Le facteur inter à chaque niveau du facteur intra — un test inter-sujets à un facteur à chaque point temporel. (2) Le facteur intra à chaque niveau du facteur inter — un test à mesures répétées (apparié) à l’intérieur de chaque groupe. Faites suivre chaque effet principal simple significatif de comparaisons par paires ajustées par Bonferroni.
Testez vos connaissances
ImportantPratique
Exécutez-la. Dans la cellule live, ajustez une ANOVA mixte de score selon group (inter) et time (intra), sujet id. Remplissez les blancs. L’interaction group × time est-elle significative ?
Conceptuel. Votre interaction est significative. Nommez les deux analyses d’effets principaux simples complémentaires que vous exécuteriez pour la décomposer.
NoteIndice
Remplissez dv = score, wid = id, between = group, within = time. Lisez la ligne group:time. Pour la question 2, rappelez-vous qu’une interaction mixte se décompose à la fois en maintenant le facteur intra fixe et en maintenant le facteur inter fixe.
NoteSolution
anova_test(data = long, dv = score, wid = id, between = group, within = time) |>get_anova_table()#> group:time interaction is significant: F(4, 84) = 110.19, p < 0.0001.
L’interaction est significative. Pour la décomposer : (1) testez l’effet du groupe à chaque point temporel (inter-sujets, puis par paires), et (2) testez l’effet du temps dans chaque groupe (intra-sujets, apparié). Ensemble, ils décrivent où et comment les groupes divergent.
Vous savez maintenant exécuter une ANOVA mixte en R : remodelez au format long, ajustez anova_test(dv, wid, between, within), et lisez le tableau renvoyé par get_anova_table() — qui corrige automatiquement la sphéricité. Vérifiez les hypothèses des plans à mesures répétées (M de Box, Mauchly) en plus des habituelles, et lorsque l’interaction est significative, décomposez-la dans les deux directions — le facteur inter dans chaque niveau répété, et le facteur intra à l’intérieur de chaque groupe. Les plans mixtes sont partout dans les études longitudinales et d’intervention, et c’est le test qui leur convient.
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 mixte en R : un facteur inter-sujets et un facteur
intra-sujets},
date = {2026-06-23},
url = {https://www.datanovia.com/learn/biostatistics/anova/mixed-anova-in-r},
langid = {fr}
}