ANOVA à trois facteurs dans R : trois facteurs et leur interaction

Testez trois facteurs de groupement à la fois — leurs effets principaux, chaque interaction double et l’interaction triple — puis décomposez pas à pas une interaction triple significative

Apprenez à réaliser une ANOVA à trois facteurs dans R pour tester trois facteurs et leurs interactions sur une variable numérique. Utilisez anova_test() de rstatix pour un tableau soigné avec une taille d’effet ges, et aov() + summary() de base R pour la présentation classique — avec les vérifications des valeurs aberrantes, de la normalité et de l’égalité des variances, comment lire les sept termes, et la décomposition complète d’une interaction triple significative en interactions doubles simples, effets principaux simples simples et comparaisons simples simples, avec les p-values sur le graphique.

Date de publication

23 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Une ANOVA à trois facteurs teste trois facteurs de groupement à la fois — l’effet principal de chaque facteur, les trois interactions doubles et l’interaction triple — sur une seule variable numérique.
  • Utilisez anova_test() de rstatix avec une formule outcome ~ A * B * C pour un tableau soigné (F, p, et la taille d’effet ges pour chacun des sept termes), ou bien aov() + summary() de base R.
  • L’interaction triple (A:B:C) est le résultat phare : une interaction significative signifie que l’interaction double entre deux facteurs change elle-même selon les niveaux du troisième — interprétez-la avant tout le reste.
  • Vérifiez les mêmes hypothèses que pour les tests d’ordre inférieur : pas de valeurs aberrantes extrêmes, des résidus normaux (shapiro_test() + Q-Q), et une variance égale entre les cellules (levene_test()).
  • Décomposez une interaction triple significative en trois étapes : interactions doubles simpleseffets principaux simples simplescomparaisons par paires simples simples — puis tracez le résultat avec les p-values dessus.

Introduction

Une ANOVA à trois facteurs (aussi appelée ANOVA à trois facteurs ou factorielle) étend la version à deux facteurs d’un facteur supplémentaire : elle demande comment trois variables catégorielles — et toutes leurs combinaisons — agissent sur une variable numérique. En plus des trois effets principaux, le modèle estime désormais trois interactions doubles (A:B, A:C, B:C) et une interaction triple (A:B:C).

Utilisez-la lorsque chaque observation est classée selon trois variables de groupement et que vous soupçonnez que l’effet de l’une dépend des deux autres. Le scénario classique : une équipe clinique vérifie si un traitement agit de la même façon pour tout le monde, ou si son effet dépend du sexe et du niveau de risque des patients — exactement le genre de question à laquelle seul un plan à trois facteurs peut répondre. Cette leçon déroule tout le flux de travail de deux façons — la fonction anova_test() de rstatix, moderne et compatible avec le pipe, et la fonction aov() classique de base R — en utilisant le jeu de données headache, et montre les vérifications des hypothèses ainsi que la décomposition complète, étape par étape, d’une interaction triple significative.

Note

Hypothèses de l’ANOVA à trois facteurs. Il existe une hypothèse nulle pour chaque terme : les trois effets principaux (les moyennes de groupe de chaque facteur sont égales), les trois interactions doubles (chaque paire de facteurs agit indépendamment) et — celle qui compte le plus — l’interaction triple (H₀ : l’interaction double entre deux facteurs quelconques est la même à chaque niveau du troisième). Une interaction triple significative rejette cette dernière hypothèse nulle : les facteurs ne se combinent pas de façon additive.

Les données : trois facteurs à la fois

Nous utilisons le jeu de données headache du paquet datarium — le pain_score de la migraine pour 72 participants, classés selon trois facteurs : gender (homme, femme), risk de migraine (faible, élevé) et treatment (X, Y, Z). La question de recherche : l’effet du traitement sur la douleur dépend-il à la fois du sexe et du risque ? Ici, treatment est la variable focale (notre préoccupation première) et gender et risk sont les modérateurs.

library(rstatix)

set.seed(123)
data("headache", package = "datarium")

# one random row per gender × risk × treatment cell
headache %>% sample_n_by(gender, risk, treatment, size = 1)
# A tibble: 12 × 5
      id gender risk  treatment pain_score
   <int> <fct>  <fct> <fct>          <dbl>
 1    21 male   high  X               92.7
 2    30 male   high  Y               80.1
 3    33 male   high  Z               81.3
 4     2 male   low   X               76.8
 5     8 male   low   Y               80.7
 6    18 male   low   Z               74.7
 7    57 female high  X               68.4
 8    65 female high  Y               82.1
 9    70 female high  Z               80.4
10    42 female low   X               78.1
11    48 female low   Y               64.1
12    49 female low   Z               69.0

gender (2) × risk (2) × treatment (3) forment un plan factoriel 2 × 2 × 3, et la variable de sortie est pain_score. Résumez chaque cellule avec get_summary_stats() — la moyenne et l’écart-type par combinaison, les chiffres derrière le graphique qui suit :

library(rstatix)

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

headache %>%
  group_by(gender, risk, treatment) %>%
  get_summary_stats(pain_score, type = "mean_sd")
# A tibble: 12 × 7
   gender risk  treatment variable       n  mean    sd
   <fct>  <fct> <fct>     <fct>      <dbl> <dbl> <dbl>
 1 male   high  X         pain_score     6  92.7  5.12
 2 male   high  Y         pain_score     6  82.3  5.00
 3 male   high  Z         pain_score     6  79.7  4.05
 4 male   low   X         pain_score     6  76.1  3.86
 5 male   low   Y         pain_score     6  73.1  4.76
 6 male   low   Z         pain_score     6  74.5  4.89
 7 female high  X         pain_score     6  78.9  5.32
 8 female high  Y         pain_score     6  81.2  4.62
 9 female high  Z         pain_score     6  81.0  3.98
10 female low   X         pain_score     6  74.2  3.69
11 female low   Y         pain_score     6  68.4  4.08
12 female low   Z         pain_score     6  69.8  2.72

Regardez d’abord les données

Tracez toujours avant de tester. Une boîte à moustaches de pain_score par treatment, colorée selon risk et en facettes selon gender, montre les douze cellules d’un coup d’œil — et suggère déjà que l’écart entre traitements est le plus marqué dans un coin du plan :

library(ggpubr)

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

ggboxplot(
  headache, x = "treatment", y = "pain_score",
  color = "risk", palette = "jco", facet.by = "gender",
  xlab = "Treatment", ylab = "Headache pain score"
)

A boxplot of migraine pain score by treatment (X, Y, Z), with boxes coloured by risk (low, high) and the panel split into male and female facets. Pain scores are higher at high risk throughout, and the spread between treatments looks largest for males at high risk.

Réaliser l’ANOVA à trois facteurs

Avec rstatix (recommandé)

anova_test() prend les données et une formule outcome ~ A * B * C. Le * déploie tous les termes — les trois effets principaux, les trois interactions doubles et l’interaction triple. Le résultat est un tableau soigné — une ligne par terme :

library(rstatix)

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

res.aov <- headache %>% anova_test(pain_score ~ gender * risk * treatment)
res.aov
ANOVA Table (type II tests)

                 Effect DFn DFd      F        p p<.05   ges
1                gender   1  60 16.196 1.63e-04     * 0.213
2                  risk   1  60 92.699 8.80e-14     * 0.607
3             treatment   2  60  7.318 1.00e-03     * 0.196
4           gender:risk   1  60  0.141 7.08e-01       0.002
5      gender:treatment   2  60  3.338 4.20e-02     * 0.100
6        risk:treatment   2  60  0.713 4.94e-01       0.023
7 gender:risk:treatment   2  60  7.406 1.00e-03     * 0.198

Lisez-le de bas en haut — le terme d’ordre le plus élevé d’abord. Il y a une interaction triple statistiquement significative entre le sexe, le risque et le traitement, F(2, 60) = 7.41, p = 0.001, η²g = 0.20. Comme ce terme supérieur est significatif, il gouverne toute l’interprétation : l’interaction risk:treatment elle-même diffère entre les hommes et les femmes, donc vous ne devez pas vous arrêter aux lignes d’effets principaux (gender, risk, treatment sont tous significatifs, mais les rapporter seuls masquerait l’histoire réelle). Notez aussi que les interactions d’ordre inférieur gender:risk et risk:treatment ne sont pas significatives prises isolément — la structure n’émerge qu’une fois les trois facteurs croisés.

Astuce

Lisez les interactions de haut en bas. Dans toute ANOVA factorielle, interprétez d’abord l’interaction significative d’ordre le plus élevé. Une interaction A:B:C significative rend les interactions doubles et les effets principaux trompeurs pris isolément, donc vous décomposez A:B:C plutôt que de citer les lignes inférieures. Ce n’est que lorsque le terme triple est non significatif que vous descendez pour interpréter les interactions doubles.

Astuce

Lancez-la sur vos propres données. Chargez votre fichier — mydata <- read.csv("my-file.csv") — convertissez les trois colonnes de groupement en facteurs (mydata$A <- factor(mydata$A)), puis passez-les dans le pipe : mydata %>% anova_test(outcome ~ A * B * C).

Avec base R

aov() ajuste le modèle et summary() affiche le tableau d’ANOVA classique — une ligne par terme plus les résidus :

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

res.aov.base <- aov(pain_score ~ gender * risk * treatment, data = headache)
summary(res.aov.base)
                      Df Sum Sq Mean Sq F value   Pr(>F)    
gender                 1  313.4   313.4  16.196 0.000163 ***
risk                   1 1793.6  1793.6  92.699  8.8e-14 ***
treatment              2  283.2   141.6   7.318 0.001433 ** 
gender:risk            1    2.7     2.7   0.141 0.708487    
gender:treatment       2  129.2    64.6   3.338 0.042200 *  
risk:treatment         2   27.6    13.8   0.713 0.494221    
gender:risk:treatment  2  286.6   143.3   7.406 0.001334 ** 
Residuals             60 1160.9    19.3                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Les lignes sont les trois effets principaux, les trois interactions doubles, la ligne gender:risk:treatment et les Residuals ; F value et Pr(>F) (avec les étoiles de significativité) portent la même conclusion que l’appel à rstatix. aov() conserve le modèle ajusté, que les diagnostics et la décomposition post-hoc ci-dessous réutilisent.

Taille d’effet : quelle est l’ampleur de chaque terme ?

Une p-value significative dit qu’un terme compte ; la taille d’effet dit à quel point. anova_test() affiche déjà ges (eta-carré généralisé) par terme. Comme repère approximatif, η² ≈ 0.01 est petit, ≈ 0.06 moyen et ≥ 0.14 grand. Ici, risk domine (ges ≈ 0.61, très grand), l’interaction triple est un effet réel et grand (ges ≈ 0.20), et les interactions doubles non significatives sont proches de zéro — rapportez la taille d’effet à côté de chaque p-value, jamais seulement « p < 0.05 ».

Vérifiez les hypothèses

Une ANOVA à trois facteurs repose sur les mêmes hypothèses que les tests d’ordre inférieur (au-delà de l’indépendance des observations) : pas de valeurs aberrantes extrêmes, des résidus distribués normalement, et des cellules à variance égale.

Valeurs aberrantes

identify_outliers() signale les valeurs extrêmes dans chaque cellule :

library(rstatix)

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

headache %>%
  group_by(gender, risk, treatment) %>%
  identify_outliers(pain_score)
# A tibble: 4 × 7
  gender risk  treatment    id pain_score is.outlier is.extreme
  <fct>  <fct> <fct>     <int>      <dbl> <lgl>      <lgl>     
1 female high  X            57       68.4 TRUE       TRUE      
2 female high  Y            62       73.1 TRUE       FALSE     
3 female high  Z            67       75.0 TRUE       FALSE     
4 female high  Z            71       87.1 TRUE       FALSE     

Il y a une valeur aberrante extrême (id 57 — une femme à risque élevé prenant le médicament X). Avec de nombreuses petites cellules, une seule valeur extrême est fréquente ; vous pouvez la conserver et vérifier si elle change la conclusion (relancer l’ANOVA sans elle et comparer), ou utiliser une ANOVA robuste du paquet WRS2. Ici, elle ne modifie pas le verdict, donc nous la gardons.

Normalité des résidus — Shapiro-Wilk + Q-Q

L’ANOVA suppose que les résidus (et non chaque cellule brute) sont normaux. Ajustez le modèle, testez les résidus avec Shapiro-Wilk (p > 0.05 → aucun écart à la normalité), et appuyez-le avec un Q-Q plot :

library(rstatix)

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

model <- lm(pain_score ~ gender * risk * treatment, data = headache)
shapiro_test(residuals(model))
# A tibble: 1 × 3
  variable         statistic p.value
  <chr>                <dbl>   <dbl>
1 residuals(model)     0.982   0.398
library(ggpubr)

data("headache", package = "datarium")
model <- lm(pain_score ~ gender * risk * treatment, data = headache)

ggqqplot(residuals(model))

A Q-Q plot of the three-way ANOVA model residuals against the normal distribution; the points fall close to the 45-degree reference line inside the shaded confidence band, indicating approximately normal residuals.

Les points suivent la droite de référence et le test de Shapiro-Wilk est non significatif (p = 0.4) — les résidus sont normaux. Vous pouvez aussi vérifier la normalité dans chaque cellule et un Q-Q plot en facettes :

library(rstatix)

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

headache %>%
  group_by(gender, risk, treatment) %>%
  shapiro_test(pain_score)
# A tibble: 12 × 6
   gender risk  treatment variable   statistic       p
   <fct>  <fct> <fct>     <chr>          <dbl>   <dbl>
 1 male   high  X         pain_score     0.958 0.808  
 2 male   high  Y         pain_score     0.902 0.384  
 3 male   high  Z         pain_score     0.955 0.784  
 4 male   low   X         pain_score     0.982 0.962  
 5 male   low   Y         pain_score     0.920 0.507  
 6 male   low   Z         pain_score     0.924 0.535  
 7 female high  X         pain_score     0.714 0.00869
 8 female high  Y         pain_score     0.939 0.654  
 9 female high  Z         pain_score     0.971 0.901  
10 female low   X         pain_score     0.933 0.600  
11 female low   Y         pain_score     0.927 0.555  
12 female low   Z         pain_score     0.958 0.801  
library(ggpubr)

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

ggqqplot(headache, "pain_score", ggtheme = theme_bw()) +
  facet_grid(gender + risk ~ treatment, labeller = "label_both")

A grid of Q-Q plots, one per gender, risk and treatment cell; in nearly every panel the points fall close to the reference line, with one exception (female, high risk, drug X) where the earlier extreme outlier sits.

Les scores sont normaux dans chaque cellule (p > 0.05) sauf une (femme, risque élevé, médicament X, p = 0.0086) — la même cellule qui contenait la valeur aberrante extrême.

Homogénéité des variances — test de Levene

Le test de Levene vérifie si les douze cellules partagent une variance commune. Croisez les trois facteurs pour qu’il teste chaque cellule ; p > 0.05 signifie qu’aucune preuve n’indique que les variances diffèrent — ce que nous voulons :

library(rstatix)

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

headache %>% levene_test(pain_score ~ gender * risk * treatment)
# A tibble: 1 × 4
    df1   df2 statistic     p
  <int> <int>     <dbl> <dbl>
1    11    60     0.179 0.998

Le test de Levene est non significatif, donc l’égalité des variances tient entre les cellules.

Note

Si les résidus s’écartent fortement de la droite, ou si le test de Levene est significatif, les données ne conviennent pas à l’ANOVA à trois facteurs classique. Consultez la leçon dédiée au test de normalité pour le flux de travail complet des hypothèses et les approches robustes/non paramétriques.

Décomposer l’interaction triple significative

Comme l’interaction gender:risk:treatment est significative, le bon suivi est une décomposition structurée en trois étapes (Keppel & Wickens). À chaque étape, nous passons le modèle global comme error afin que les analyses empruntent le terme d’erreur regroupé du modèle complet à trois facteurs — plus puissant lorsque, comme ici, l’hypothèse d’égalité des variances est respectée.

Étape 1 — interactions doubles simples

D’abord, exécutez l’interaction double risk:treatment à chaque niveau de gender. Groupez par gender, ajustez pain_score ~ risk * treatment, et passez error = model :

library(rstatix)

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

model <- lm(pain_score ~ gender * risk * treatment, data = headache)
headache %>%
  group_by(gender) %>%
  anova_test(pain_score ~ risk * treatment, error = model)
# A tibble: 6 × 8
  gender Effect           DFn   DFd      F             p `p<.05`   ges
* <fct>  <chr>          <dbl> <dbl>  <dbl>         <dbl> <chr>   <dbl>
1 male   risk               1    60 50.0   0.00000000187 "*"     0.455
2 male   treatment          2    60 10.2   0.000157      "*"     0.253
3 male   risk:treatment     2    60  5.25  0.008         "*"     0.149
4 female risk               1    60 42.8   0.000000015   "*"     0.416
5 female treatment          2    60  0.482 0.62          ""      0.016
6 female risk:treatment     2    60  2.87  0.065         ""      0.087

Il y a une interaction double simple statistiquement significative entre le risque et le traitement pour les hommes, F(2, 60) = 5.25, p = 0.008, mais pas pour les femmes, F(2, 60) = 2.87, p = 0.065. Pour les hommes, l’effet du traitement sur la douleur dépend de leur risque de migraine.

Note

Ajustez votre alpha. La significativité statistique d’une interaction double simple est jugée à un niveau corrigé de Bonferroni de 0.05 / 2 = 0.025 (deux interactions doubles simples, une par sexe) — donc l’interaction chez les hommes (p = 0.008) franchit le seuil et celle chez les femmes (p = 0.065) ne le franchit pas.

Étape 2 — effets principaux simples simples

Une interaction double simple significative est suivie d’effets principaux simples simples. Nous n’en avons besoin que pour les hommes (la seule interaction double simple significative) : groupez par gender et risk, et testez l’effet de treatment — de nouveau avec error = model. Utilisez subset() de base R pour extraire les hommes :

library(rstatix)

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

model <- lm(pain_score ~ gender * risk * treatment, data = headache)
treatment.effect <- headache %>%
  group_by(gender, risk) %>%
  anova_test(pain_score ~ treatment, error = model)

subset(treatment.effect, gender == "male")   # base-R filter
# A tibble: 2 × 9
  gender risk  Effect      DFn   DFd     F         p `p<.05`   ges
  <fct>  <fct> <chr>     <dbl> <dbl> <dbl>     <dbl> <chr>   <dbl>
1 male   high  treatment     2    60 14.8  0.0000061 "*"     0.33 
2 male   low   treatment     2    60  0.66 0.521     ""      0.022

Il y a un effet principal simple simple significatif du traitement chez les hommes à risque élevé, F(2, 60) = 14.8, p < 0.0001, mais pas chez les hommes à risque faible, F(2, 60) = 0.66, p = 0.521 (jugé au niveau de Bonferroni 0.05 / 2 = 0.025). Ainsi, le type de traitement compte pour les hommes à risque élevé — et pas autrement.

Étape 3 — comparaisons par paires simples simples

Enfin, trouvez quels traitements diffèrent chez les hommes à risque élevé à l’aide de comparaisons par paires. emmeans_test() (moyennes marginales estimées, une enveloppe autour du paquet emmeans) exécute toutes les comparaisons par paires avec une correction de Bonferroni ; indexez les lignes dont nous avons besoin avec [ ] de base R :

library(rstatix)
library(emmeans)

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

pwc <- headache %>%
  group_by(gender, risk) %>%
  emmeans_test(pain_score ~ treatment, p.adjust.method = "bonferroni")

# males at high risk only
pwc[pwc$gender == "male" & pwc$risk == "high", c("group1", "group2", "p.adj", "p.adj.signif")]
# A tibble: 3 × 4
  group1 group2      p.adj p.adj.signif
  <chr>  <chr>       <dbl> <chr>       
1 X      Y      0.000386   ***         
2 X      Z      0.00000942 ****        
3 Y      Z      0.897      ns          

Pour les hommes à risque élevé, le traitement X diffère significativement de Y — une différence de moyennes de 10.4 points de douleur (p.adj < 0.001) — et X de Z de 13.1 points (p.adj < 0.0001), tandis que Y et Z ne diffèrent pas (différence 2.66, p.adj = 0.897). En clair : les médicaments Y et Z réduisent tous deux la douleur de façon substantielle par rapport à X chez les hommes à risque élevé, et sont statistiquement indistinguables l’un de l’autre.

Tracez-le avec les p-values dessus

La figure prête à publier place le résultat sur le graphique — le test triple global dans le sous-titre (get_test_label()) et les barres significatives par paires (hommes à risque élevé) via stat_pvalue_manual(), après qu’add_xy_position() a calculé où placer les barres :

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

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

res.aov <- headache %>% anova_test(pain_score ~ gender * risk * treatment)
pwc <- headache %>%
  group_by(gender, risk) %>%
  emmeans_test(pain_score ~ treatment, p.adjust.method = "bonferroni") %>%
  add_xy_position(x = "treatment")
pwc.male.high <- pwc[pwc$gender == "male" & pwc$risk == "high", ]

ggboxplot(
  headache, x = "treatment", y = "pain_score",
  color = "risk", palette = "jco", facet.by = "gender",
  xlab = "Treatment", ylab = "Headache pain score"
) +
  stat_pvalue_manual(
    pwc.male.high, color = "risk", linetype = "risk", hide.ns = TRUE,
    tip.length = 0, step.increase = 0.1
  ) +
  labs(
    subtitle = get_test_label(res.aov, detailed = TRUE),
    caption = get_pwc_label(pwc)
  )

A boxplot of migraine pain score by treatment, coloured by risk and faceted by male and female, with the three-way ANOVA F(2,60)=7.41, p=0.001, generalized eta-squared 0.20 in the subtitle and significance brackets for treatment X versus Y and X versus Z drawn over the high-risk males.

C’est la figure à rapporter : le F de l’ANOVA à trois facteurs, ses degrés de liberté, sa p-value et sa taille d’effet en haut, et les différences de traitement qui survivent à la décomposition marquées directement sur les hommes à risque élevé.

Rapporter le résultat

Une présentation de style publication débute par l’interaction triple, puis descend le long de la décomposition, chaque étape avec ses F, degrés de liberté, p-value — par exemple :

Une ANOVA à trois facteurs a été menée pour déterminer les effets du sexe, du risque et du traitement sur le score de douleur de la migraine. Les résidus étaient distribués normalement (Shapiro-Wilk, p > 0.05) et il y avait homogénéité des variances (test de Levene, p > 0.05). Il y avait une interaction triple statistiquement significative entre le sexe, le risque et le traitement, F(2, 60) = 7.41, p = 0.001, η² généralisé = 0.20. La significativité statistique a été acceptée à p < 0.025 pour les interactions doubles simples et les effets principaux simples simples. Il y avait une interaction double simple significative entre le risque et le traitement chez les hommes, F(2, 60) = 5.25, p = 0.008, mais pas chez les femmes, F(2, 60) = 2.87, p = 0.065. Chez les hommes, il y avait un effet principal simple simple significatif du traitement à risque élevé, F(2, 60) = 14.8, p < 0.0001, mais pas à risque faible, F(2, 60) = 0.66, p = 0.521. Toutes les comparaisons par paires ont utilisé une correction de Bonferroni ; chez les hommes à risque élevé, le traitement X différait significativement de Y et de Z, tandis que Y et Z ne différaient pas.

Une ANOVA à trois facteurs partitionne la variation totale de la variable de sortie en les parts que chaque terme explique plus ce qui reste — le total (T), les trois effets principaux (A, B, C), les trois interactions doubles (AB, AC, BC), l’interaction triple (ABC) et le résidu (R) :

\[SS_T = SS_A + SS_B + SS_C + SS_{AB} + SS_{AC} + SS_{BC} + SS_{ABC} + SS_R\]

Chaque somme des carrés devient un carré moyen en la divisant par ses degrés de liberté, \(MS = SS / df\), et la statistique F de chaque terme est son carré moyen rapporté au carré moyen résiduel :

\[F_{ABC} = \frac{MS_{ABC}}{MS_R}\]

Il y a donc un F par terme, chacun comparant la variation que ce terme explique à la variation inexpliquée (intra-cellule). Le terme triple \(F_{ABC}\) demande si l’interaction double entre deux facteurs change selon le troisième — la question pour laquelle un plan à trois facteurs existe.

Essayez en direct

Réalisez une ANOVA à trois facteurs complète sur un jeu de données différent — npk (un essai agricole classique : le yield d’une culture sous azote N, phosphate P et potassium K, chacun présent ou absent). Modifiez les facteurs ou la formule et relancez ; le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « J’ai une variable numérique et trois colonnes de groupement — réalise une ANOVA à trois facteurs sur mes données, vérifie les hypothèses, et si l’interaction triple est significative, guide-moi pour la décomposer » — elle répond avec du code rstatix que vous pouvez exécuter sur vos propres données, puis vous aide à lire les sept termes et les suivis par interaction double simple / simple simple. The runtime is the judge. Demander à Prova →

Problèmes courants

Cellules vides ou minuscules. Trois facteurs se multiplient vite — un plan 2 × 2 × 3 a déjà 12 cellules, et une combinaison de facteurs manquante rend l’interaction triple inestimable (ou follement instable). Exécutez table(mydata$A, mydata$B, mydata$C) d’abord ; chaque cellule a besoin d’au moins quelques observations.

Rapporter les effets principaux quand l’interaction triple est significative. Quand A:B:C est significative, les lignes d’effets principaux et d’interactions doubles sont trompeuses prises isolément — tout l’intérêt est que le motif d’ordre inférieur change selon le troisième facteur. Interprétez le terme triple d’abord et décomposez-le (interaction double simple → effet principal simple simple → comparaisons par paires) ; ne citez pas les effets principaux de premier niveau isolément.

Oublier le terme d’erreur regroupé. Dans la décomposition, passez error = model (le lm() complet à trois facteurs) à anova_test(). Cela emprunte l’erreur résiduelle et les degrés de liberté du modèle à trois facteurs, ce qui est plus puissant que de laisser chaque sous-ensemble estimer sa propre erreur — recommandé lorsque l’hypothèse d’égalité des variances est respectée.

Questions fréquentes

Une ANOVA à trois facteurs teste l’effet de trois facteurs de groupement — et toutes leurs interactions — sur une seule variable numérique. Elle estime trois effets principaux, trois interactions doubles et une interaction triple. Dans rstatix, c’est mydata %>% anova_test(outcome ~ A * B * C) ; en base R, summary(aov(outcome ~ A * B * C, data = mydata)).

Interprétez-la avant tout terme d’ordre inférieur. Une interaction A:B:C significative signifie que l’interaction double entre deux facteurs change elle-même selon les niveaux du troisième, donc les effets principaux et les interactions doubles sont trompeurs pris isolément. Décomposez-la en trois étapes : interactions doubles simples (l’interaction B:C à chaque niveau de A), puis effets principaux simples simples (l’effet d’un facteur dans chaque combinaison des deux autres), puis comparaisons par paires simples simples — chacune utilisant le terme d’erreur regroupé et un alpha corrigé de Bonferroni.

Une ANOVA à deux facteurs croise deux facteurs (deux effets principaux + une interaction). Une ANOVA à trois facteurs croise trois facteurs, ajoutant deux interactions doubles supplémentaires et une interaction triple — sept termes en tout. Utilisez un plan à trois facteurs lorsque chaque observation est classée selon trois variables de groupement et que vous soupçonnez que l’effet de l’une dépend de la combinaison des deux autres.

Ce sont les analyses de suivi pour une interaction triple significative. Une interaction double simple est l’interaction entre deux facteurs calculée à un niveau du troisième (par ex. risk:treatment pour les hommes uniquement). Un effet principal simple simple descend encore d’un cran : l’effet d’un seul facteur dans chaque combinaison des deux autres (par ex. l’effet de treatment pour les hommes à risque élevé). Les deux s’exécutent avec le terme error = model regroupé et un seuil de signification corrigé de Bonferroni.

Les mêmes que les tests à un et deux facteurs, appliquées aux cellules : les observations sont indépendantes, il n’y a aucune valeur aberrante extrême (identify_outliers()), les résidus sont distribués normalement (shapiro_test() sur les résidus du modèle + un Q-Q plot), et les cellules ont une variance égale (levene_test(y ~ A * B * C)). Des tailles de cellule équilibrées maintiennent aussi le test bien comporté ; pour un plan déséquilibré, anova_test() de rstatix utilise déjà par défaut les sommes de carrés de type II.

Testez vos connaissances

  1. Exécutez-la. Dans la cellule interactive ci-dessous, ajustez une ANOVA à trois facteurs du pain_score de la migraine par gender, risk et treatment avec toutes leurs interactions. Remplissez les blancs. Le terme gender:risk:treatment est-il significatif ?
  2. Conceptuel. Votre interaction triple est significative. Pourquoi est-il faux de rapporter uniquement « l’effet principal du traitement », et quelle est la séquence correcte des analyses de suivi ?

Remplissez les blancs pour que la formule soit pain_score ~ gender * risk * treatment — le * entre les trois facteurs demande chaque effet principal, chaque interaction double et l’interaction triple. Regardez la ligne gender:risk:treatment et ses colonnes p et p<.05. Pour la question 2, rappelez-vous qu’une interaction triple significative signifie qu’un motif double change selon le troisième facteur.

library(rstatix)
library(datarium)
data("headache", package = "datarium")
headache %>% anova_test(pain_score ~ gender * risk * treatment)
#> gender:risk:treatment is significant: F(2, 60) = 7.41, p = 0.001, ges = 0.20.

L’interaction gender:risk:treatment est significative (p = 0.001).

Pour la question 2 : une interaction triple significative signifie que l’effet du traitement dépend de la combinaison du sexe et du risque, donc un unique « effet principal du traitement » moyenne une relation qui change réellement. Décomposez-la plutôt : interactions doubles simples (risk:treatment dans chaque sexe) → effets principaux simples simples (treatment dans chaque cellule sexe × risque) → comparaisons par paires simples simples, chacune avec le terme d’erreur regroupé et une correction de Bonferroni.

AstuceQuel test, quand ?

Conclusion

Vous pouvez désormais réaliser et interpréter une ANOVA à trois facteurs dans R de deux façons : la fonction soignée anova_test() de rstatix (avec une taille d’effet ges par terme) et la fonction classique aov() + summary() de base R. Le résultat phare est l’interaction triple : lorsqu’elle est significative — comme elle l’était pour le sexe, le risque et le traitement sur la douleur migraineuse — les facteurs ne se combinent pas de façon additive, donc vous l’interprétez d’abord et la décomposez via des interactions doubles simples, des effets principaux simples simples et des comparaisons par paires simples simples. Vérifiez les hypothèses — pas de valeurs aberrantes extrêmes, des résidus normaux (shapiro_test) et une variance égale (levene_test) — et placez les différences survivantes sur le graphique avec stat_pvalue_manual() pour que la figure se rapporte d’elle-même.

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 à trois facteurs dans R : trois facteurs et leur
    interaction},
  date = {2026-06-23},
  url = {https://www.datanovia.com/learn/biostatistics/anova/three-way-anova-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“ANOVA à trois facteurs dans R : trois facteurs et leur interaction.” 2026. June 23. https://www.datanovia.com/learn/biostatistics/anova/three-way-anova-in-r.