Projet d’Analyse de la Variance (ANOVA)

Partie pratique : Modélisation de la croissance de plantes

Tamsir Ndong & Khadidiatou Diakhaté · G8 — ISE2

02 mars 2026

1 Contexte et objectifs

1.1 Description de l’expérimentation

On observe la hauteur de plantes (variable réponse) selon :

Les mesures sont réalisées sur les mêmes plantes à chaque répétition
il s’agit donc d’un plan à mesures répétées (facteur Répétition intra-sujet), avec deux facteurs inter-sujets (Terreau et Variété).

1.2 Objectif

Tester si la croissance (hauteur) est expliquée par :

2 Importation et structuration des données

2.1 Base initiale (format brut)

La base fournie initialement dans Excel n’était pas directement exploitable pour une analyse ANOVA / mesures répétées, car elle était organisée sous une forme “tableau de saisie” :
- les colonnes représentaient des mesures de hauteur à différents temps (répétitions) et par type de terreau,
- avec des séparations (colonnes vides) entre blocs de terreau,
- et sans structure explicite de type Sujet × Terreau × Variété.

Or, pour réaliser une analyse statistique, on a besoin d’un format “tidy” où : - chaque plante (Sujet) est identifiée, - les facteurs expérimentaux (Terreau, Variété) sont clairement présents, - et les mesures répétées (Rep1…Rep4) sont stockées proprement.

2.2 Construction d’une base structurée (format large / wide)

Nous avons donc restructuré la base initiale pour obtenir une table dite wide (une ligne par sujet) avant l’importation, contenant :

# Packages
library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)

# Import (adapter le chemin si besoin)
df <- readxl::read_excel("dataset.xlsx")

# Vérifications rapides
dim(df)
## [1] 92  7
names(df)
## [1] "Sujet"   "Variété" "Terreau" "Rep1"    "Rep2"    "Rep3"    "Rep4"
head(df, 3)

Les données sont donc initialement importées au format large : chaque ligne correspond à une plante (Sujet), caractérisée par son type de terreau et sa variété, avec quatre mesures répétées de la hauteur (Rep1 à Rep4)

2.3 Passage au format long

Pour l’ANOVA à mesures répétées (ou modèle mixte), le format attendu est plutôt le format long :
chaque ligne correspond à une observation unique, c’est-à-dire :

Sujet × Terreau × Variété × Répétition → Hauteur

Nous avons donc “empilé” les colonnes Rep1…Rep4 dans une seule colonne Repetition, et placé les valeurs dans une colonne Hauteur.

dat_long_raw <- df %>%
  pivot_longer(
    cols = starts_with("Rep"),
    names_to = "Repetition",
    values_to = "Hauteur"
  ) %>%
  mutate(
    Sujet = factor(Sujet),
    Terreau = factor(Terreau),
    Variete = factor(`Variété`),
    Repetition = factor(Repetition, levels = c("Rep1","Rep2","Rep3","Rep4"))
  ) %>%
  select(Sujet, Terreau, Variete, Repetition, Hauteur)

# Checks
dim(dat_long_raw)
## [1] 368   5
head(dat_long_raw, 8)
# 4 mesures par sujet ?
table(table(dat_long_raw$Sujet))
## 
##  4 
## 92
# % de valeurs manquantes
mean(is.na(dat_long_raw$Hauteur))
## [1] 0.2336957

3 Statistiques descriptives

3.1 Effectifs et valeurs manquantes par cellule

cell_counts <- dat_long_raw %>%
  group_by(Terreau, Variete, Repetition) %>%
  summarise(
    n_total = n(),
    n_obs   = sum(!is.na(Hauteur)),
    n_na    = sum(is.na(Hauteur)),
    p_na    = mean(is.na(Hauteur)),
    .groups = "drop"
  )

cell_counts

Le tableau des effectifs par cellule met en évidence une proportion non négligeable de valeurs manquantes, avec une forte hétérogénéité selon la répétition. La proportion de données manquantes augmente au fil des répétitions, ce qui introduit un déséquilibre longitudinal dans le plan expérimental. Pour cette raison, l’analyse inférentielle sera réalisée à l’aide d’un modèle mixte, plus adapté aux mesures répétées en présence de données incomplètes, plutôt qu’une ANOVA classique nécessitant souvent des données complètes par sujet.

3.2 Statistiques générales (sur les valeurs observées)

desc_cell <- dat_long_raw %>%
  group_by(Terreau, Variete, Repetition) %>%
  summarise(
    n      = sum(!is.na(Hauteur)),
    mean   = mean(Hauteur, na.rm = TRUE),
    sd     = sd(Hauteur, na.rm = TRUE),
    median = median(Hauteur, na.rm = TRUE),
    IQR    = IQR(Hauteur, na.rm = TRUE),
    min    = min(Hauteur, na.rm = TRUE),
    max    = max(Hauteur, na.rm = TRUE),
    .groups = "drop"
  )

desc_cell

Les statistiques descriptives par cellule (Terreau × Variété × Répétition) montrent une différence nette entre les variétés : à la première répétition, Var2 présente des hauteurs moyennes proches de 39–40, contre environ 28–29 pour Var1, et ce quel que soit le terreau. Les hauteurs varient également fortement selon la répétition, avec une évolution non monotone (baisse autour de Rep3 puis remontée à Rep4). Les écarts entre Var1 et Var2 ne sont pas constants selon la répétition, ce qui suggère une interaction Variété × Répétition. À l’inverse, les différences entre types de terreau apparaissent relativement modestes. Enfin, certaines cellules présentent de faibles effectifs en raison des valeurs manquantes, justifiant l’utilisation d’un modèle mixte pour l’analyse inférentielle. Essayons de visualiser cela

3.3 Effet du type de terreau sur la hauteur des plantes

library(dplyr)
library(ggplot2)

# Résumé
sum_terreau <- dat_long_raw %>%
  group_by(Terreau) %>%
  summarise(
    n = n(),
    mean = mean(Hauteur, na.rm = TRUE),
    sd = sd(Hauteur, na.rm = TRUE),
    se = sd / sqrt(n),
    .groups = "drop"
  )

# Graphique
ggplot(sum_terreau, aes(x = Terreau, y = mean, fill = Terreau)) +
  geom_col(color = "black", width = 0.6) +
  geom_errorbar(aes(ymin = mean - se, ymax = mean + se),
                width = 0.2) +
  labs(title = "Hauteur moyenne selon le terreau",
       y = "Hauteur moyenne (cm)") +
  theme_minimal() +
  theme(legend.position = "none")

Le graphique des hauteurs moyennes selon le type de terreau montre qu’en moyenne, le terreau Ca est associé à la hauteur moyenne la plus élevée.

Les terreaux An et Ma présentent des moyennes proches l’une de l’autre.

Les écarts entre les trois types de terreau restent modérés et les barres d’erreur se chevauchent partiellement, suggérant des différences visuellement limitées à ce stade descriptif. ## Effet de la variété sur la hauteur des plantes

3.4 Effet de la variété sur la hauteur des plantes

sum_variete <- dat_long_raw %>%
  group_by(Variete) %>%
  summarise(
    n = n(),
    mean = mean(Hauteur, na.rm = TRUE),
    sd = sd(Hauteur, na.rm = TRUE),
    se = sd / sqrt(n),
    .groups = "drop"
  )

ggplot(sum_variete, aes(x = Variete, y = mean, fill = Variete)) +
  geom_col(color = "black", width = 0.6) +
  geom_errorbar(aes(ymin = mean - se, ymax = mean + se),
                width = 0.2) +
  labs(title = "Hauteur moyenne selon la variété",
       y = "Hauteur moyenne (cm)") +
  theme_minimal() +
  theme(legend.position = "none")

Le graphique des hauteurs moyennes selon la variété montre qu’en moyenne, la variété Var2 présente une hauteur moyenne supérieure à celle de Var1. À ce stade descriptif, il apparaît donc que les plants de la variété Var2 tendent à être plus hauts que ceux de la variété Var1.

3.5 Effet du type de terreau et de la variété sur la hauteur des plantes

sum_TV <- dat_long_raw %>%
  group_by(Terreau, Variete) %>%
  summarise(
    n = n(),
    mean = mean(Hauteur, na.rm = TRUE),
    sd = sd(Hauteur, na.rm = TRUE),
    se = sd / sqrt(n),
    .groups = "drop"
  )

ggplot(sum_TV, aes(x = Terreau, y = mean, fill = Variete)) +
  geom_col(position = position_dodge(0.8),
           color = "black", width = 0.7) +
  geom_errorbar(aes(ymin = mean - se, ymax = mean + se),
                position = position_dodge(0.8),
                width = 0.2) +
  labs(title = "Hauteur moyenne selon Terreau et Variété",
       y = "Hauteur moyenne (cm)",
       fill = "Variété") +
  theme_minimal()

Le graphique des hauteurs moyennes selon le terreau et la variété met en évidence une supériorité systématique de la variété Var2 par rapport à Var1 en moyenne pour les trois types de terreau.

Le terreau Ca semble associé aux hauteurs moyennes les plus élevées, bien que les différences entre terreaux restent modérées.

Les écarts entre les deux variétés apparaissent relativement similaires quel que soit le type de terreau, et les barres d’erreur se chevauchent partiellement.

3.6 Profils des moyennes

sum_prof <- dat_long_raw %>%
  group_by(Terreau, Variete, Repetition) %>%
  summarise(
    n = sum(!is.na(Hauteur)),
    mean = mean(Hauteur, na.rm = TRUE),
    sd = sd(Hauteur, na.rm = TRUE),
    se = sd / sqrt(n),
    .groups = "drop"
  )

p_prof <- ggplot(sum_prof, aes(x = Repetition, y = mean, group = Variete, color = Variete)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = 0.12) +
  facet_wrap(~ Terreau) +
  theme_minimal() +
  labs(
    title = "Profil de croissance : hauteur moyenne par répétition",
    subtitle = "Barres d'erreur : ± 1 erreur standard (SE)",
    x = "Répétition",
    y = "Hauteur moyenne"
  )
p_prof

Le graphique des profils moyens met en évidence une variation des hauteurs selon la répétition, avec une baisse observable autour de Rep3 suivie d’une remontée à Rep4. Les deux variétés présentent des trajectoires non parallèles : l’écart entre Var2 et Var1 varie selon le moment de mesure, suggérant que la différence entre variétés pourrait dépendre du temps. Les profils apparaissent globalement similaires entre les trois types de terreau, ce qui laisse penser que l’effet du terreau pourrait être plus modéré visuellement.

4 Diagnostics et vérification des hypothèses

4.1 Valeurs aberrantes (IQR) + boxplots

library(rstatix)
dat_long_raw %>%
  group_by(Variete, Terreau, Repetition) %>%
  identify_outliers(Hauteur)
outliers_bounds <- dat_long_raw %>%
  group_by(Terreau, Variete, Repetition) %>%
  summarise(
    Q1 = quantile(Hauteur, 0.25, na.rm = TRUE),
    Q3 = quantile(Hauteur, 0.75, na.rm = TRUE),
    IQR = IQR(Hauteur, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    lower = Q1 - 1.5*IQR,
    upper = Q3 + 1.5*IQR
  )

out_points <- dat_long_raw %>%
  left_join(outliers_bounds, by = c("Terreau","Variete","Repetition")) %>%
  filter(!is.na(Hauteur)) %>%
  filter(Hauteur < lower | Hauteur > upper) %>%
  select(Sujet, Terreau, Variete, Repetition, Hauteur, lower, upper) %>%
  arrange(Terreau, Variete, Repetition)

out_points

La méthode IQR (1,5 × IQR) aussi utilisé dans la fonction identify_outliers() a permis d’identifier 22 observations atypiques. Ces valeurs se situent majoritairement en dessous de la borne inférieure, correspondant à des hauteurs relativement faibles. Elles sont réparties sur plusieurs combinaisons de facteurs et ne concernent strictement pas un groupe spécifique.

ggplot(dat_long_raw, aes(x = interaction(Terreau, Variete), y = Hauteur)) +
  geom_boxplot(na.rm = TRUE) +
  facet_wrap(~ Repetition, nrow = 2) +
  theme_minimal() +
  labs(
    title = "Boxplots par groupe (Terreau × Variété) — par répétition",
    x = "Groupe",
    y = "Hauteur"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

4.2 Correction (winsorisation IQR)

dat_wins <- dat_long_raw %>%
  left_join(outliers_bounds, by = c("Terreau","Variete","Repetition")) %>%
  mutate(
    is_outlier = !is.na(Hauteur) & (Hauteur < lower | Hauteur > upper),
    Hauteur_corr = case_when(
      is.na(Hauteur) ~ NA_real_,
      Hauteur < lower ~ lower,
      Hauteur > upper ~ upper,
      TRUE ~ Hauteur
    )
  ) %>%
  select(Sujet, Terreau, Variete, Repetition, Hauteur, Hauteur_corr, is_outlier)

sum(dat_wins$is_outlier, na.rm = TRUE)
## [1] 22

Les observations atypiques ont été identifiées par la règle de Tukey (bornes = Q1 − 1,5×IQR et Q3 + 1,5×IQR) à l’intérieur de chaque cellule (Terreau × Variété × Répétition).
Plutôt que de supprimer ces valeurs, une winsorisation a été appliquée : toute valeur inférieure à la borne basse a été remplacée par la borne basse, et toute valeur supérieure à la borne haute a été remplacée par la borne haute.
Dans ce qui suit, nous allons faire les tests sur cette base ainsi que sur la base non winsorisée

4.3 Normalité exploratoire des observations (Shapiro par cellule et QQ-plots)

shap <- dat_long_raw %>%
  group_by(Terreau, Variete, Repetition) %>%
  summarise(
    n = sum(!is.na(Hauteur)),
    p_value = ifelse(
      n >= 3,
      shapiro.test(Hauteur[!is.na(Hauteur)])$p.value,
      NA_real_
    ),
    .groups = "drop"
  )
shap_wins <- dat_wins %>%
  group_by(Terreau, Variete, Repetition) %>%
  summarise(
    n = sum(!is.na(Hauteur_corr)),
    p_value = ifelse(
      n >= 3,
      shapiro.test(Hauteur_corr[!is.na(Hauteur_corr)])$p.value,
      NA_real_
    ),
    .groups = "drop"
  )
print ("Shapiro par cellule pour les données non winsorisées")
## [1] "Shapiro par cellule pour les données non winsorisées"
shap
print ("Shapiro par cellule pour les données winsorisées")
## [1] "Shapiro par cellule pour les données winsorisées"
shap_wins

Le test de Shapiro-Wilk appliqué par cellule (Terreau × Variété × Répétition) met en évidence quelques déviations ponctuelles à la normalité (p < 0,05), principalement pour la variété Var1 à certaines répétitions. Cependant, plusieurs cellules ont des effectifs faibles (parfois n ≤ 10), rendant le test instable et très sensible. Essayons donc la visualisation avec les QQ-plots.

# QQ-plots des observations par cellule
library(ggplot2)

dat_obs_complete_raw <- dat_long_raw %>%
  filter(!is.na(Hauteur))

ggplot(dat_obs_complete_raw, aes(sample = Hauteur)) +
  stat_qq() +
  stat_qq_line(color = "green") +
  facet_grid(Terreau + Variete ~ Repetition) +
  theme_minimal() +
  labs(
    title = "QQ-plots des observations par cellule pour les données non winsorisées",
    subtitle = "Terreau × Variété × Répétition",
    x = "Quantiles théoriques",
    y = "Quantiles observés"
  )

# QQ-plots des observations par cellule
library(ggplot2)

dat_obs_complete <- dat_wins %>%
  filter(!is.na(Hauteur_corr))

ggplot(dat_obs_complete, aes(sample = Hauteur_corr)) +
  stat_qq() +
  stat_qq_line(color = "green") +
  facet_grid(Terreau + Variete ~ Repetition) +
  theme_minimal() +
  labs(
    title = "QQ-plots des observations par cellule pour les données winsorisées",
    subtitle = "Terreau × Variété × Répétition",
    x = "Quantiles théoriques",
    y = "Quantiles observés"
  )

Les diagnostics graphiques suggèrent une normalité globalement acceptable, tant au niveau exploratoire des observations qu’au niveau des résidus du modèle mixte. Les écarts observés dans les queues restent modérés. Bien que la normalité des observations soit vérifiée ici, il est juste un contrôle exploratoire, l’hypothèse déterminante concerne surtout la normalité des résidus qui sera abordée dans une section à venir.

4.4 Homogénéité des variances (Levene)

4.4.1 Sur les données non winsorisées

dat_long_raw %>%
  group_by(Repetition) %>%
  levene_test(Hauteur ~ Variete*Terreau)

Le test de Levene appliqué à chaque répétition pour comparer les variances entre les groupes (Terreau × Variété) ne met pas en évidence d’hétérogénéité significative au seuil de 5% (toutes les p-values > 0.05). Toutefois, à Rep4, la p-value (0.078) est plus faible et suggère une possible hétérogénéité modérée, sans atteindre le seuil de significativité.

4.4.2 Sur les données winsorisées

dat_wins %>%
  group_by(Repetition) %>%
  levene_test(Hauteur_corr ~ Variete*Terreau)

Sur les données winsorisées, le test de Levene par répétition ne détecte pas d’hétérogénéité significative des variances à Rep1 et Rep2 (p > 0.05). En revanche, l’hypothèse d’homogénéité des variances est rejetée à Rep3 (p = 0.022) et Rep4 (p = 0.047), indiquant une hétéroscédasticité entre les groupes Terreau × Variété à ces temps de mesure.

4.5 Sphéricité

La sphéricité est une hypothèse requise dans l’ANOVA à mesures répétées “classique” (approche GLM), et peut être évaluée par le test de Mauchly, avec corrections (Greenhouse–Geisser / Huynh–Feldt) en cas de violation. Dans notre analyse principale, nous utilisons un modèle mixte (lmer; expliqué plus bas) qui modélise directement la dépendance intra-sujet via un effet aléatoire de sujet ; dans ce cadre, l’inférence ne repose pas strictement sur l’hypothèse de sphéricité, ce qui rend le test de Mauchly non indispensable.

5 ANOVA mixte (modèle linéaire mixte)

5.1 Justification et cadre théorique du modèle mixte

Contexte méthodologique

Dans cette étude, la hauteur des plantes est mesurée à plusieurs reprises (Rep1 à Rep4) sur les mêmes individus.
Il s’agit donc d’un dispositif à mesures répétées, impliquant une dépendance naturelle entre observations d’un même sujet.

Les mesures réalisées sur une même plante sont corrélées : elles partagent des caractéristiques propres à cet individu (niveau de croissance initial, vigueur, conditions micro-environnementales).
Cette corrélation viole l’hypothèse d’indépendance requise par une ANOVA classique.

L’exploration des données met également en évidence :

  • la présence de valeurs manquantes, induisant un plan longitudinal déséquilibré ;
  • une homogénéité des variances globalement acceptable mais avec quelques hétérogénéités ponctuelles ;
  • la nécessité d’analyser simultanément les effets fixes (Terreau, Variété, Répétition) et leurs interactions.

Dans ce contexte, l’ANOVA à mesures répétées “classique” (approche GLM) apparaît moins adaptée, car :

  • elle gère difficilement les données manquantes,
  • elle exige souvent des données complètes par sujet,
  • elle repose sur l’hypothèse de sphéricité.

Nous privilégions donc un modèle linéaire mixte, plus flexible et robuste.


Principe du modèle linéaire mixte

Un modèle mixte combine :

Des effets fixes

Ils correspondent aux facteurs expérimentaux d’intérêt :

  • Terreau (Ma, Ca, An),
  • Variété (Var1, Var2),
  • Répétition (Rep1 à Rep4),
  • et leurs interactions.

Ces effets décrivent les variations moyennes de la hauteur selon les conditions expérimentales.

Des effets aléatoires

Ils capturent la variabilité propre aux individus (plantes).

Même si deux plantes appartiennent au même groupe expérimental, elles peuvent présenter des niveaux initiaux différents.
Le modèle introduit donc un intercept aléatoire par sujet, permettant à chaque plante d’avoir son propre niveau moyen.


Formulation mathématique

On note \(Y_{ijkl}\) la hauteur observée pour :

  • le sujet (plante) \(l\),
  • le terreau \(i\),
  • la variété \(j\),
  • la répétition \(k\).

Le modèle mixte s’écrit :

\[ Y_{ijkl} = \mu + T_i + V_j + R_k + (TV)_{ij} + (TR)_{ik} + (VR)_{jk} + (TVR)_{ijk} + b_l + \varepsilon_{ijkl} \]

où :

  • \(\mu\) est la moyenne générale,
  • \(T_i, V_j, R_k\) sont les effets fixes,
  • \(b_l\) est l’effet aléatoire du sujet \(l\),
  • \(\varepsilon_{ijkl}\) est l’erreur résiduelle.

On suppose :

\[ b_l \sim \mathcal{N}(0, \sigma_b^2), \qquad \varepsilon_{ijkl} \sim \mathcal{N}(0, \sigma^2), \]

avec indépendance entre \(b_l\) et \(\varepsilon_{ijkl}\).

Forme utilisée dans l’analyse

Dans R, le modèle estimé est :

\[ Hauteur \sim Terreau \times Variete \times Repetition + (1|Sujet) \]

Le terme (1|Sujet) signifie qu’un intercept aléatoire est associé à chaque plante, ce qui permet :

  • de modéliser explicitement la corrélation intra-sujet,
  • de conserver les sujets partiellement observés,
  • d’obtenir une estimation robuste des effets fixes.

Intuition finale

Le modèle mixte permet ainsi de séparer :

  1. les différences dues aux facteurs expérimentaux (effets fixes),
  2. les différences dues à la variabilité naturelle entre plantes (effet aléatoire).

Il constitue donc le cadre le plus approprié pour analyser des données longitudinales à mesures répétées dans un contexte expérimental partiellement déséquilibré.

5.1.1 Application du modèle

5.1.2 Sur les données non winsorisées

library(lme4)
library(lmerTest)

mod_raw <- lmer(Hauteur ~ Terreau*Variete*Repetition + (1|Sujet), data = dat_long_raw)
anova(mod_raw, type = 3)

Le modèle mixte, incluant un effet aléatoire Sujet, met en évidence un effet significatif de la Variété sur la hauteur des plantes (\(F(1, 258) = 14.14\), \(p < 0.001\)). Cela indique que la hauteur moyenne diffère significativement entre les deux variétés étudiées.

Un effet significatif de la Répétition est également observé (\(F(3, 258) = 9.70\), \(p < 0.001\)), montrant que la hauteur des plantes évolue au cours du temps.

En revanche, le facteur Terreau n’est pas significatif (\(F(2, 258) = 0.06\), \(p = 0.94\)) et n’explique pas la variation de la hauteur.

Les interactions impliquant le terreau — Terreau × Variété, Terreau × Répétition et Terreau × Variété × Répétition — ne sont pas significatives (\(p > 0.05\)). Cela suggère que le type de terreau ne modifie ni l’effet de la variété ni la dynamique temporelle de croissance.

En revanche, l’interaction Variété × Répétition est hautement significative (\(F(3, 258) = 9.88\), \(p < 0.001\)). Cela indique que l’évolution de la hauteur au fil des répétitions dépend de la variété : les trajectoires de croissance des deux variétés ne sont pas parallèles.

En résumé, dans les données non winsorisées, la croissance des plantes dépend principalement de la variété, du temps, et de leur interaction, tandis que le terreau ne présente pas d’effet significatif.

5.1.3 Sur les données winsorisées

library(lme4)
library(lmerTest)

mod <- lmer(Hauteur_corr ~ Terreau*Variete*Repetition + (1|Sujet), data = dat_wins)
anova(mod, type = 3)

Les conclusions sur les effets significatifs (Variété, Répétition et Variété×Répétition) restent qualitativement les mêmes sur les données non winsorisées, suggérant une robustesse globale de l’interprétation vis-à-vis des valeurs atypiques. La winsorisation n’a donc pas modifié les conclusions qualitatives : Terreau reste non significatif, tandis que Variété, Répétition et l’interaction Variété×Répétition demeurent hautement significatifs. En revanche, les statistiques F augmentent et les p-values diminuent après correction, suggérant que la winsorisation a limité l’influence de valeurs extrêmes et renforcé la détection des effets.

6 Diagnostic global du modèle mixte (vérification des hypothèses préANOVA)

6.1 Sur les données non winsorisées

# --- Diagnostics globaux du modèle mixte ---
par(mfrow = c(2, 2))

# 1) Résidus vs valeurs ajustées (homoscédasticité / forme)
plot(fitted(mod_raw), resid(mod_raw),
     xlab = "Valeurs ajustées", ylab = "Résidus",
     main = "Résidus vs ajustées")
abline(h = 0, lty = 2)

# 2) QQ-plot des résidus du modèle global (normalité)
qqnorm(resid(mod_raw), main = "QQ-plot des résidus (modèle global)")
qqline(resid(mod_raw))

# 3) Histogramme des résidus
hist(resid(mod_raw), main = "Histogramme des résidus", xlab = "Résidus")

mod_data <- model.frame(mod_raw)

# 4) Résidus vs répétition (check visuel)
boxplot(resid(mod_raw) ~ mod_data$Repetition,
        main = "Résidus par répétition", xlab = "Répétition", ylab = "Résidus")

par(mfrow = c(1, 1))

L’examen des diagnostics du modèle global sur les données non winsorisées montre que :

Ainsi, bien que les hypothèses soient globalement acceptables, la présence de valeurs atypiques peut influencer légèrement la normalité des résidus.

6.2 Sur les données winsorisées

# Data réellement utilisée par le modèle (sans NA)
mf <- model.frame(mod)

# Résidus et fitted alignés avec mf
res <- resid(mod)
fit <- fitted(mod)

par(mfrow = c(2, 2))

# 1) Résidus vs ajustées
plot(fit, res,
     xlab = "Valeurs ajustées", ylab = "Résidus",
     main = "Résidus vs ajustées")
abline(h = 0, lty = 2)

# 2) QQ-plot
qqnorm(res, main = "QQ-plot des résidus (modèle global)")
qqline(res)

# 3) Histogramme
hist(res, main = "Histogramme des résidus", xlab = "Résidus")

# 4) Résidus par répétition (✅ plus d'erreur)
boxplot(res ~ mf$Repetition,
        main = "Résidus par répétition",
        xlab = "Répétition", ylab = "Résidus")

par(mfrow = c(1, 1))

Après winsorisation, les diagnostics du modèle sont globalement améliorés :

Ainsi, la winsorisation a permis d’atténuer l’influence des valeurs extrêmes tout en conservant des conclusions qualitativement similaires.

7 Post-hoc / effets simples

Les diagnostics seront présentés sur les données winsorisées afin de réduire l’influence des valeurs extrêmes ; les résultats restant cohérents avec ceux obtenus sur les données brutes, cette approche est retenue pour une analyse plus robuste.

L’interaction Variété × Répétition étant significative (p < 0.001), l’interprétation des effets principaux isolés devient insuffisante. En effet, l’effet de la variété dépend du moment de mesure. Il est donc nécessaire de réaliser des comparaisons post-hoc afin d’examiner les effets simples, notamment la comparaison des variétés à chaque répétition, ainsi que l’évolution des répétitions au sein de chaque variété. Ces analyses complémentaires permettent d’identifier précisément à quels moments les différences sont significatives.

library(rstatix)

dat_post <- dat_wins %>%
  transmute(Sujet, Terreau, Variete, Repetition, Hauteur = Hauteur_corr)

# 8.1 Variete à chaque répétition (Var1 vs Var2)
pwc_var_by_rep <- dat_post %>%
  group_by(Repetition) %>%
  t_test(Hauteur ~ Variete, detailed = TRUE) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance("p.adj")

pwc_var_by_rep

Les comparaisons post-hoc (tests t par répétition avec correction de Bonferroni) montrent que la différence entre les variétés est significative uniquement à la première répétition.
À Rep1, la hauteur moyenne de Var2 (40.21 cm) est nettement supérieure à celle de Var1 (28.42 cm), avec une différence moyenne de −11.78 cm (Var1 − Var2), statistiquement significative (t = −8.99, p = 5.58 × 10⁻¹⁴ ; IC95% [−14.39 ; −9.18]).

En revanche, aucune différence significative n’est observée aux répétitions suivantes :
- Rep2 (p = 0.787),
- Rep3 (p = 0.0868),
- Rep4 (p = 0.585).

Les moyennes deviennent alors beaucoup plus proches entre les deux variétés.
Ces résultats suggèrent que l’écart initial marqué entre les variétés s’atténue au fil du temps, ce qui est cohérent avec l’interaction significative Variété × Répétition mise en évidence par le modèle mixte.

# 8.2 Répétition dans chaque variété (paired = TRUE)
pwc_rep_by_var <- dat_post %>%
  group_by(Variete) %>%
  pairwise_t_test(
    Hauteur ~ Repetition,
    paired = FALSE,
    p.adjust.method = "bonferroni"
  )

pwc_rep_by_var

Les comparaisons post-hoc du facteur intra-sujet Répétition ont été réalisées séparément pour chaque variété, avec ajustement des p-values (méthode de Bonferroni).

Pour Var1, plusieurs différences significatives sont observées :
Rep1 diffère de Rep2 et Rep4, Rep2 diffère de Rep3, et Rep3 diffère de Rep4 (p_adj < 0.05).
En revanche, Rep1 est comparable à Rep3, et Rep2 est comparable à Rep4 (p_adj > 0.05).
Ces résultats suggèrent une évolution temporelle non monotone de la hauteur pour Var1.

Pour Var2, la répétition Rep1 diffère significativement de Rep2 et Rep3 (p_adj < 0.05), ce qui indique une hauteur plus élevée au premier temps, suivie d’une diminution aux temps suivants.
En revanche, la différence entre Rep1 et Rep4 n’est pas significative après correction de Bonferroni (p_adj = 0.055).
Par ailleurs, Rep2 diffère de Rep3 (p_adj < 0.05), Rep2 est comparable à Rep4 (p_adj > 0.05), et Rep3 diffère de Rep4 (p_adj < 0.05).

Ces résultats confirment que l’effet du temps varie selon la variété, ce qui est cohérent avec l’interaction significative Variété × Répétition mise en évidence par le modèle mixte.

Le facteur Terreau n’étant pas significatif dans le modèle ANOVA (p > 0.05), et aucune interaction impliquant ce facteur n’étant significative, des comparaisons post-hoc n’ont pas été réalisées pour ce facteur. Les tests post-hoc ne sont en effet pertinents que lorsqu’un effet principal ou une interaction associée est significatif.

8 Présentation des résultats

8.1 Résultats du modèle mixte

L’analyse a été réalisée à l’aide d’un modèle linéaire mixte intégrant un effet aléatoire Sujet afin de tenir compte de la structure à mesures répétées.

Cette analyse a mis en évidence :

  • Aucun effet significatif du facteur Terreau
  • Un effet significatif du facteur Variété
  • Un effet significatif du facteur Répétition (temps)
  • Une interaction significative Variété × Répétition

Aucune interaction impliquant le facteur Terreau n’est statistiquement significative.

8.2 Analyse des effets simples (post-hoc)

L’interaction Variété × Répétition étant significative, l’interprétation des effets principaux isolés n’est pas suffisante.

Des comparaisons post-hoc ont donc été réalisées afin de préciser la nature de cette interaction.

Les résultats montrent que :

  • La différence entre Var1 et Var2 est significative uniquement à la première répétition.
  • Aux répétitions suivantes, les différences entre variétés ne sont plus statistiquement significatives.
  • L’évolution temporelle diffère selon la variété : l’avantage initial observé pour une variété diminue progressivement au fil des répétitions.

8.3 Résultat central de l’étude

L’effet de la variété dépend du moment de mesure.

L’interaction significative indique que les trajectoires de croissance des variétés ne sont pas parallèles.

Ainsi, on ne peut pas conclure à un effet global constant de la variété :
c’est la combinaison Variété × Temps qui structure la dynamique observée.

8.4 Synthèse des effets observés

Les résultats indiquent que :

  • La croissance dépend principalement de la variété et du temps.
  • L’effet de la variété varie selon la répétition.
  • Le type de terreau n’a pas d’influence significative dans les conditions expérimentales étudiées.

Ces éléments constituent la base de l’interprétation scientifique développée dans la section suivante.

9 Conclusion

Cette étude avait pour objectif d’évaluer l’influence du terreau, de la variété et du temps sur la hauteur des plantes dans un dispositif à mesures répétées.

L’analyse par modèle linéaire mixte montre que :

Le résultat central réside dans l’interaction Variété × Répétition, indiquant que les trajectoires de croissance diffèrent selon le matériel génétique (variété).

Ainsi, la dynamique de croissance observée est principalement déterminée par l’interaction entre le facteur génétique (variété) et le temps (répétition), tandis que le type de terreau ne joue pas un rôle significatif dans les conditions expérimentales étudiées.