Chapitre 12 Indice L
du jaune d’oeuf
La démarche sera la même que celle des chapitres précédents. Il se peut qu’il y ait moins de commentaires.
Même jeu de données oeuf.csv
qui contient différentes mesures dont l’ évaluation de la coloration du jaune d’oeuf (Yolk Ligthness index) - indice L , mesurée en 5 séances. Mêmes traitements (régimes).
La question est de savoir si les différents régimes induisent des indices de luminosité de jaune d’oeuf significativement différents avec le temps.
Mais chaque traitement n’ayant pas été appliqué sur tous les groupes d’oiseaux, l’ANOVA à mesures répétées ne pourrait pas être appliquée. Nous comparerons les effets des traitements séance par séance, puis à l’aide d’une figure on appréciera s’il y a une évolution de cet indice en fonction du temps.
12.1 Les données
ljau <- read_csv("data/oeuf.csv")
ljau <- ljau %>%
select(seance, regime, no_oeuf, indljau) %>%
mutate(id = rep(1:30, 5), .before = 1) %>%
convert_as_factor(id, seance, regime)
Le tableau a été préalablement structuré en format long en Excel. J’ai ajouté un identifiant (id
) pour les échantillons des séances.
## Rows: 150
## Columns: 5
## $ id <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,~
## $ seance <fct> seance 1, seance 1, seance 1, seance 1, seance 1, seance 1, se~
## $ regime <fct> "Ba 0,25", "Ba 0,25", "Ba 0,25", "Ba 0,50", "Ba 0,50", "Ba 0,5~
## $ no_oeuf <dbl> 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3,~
## $ indljau <dbl> 66.700, 70.990, 67.490, 72.990, 64.910, 69.750, 53.510, 72.120~
12.2 Visualisation boxplots
bxp <- ggplot(ljau, aes(x = regime, y = indljau, fill = regime)) +
geom_boxplot() +
facet_grid(seance ~ .) +
theme(axis.text.x = element_text(angle = 90, color = "black", vjust = 0.5, hjust = 1)) +
ylab("Yolk lightness index") +
theme_bw()
bxp
=> Variations notables entre les traitements pour certaines séances.
12.3 Détection des valeurs aberrantes extrêmes
## [1] seance regime id no_oeuf indljau is.outlier is.extreme
## <0 rows> (or 0-length row.names)
=> Pas de valeurs aberrantes extrêmes pour toutes les séances.
12.4 Conditions de l’ANOVA
12.4.1 Normalité
Si les données sont normalement distribuées, la p-value de Shapiro-Wilk doit être supérieure à 0,05 pour chaque régime.
## # A tibble: 5 x 4
## seance variable statistic p
## <fct> <chr> <dbl> <dbl>
## 1 seance 1 indljau 0.919 0.0259
## 2 seance 2 indljau 0.902 0.00930
## 3 seance 3 indljau 0.870 0.00168
## 4 seance 4 indljau 0.965 0.411
## 5 seance 5 indljau 0.963 0.371
=> Normalité seulement pour les deux dernières séances 4 et 5. Mais ce test est destiné à être appliqué sur les résidus du modèle.
Créer des QQ-plots pour chaque point par séance
On explorera les données séances par séance pour palier au problème de normalité, sur les résidus.
12.4.2 Homogénéité des variances
## # A tibble: 5 x 5
## seance df1 df2 statistic p
## <fct> <int> <int> <dbl> <dbl>
## 1 seance 1 9 20 1.08 0.417
## 2 seance 2 9 20 0.559 0.814
## 3 seance 3 9 20 1.90 0.111
## 4 seance 4 9 20 0.688 0.712
## 5 seance 5 9 20 0.628 0.760
=> Toutes les valeurs p sont > 0.05 => toutes les variances sont homogènes.
12.5 ANOVA à 1 facteur séance par séance
12.5.1 Séance 1
## # A tibble: 6 x 7
## id seance regime no_oeuf indljau is.outlier is.extreme
## <fct> <fct> <fct> <dbl> <dbl> <lgl> <lgl>
## 1 7 seance 1 Ba 0,75 1 53.5 TRUE FALSE
## 2 25 seance 1 YC 1 80.0 TRUE FALSE
## 3 26 seance 1 YC 2 81.8 TRUE FALSE
## 4 28 seance 1 WC 1 83.8 TRUE FALSE
## 5 29 seance 1 WC 2 83.7 TRUE FALSE
## 6 30 seance 1 WC 3 79.8 TRUE FALSE
=> Pas d’observation extrême.
12.5.1.1 Le modèle
## Anova Table (Type II tests)
##
## Response: indljau
## Sum Sq Df F value Pr(>F)
## regime 837.92 9 5.1777 0.001075 **
## Residuals 359.63 20
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La p-value < 0.05 => différence significative entre les effets d’au moins 2 régimes sur cet indice à la séance 1.
## # A tibble: 1 x 3
## variable statistic p.value
## <chr> <dbl> <dbl>
## 1 residuals(lm1) 0.958 0.273
=> Normalité Okay !
12.5.1.2 Comparaisons par paires
Comparaisons des moyennes par paires, Student - Newman - Keuls.
cm1 <- (SNK.test(lm1, "regime", group = TRUE))$groups %>%
mutate(regime = rownames(.)) %>%
select(regime, indljau, groups) %>%
as_tibble()
cm1
## # A tibble: 10 x 3
## regime indljau groups
## <chr> <dbl> <chr>
## 1 WC 82.5 a
## 2 YC 77.4 ab
## 3 Ba 10 72.1 bc
## 4 Ba 0,50 69.2 bc
## 5 Ba 7,5 69.2 bc
## 6 Ba 5 68.5 bc
## 7 Ba 0,25 68.4 bc
## 8 Ba 1 67.9 bc
## 9 Ba 2,5 67.4 bc
## 10 Ba 0,75 62.8 c
12.5.1.3 Visualisation des groupes, bareplots avec labels
ggplot(data = cm1, mapping = aes(x = regime, y = indljau)) +
geom_bar(stat = "identity", color = "blue", fill = "grey", width = 0.6) +
geom_text(aes(label = groups), vjust = -0.5, size = 4) +
ylim(0, 83) +
xlab("Régimes") + ylab("Yolk lightness index") +
theme(axis.text.x = element_text(angle = 45, color = "black", vjust = 1, hjust = 1)) +
theme_bw()
12.5.2 Séance 2
12.5.2.1 Le modèle
## # A tibble: 1 x 7
## id seance regime no_oeuf indljau is.outlier is.extreme
## <fct> <fct> <fct> <dbl> <dbl> <lgl> <lgl>
## 1 5 seance 2 Ba 0,50 2 44.4 TRUE FALSE
=> Pas d’observation supossée extrême
## Anova Table (Type II tests)
##
## Response: indljau
## Sum Sq Df F value Pr(>F)
## regime 457.68 9 1.5385 0.2017
## Residuals 661.10 20
La p-value est > 0.05 => Pas de différence significative entre les effets des régimes.
## # A tibble: 1 x 3
## variable statistic p.value
## <chr> <dbl> <dbl>
## 1 residuals(lm2) 0.969 0.516
=> Normalité okay
12.5.2.2 Comparaisons par paires
Student - Newman - Keuls.
cm2 <- (SNK.test(lm2, "regime", group = TRUE))$groups %>%
mutate(regime = rownames(.)) %>%
select(regime, indljau, groups) %>%
as_tibble()
cm2
## # A tibble: 10 x 3
## regime indljau groups
## <chr> <dbl> <chr>
## 1 Ba 2,5 69.1 a
## 2 Ba 1 68.8 a
## 3 Ba 10 68.5 a
## 4 Ba 0,75 67.2 a
## 5 YC 67.2 a
## 6 Ba 7,5 64.6 a
## 7 Ba 5 63.6 a
## 8 Ba 0,25 62.9 a
## 9 WC 61.2 a
## 10 Ba 0,50 56.1 a
12.5.2.3 Visualisation des groupes
ggplot(data = cm2, mapping = aes(x = regime, y = indljau)) +
geom_bar(stat = "identity", color = "blue", fill = "grey", width = 0.6) +
ylim(0, 72) +
geom_text(aes(label = groups), vjust = -0.5, size = 4) +
xlab("Régimes") + ylab("Yolk lightness index") +
theme(axis.text.x = element_text(angle = 45, color = "black", vjust = 1, hjust = 1)) +
theme_bw()
12.5.3 Séance 3
## # A tibble: 5 x 7
## id seance regime no_oeuf indljau is.outlier is.extreme
## <fct> <fct> <fct> <dbl> <dbl> <lgl> <lgl>
## 1 1 seance 3 Ba 0,25 1 45.8 TRUE TRUE
## 2 2 seance 3 Ba 0,25 2 55.4 TRUE FALSE
## 3 28 seance 3 WC 1 70.9 TRUE FALSE
## 4 29 seance 3 WC 2 70.9 TRUE FALSE
## 5 30 seance 3 WC 3 70.9 TRUE FALSE
=> 1 observation aberrante extrême. Exclue => améliore la distribution des résidus.
12.5.3.1 Le modèle
## Anova Table (Type II tests)
##
## Response: indljau
## Sum Sq Df F value Pr(>F)
## regime 216.77 9 2.835 0.02673 *
## Residuals 161.42 19
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La p-value < 0.05 => Différence significative entre les effets d’au moins 2 régimes.
## # A tibble: 1 x 3
## variable statistic p.value
## <chr> <dbl> <dbl>
## 1 residuals(lm3) 0.948 0.164
=> Normalité satisfaite si la valeur extrême est exclue.
12.5.3.2 Comparaisons par paires
cm3 <- (SNK.test(lm3, "regime", group = TRUE))$groups %>%
mutate(regime = rownames(.)) %>%
select(regime, indljau, groups) %>%
as_tibble()
cm3
## # A tibble: 10 x 3
## regime indljau groups
## <chr> <dbl> <chr>
## 1 WC 70.9 a
## 2 YC 65.4 b
## 3 Ba 7,5 65.2 b
## 4 Ba 5 64.6 b
## 5 Ba 10 64.2 b
## 6 Ba 1 62.8 b
## 7 Ba 0,75 62.7 b
## 8 Ba 2,5 62.3 b
## 9 Ba 0,50 61.8 b
## 10 Ba 0,25 60.2 b
… Et la visualisation graphique :
ggplot(data = cm3, mapping = aes(x = regime, y = indljau)) +
geom_bar(stat = "identity", color = "blue", fill = "grey", width = 0.6) +
geom_text(aes(label = groups), vjust = -0.5, size = 4) +
ylim(0, 72) +
xlab("Régimes") + ylab("Yolk lightness index") +
theme(axis.text.x = element_text(angle = 45, color = "black", vjust = 1, hjust = 1)) +
theme_bw()
Les deux groupes sont presqu’évidents, mais les conditions de l’ANOVA ne nous permettent pas de valider cette interprétation. …
12.5.4 Séance 4
12.5.4.1 Le modèle
## Anova Table (Type II tests)
##
## Response: indljau
## Sum Sq Df F value Pr(>F)
## regime 148.91 9 2.6285 0.03447 *
## Residuals 125.89 20
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La p-value > 0.05 => Pas de différence significative entre les effets des régimes.
## # A tibble: 1 x 3
## variable statistic p.value
## <chr> <dbl> <dbl>
## 1 residuals(lm4) 0.960 0.318
12.5.4.2 Comparaisons par paires
cm4 <- (SNK.test(lm4, "regime", group = TRUE))$groups %>%
mutate(regime = rownames(.)) %>%
select(regime, indljau, groups) %>%
as_tibble()
cm4
## # A tibble: 10 x 3
## regime indljau groups
## <chr> <dbl> <chr>
## 1 Ba 0,50 69.1 a
## 2 Ba 10 69.1 a
## 3 Ba 1 68.7 a
## 4 Ba 0,75 67.2 ab
## 5 Ba 5 66.9 ab
## 6 WC 66.4 ab
## 7 Ba 2,5 66.3 ab
## 8 Ba 7,5 66.2 ab
## 9 YC 64.1 ab
## 10 Ba 0,25 61.5 b
12.5.4.3 Visualisation des groupes
ggplot(data = cm4, mapping = aes(x = regime, y = indljau)) +
geom_bar(stat = "identity", color = "blue", fill = "grey", width = 0.6) +
ylim(0, 72) +
geom_text(aes(label = groups), vjust = -0.5, size = 4) +
xlab("Régimes") + ylab("Yolk lightness index") +
theme(axis.text.x = element_text(angle = 45, color = "black", vjust = 1, hjust = 1)) +
theme_bw()
12.5.5 Séance 5
## # A tibble: 1 x 7
## id seance regime no_oeuf indljau is.outlier is.extreme
## <fct> <fct> <fct> <dbl> <dbl> <lgl> <lgl>
## 1 19 seance 5 Ba 7,5 1 74.6 TRUE FALSE
=> Pas d’outlier extrême
12.5.5.1 Le modèle
## Anova Table (Type II tests)
##
## Response: indljau
## Sum Sq Df F value Pr(>F)
## regime 50.272 9 0.5668 0.8081
## Residuals 197.116 20
La p-value est > 0.05 => Pas de différence significative entre les effetes des régimes.
## # A tibble: 1 x 3
## variable statistic p.value
## <chr> <dbl> <dbl>
## 1 residuals(lm5) 0.981 0.850
=> Normalité Okay.
12.5.5.2 Comparaisons par paires
cm5 <- (SNK.test(lm5, "regime", group = TRUE))$groups %>%
mutate(regime = rownames(.)) %>%
select(regime, indljau, groups) %>%
as_tibble()
cm5
## # A tibble: 10 x 3
## regime indljau groups
## <chr> <dbl> <chr>
## 1 Ba 7,5 69.6 a
## 2 Ba 1 67.5 a
## 3 Ba 0,75 67.3 a
## 4 YC 67.0 a
## 5 Ba 0,50 66.7 a
## 6 WC 66.5 a
## 7 Ba 5 66.1 a
## 8 Ba 2,5 65.6 a
## 9 Ba 0,25 65.4 a
## 10 Ba 10 64.8 a
12.5.5.3 Visualisation
ggplot(data = cm5, mapping = aes(x = regime, y = indljau)) +
geom_bar(stat = "identity", color = "blue", fill = "grey", width = 0.6) +
ylim(0, 72) +
geom_text(aes(label = groups), vjust = -0.5, size = 4) +
xlab("Régimes") + ylab("Yolk lightness index") +
theme(axis.text.x = element_text(angle = 45, color = "black", vjust = 1, hjust = 1)) +
theme_bw()
12.6 Évolution de l’indice L du jaune par régime au cours du temps
12.6.1 Sommaire
ljau_ic <- summarySE(ljau,
measurevar = "indljau",
groupvars = c("seance", "regime"),
na.rm = TRUE)
ljau_ic
## seance regime N indljau sd se ci
## 1 seance 1 Ba 0,25 3 68.39333 2.2832068 1.3182101 5.671800
## 2 seance 1 Ba 0,50 3 69.21667 4.0663169 2.3476892 10.101291
## 3 seance 1 Ba 0,75 3 62.81500 9.3050000 5.3722443 23.114901
## 4 seance 1 Ba 1 3 67.87000 2.9351150 1.6945894 7.291230
## 5 seance 1 Ba 10 3 72.11000 0.0000000 0.0000000 0.000000
## 6 seance 1 Ba 2,5 3 67.44667 3.1781494 1.8349054 7.894961
## 7 seance 1 Ba 5 3 68.54667 2.3055874 1.3311315 5.727397
## 8 seance 1 Ba 7,5 3 69.21667 2.1179314 1.2227883 5.261233
## 9 seance 1 WC 3 82.45667 2.2579932 1.3036530 5.609166
## 10 seance 1 YC 3 77.35000 6.1535924 3.5527783 15.286371
## 11 seance 2 Ba 0,25 3 62.90667 7.7893538 4.4971855 19.349828
## 12 seance 2 Ba 0,50 3 56.14667 10.4925227 6.0578608 26.064871
## 13 seance 2 Ba 0,75 3 67.22667 1.9817248 1.1441494 4.922877
## 14 seance 2 Ba 1 3 68.76333 4.0705323 2.3501229 10.111763
## 15 seance 2 Ba 10 3 68.51667 2.1109792 1.2187744 5.243963
## 16 seance 2 Ba 2,5 3 69.10333 5.8286562 3.3651762 14.479185
## 17 seance 2 Ba 5 3 63.58000 7.3913801 4.2674153 18.361206
## 18 seance 2 Ba 7,5 3 64.65000 3.7150101 2.1448621 9.228597
## 19 seance 2 WC 3 61.17000 3.7428465 2.1609334 9.297746
## 20 seance 2 YC 3 67.17333 4.2914023 2.4776422 10.660434
## 21 seance 3 Ba 0,25 3 55.37000 9.6100000 5.5483361 23.872563
## 22 seance 3 Ba 0,50 3 61.80000 3.8588729 2.2279213 9.585972
## 23 seance 3 Ba 0,75 3 62.67667 3.8855158 2.2433036 9.652156
## 24 seance 3 Ba 1 3 62.75000 2.4570714 1.4185909 6.103704
## 25 seance 3 Ba 10 3 64.25000 0.0000000 0.0000000 0.000000
## 26 seance 3 Ba 2,5 3 62.30000 1.2500000 0.7216878 3.105172
## 27 seance 3 Ba 5 3 64.62500 3.6650000 2.1159887 9.104365
## 28 seance 3 Ba 7,5 3 65.18333 1.4143668 0.8165850 3.513482
## 29 seance 3 WC 3 70.91000 0.0000000 0.0000000 0.000000
## 30 seance 3 YC 3 65.43333 2.1453283 1.2386058 5.329291
## 31 seance 4 Ba 0,25 3 61.51667 2.2528722 1.3006964 5.596445
## 32 seance 4 Ba 0,50 3 69.11000 1.3682471 0.7899578 3.398914
## 33 seance 4 Ba 0,75 3 67.20000 3.5528721 2.0512517 8.825824
## 34 seance 4 Ba 1 3 68.71667 3.6654377 2.1162414 9.105452
## 35 seance 4 Ba 10 3 69.09000 1.1121601 0.6421059 2.762759
## 36 seance 4 Ba 2,5 3 66.25667 2.5425643 1.4679502 6.316080
## 37 seance 4 Ba 5 3 66.90000 0.0000000 0.0000000 0.000000
## 38 seance 4 Ba 7,5 3 66.20667 0.6261257 0.3614938 1.555382
## 39 seance 4 WC 3 66.42667 3.3741567 1.9480703 8.381870
## 40 seance 4 YC 3 64.13333 3.2346922 1.8675504 8.035421
## 41 seance 5 Ba 0,25 3 65.36667 3.4792863 2.0087669 8.643026
## 42 seance 5 Ba 0,50 3 66.66000 2.0205692 1.1665762 5.019372
## 43 seance 5 Ba 0,75 3 67.26667 4.5207780 2.6100724 11.230235
## 44 seance 5 Ba 1 3 67.51333 3.5851964 2.0699141 8.906122
## 45 seance 5 Ba 10 3 64.77000 0.0000000 0.0000000 0.000000
## 46 seance 5 Ba 2,5 3 65.62000 1.2134661 0.7005950 3.014417
## 47 seance 5 Ba 5 3 66.05667 2.8050015 1.6194684 6.968010
## 48 seance 5 Ba 7,5 3 69.63667 5.6977305 3.2895863 14.153947
## 49 seance 5 WC 3 66.49667 2.0857213 1.2041918 5.181219
## 50 seance 5 YC 3 66.96000 1.7100000 0.9872690 4.247875
12.6.2 Visualisation
ggplot(ljau_ic, aes(x = seance, y = indljau, colour = regime, group = regime)) +
geom_line(size = 1) +
geom_point(size = 2) +
ylab("Yolk lightness index") +
theme_bw()
Maximum à la première séance pour décroître ensuite. Vous jugerez.
Nous savons par les analyses pour chaque séance plus haut, que
- séance 1 : il existe des différences d’effet entre les régimes
- séance 2 : pas de différences signicatives d’effet entre les régimes
- séance 3 : il existe des différences d’effet entre les régimes
- séance 4 : il existe des différences d’effet entre les régimes
- séance 5 : pas de différences signicatives d’effet entre les régimes
Puisque les données ne répondent pas aux conditions pour évaluer les effets des régimes au cours du temps, on négligera l’effet des régimes pour évaluer globalement l’effet du temps sur cet indice.
On pourrait se demander si les indices L mesurés sur l’ensemble des sujets sont significativement différentes d’une séance à l’autre (c’est-à-dire avec le temps).
12.6.3 Effet du temps
12.6.3.1 boxplots, facteur temps
12.6.3.2 Valeurs aberrantes, facteur temps
ljau <- ljau %>% mutate(id2 = 1:nrow(.), .before = 1)
ljau_out <- ljau %>%
group_by(seance) %>%
identify_outliers(indljau)
ljau_out
## # A tibble: 13 x 8
## seance id2 id regime no_oeuf indljau is.outlier is.extreme
## <fct> <int> <fct> <fct> <dbl> <dbl> <lgl> <lgl>
## 1 seance 1 7 7 Ba 0,75 1 53.5 TRUE FALSE
## 2 seance 1 25 25 YC 1 80.0 TRUE FALSE
## 3 seance 1 26 26 YC 2 81.8 TRUE FALSE
## 4 seance 1 28 28 WC 1 83.8 TRUE FALSE
## 5 seance 1 29 29 WC 2 83.7 TRUE FALSE
## 6 seance 1 30 30 WC 3 79.8 TRUE FALSE
## 7 seance 2 35 5 Ba 0,50 2 44.4 TRUE FALSE
## 8 seance 3 61 1 Ba 0,25 1 45.8 TRUE TRUE
## 9 seance 3 62 2 Ba 0,25 2 55.4 TRUE FALSE
## 10 seance 3 88 28 WC 1 70.9 TRUE FALSE
## 11 seance 3 89 29 WC 2 70.9 TRUE FALSE
## 12 seance 3 90 30 WC 3 70.9 TRUE FALSE
## 13 seance 5 139 19 Ba 7,5 1 74.6 TRUE FALSE
=> 1 observation aberrante extrême pour la séance 3. On pourrait l’exclure. Mais je l’ai conservé pour la suite.
12.6.3.3 Homogénéité des variances et ANOVA, facteur temps
Les autres conditions ont déjà été vérifiées.
## ANOVA Table (type III tests)
##
## Effect DFn DFd F p p<.05 ges
## 1 seance 2.74 79.37 9.162 4.95e-05 * 0.19
=> C’est la p-value qui nous intéresse et elle est < 0.05 => Différence significative entre certaines séances.
12.6.3.4 Comparaisons par paires, facteur temps
tph <- ljau %>%
pairwise_t_test(indljau ~ seance,
paired = TRUE,
p.adjust.method = "bonferroni")
tph %>%
select(group1, group2, p, p.adj, p.adj.signif)
## # A tibble: 10 x 5
## group1 group2 p p.adj p.adj.signif
## <chr> <chr> <dbl> <dbl> <chr>
## 1 seance 1 seance 2 0.002 0.023 *
## 2 seance 1 seance 3 0.000000471 0.00000471 ****
## 3 seance 1 seance 4 0.004 0.042 *
## 4 seance 1 seance 5 0.003 0.034 *
## 5 seance 2 seance 3 0.38 1 ns
## 6 seance 2 seance 4 0.204 1 ns
## 7 seance 2 seance 5 0.177 1 ns
## 8 seance 3 seance 4 0.006 0.058 ns
## 9 seance 3 seance 5 0.000829 0.008 **
## 10 seance 4 seance 5 0.923 1 ns