Skip to content

Commit cc637f8

Browse files
revision du learnr A10La_anova
1 parent 4e70469 commit cc637f8

File tree

1 file changed

+56
-77
lines changed

1 file changed

+56
-77
lines changed

inst/tutorials/A10La_anova/A10La_anova.Rmd

Lines changed: 56 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
---
22
title: "ANOVA à un facteur"
33
author: "Guyliann Engels & Philippe Grosjean"
4-
description: "**SDD I Module 10** Réalisation d'une ANOVA à un facteur et des tests post-hocs."
4+
description: "**SDD I Module 10** ANOVA à un facteur et des tests post-hocs."
55
tutorial:
66
id: "A10La_anova"
7-
version: 2.1.0/10
7+
version: 2.1.1/10
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -14,7 +14,8 @@ runtime: shiny_prerendered
1414

1515
```{r setup, include=FALSE}
1616
BioDataScience1::learnr_setup()
17-
SciViews::R()
17+
SciViews::R("infer", "model", lang ="fr")
18+
library(BioDataScience1)
1819
```
1920

2021
```{r, echo=FALSE}
@@ -27,13 +28,11 @@ BioDataScience1::learnr_server(input, output, session)
2728

2829
------------------------------------------------------------------------
2930

30-
**Ce tutoriel correspond à la version 2021-2022. Il est en cours de révision pour la version 2022-2023. Vous devez probablement penser à installer une version plus récente du package qui contient les exercices finalisés !**
31-
3231
## Objectifs
3332

3433
Vous avez découvert il y a peu la moyenne et plusieurs tests d'hypothèses associés (différentes variantes du test *t* de Student). Le test *t* de Student indépendant vous permet de comparer les moyennes de deux populations.
3534

36-
Le [module 10](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2021/variance.html) du cours vous explique pourquoi c'est une mauvaise idée de l'appliquer pour comparer plus de deux moyennes simultanément via des comparaisons deux à deux multiples sans précautions particulières.
35+
Le [module 10](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2022/variance.html) du cours vous explique pourquoi c'est une mauvaise idée de l'appliquer pour comparer plus de deux moyennes simultanément via des comparaisons deux à deux multiples sans précautions particulières.
3736

3837
![](images/red-traffic-lights.png){width="10%"}
3938

@@ -53,53 +52,33 @@ Dans ce tutoriel, vous allez pouvoir auto-évaluer votre capacité à :
5352

5453
La loi de distribution théorique sur laquelle l'ANOVA se base est la distribution *F* de Fisher-Snedecor. C'est une distribution asymétrique d'une allure similaire à la distribution du *Chi^2^*. Cependant, les paramètres diffèrent. La question suivante vous permet de vérifier si vous avez bien compris à quoi correspondent les deux paramètres de la distribution *F*.
5554

56-
Tracez le graphique de densité de probabilité de la distribution *F* qui correspond à l'analyse d'un échantillon de 100 observations réparties en 5 groupes (comparaison de 5 moyennes).
57-
58-
💬 **Ce code correspond au snippet `.ifdens`**
55+
Tracez le graphique de densité de probabilité de la distribution *F* qui correspond à l'analyse d'un échantillon de 100 observations réparties en 5 groupes (comparaison de 5 moyennes). Créez un objet `distribution` nommez `df` à l'aide de la fonction adéquate `dist_*()` Employez la fonction adéquate
5956

60-
```{r fplot_h2, exercise=TRUE, exercise.lines=10}
61-
# Fisher-Snedecor's F distribution (density probability) with parameter:
62-
.df1 <- ___; .df2 <- ___ # numerator (.df1) and denominator (.df2) df
63-
.col <- 1; .add <- FALSE # Plot parameters
64-
.x <- seq(0, qf(0.999, df1 = .df1, df2 = .df2), l = 1000) # Quantiles
65-
.d <- function (x) df(x, df1 = .df1, df2 = .df2) # Distribution function
66-
.q <- function (p) qf(p, df1 = .df1, df2 = .df2) # Quantile for lower-tail prob
67-
.label <- bquote(F(.(.df1), .(.df2))) # Curve parameters
68-
curve(.d(x), xlim = range(.x), xaxs = "i", n = 1000, col = .col,
69-
add = .add, xlab = "Quantiles", ylab = "Probability density") # Curve
70-
abline(h = 0, col = "gray") # Baseline
57+
```{r fplot_h2, exercise=TRUE, exercise.lines=4}
58+
# Objet distribution
59+
df <- ___(df1 = ___, df2 = ___)
60+
# Graphique de la distribution
61+
___(___)
7162
```
7263

7364
```{r fplot_h2-hint-1}
74-
# Fisher-Snedecor's F distribution (density probability) with parameter:
75-
.df1 <- 4; .df2 <- ___ # numerator (.df1) and denominator (.df2) df
76-
.col <- 1; .add <- FALSE # Plot parameters
77-
.x <- seq(0, qf(0.999, df1 = .df1, df2 = .df2), l = 1000) # Quantiles
78-
.d <- function (x) df(x, df1 = .df1, df2 = .df2) # Distribution function
79-
.q <- function (p) qf(p, df1 = .df1, df2 = .df2) # Quantile for lower-tail prob
80-
.label <- bquote(F(.(.df1), .(.df2))) # Curve parameters
81-
curve(.d(x), xlim = range(.x), xaxs = "i", n = 1000, col = .col,
82-
add = .add, xlab = "Quantiles", ylab = "Probability density") # Curve
83-
abline(h = 0, col = "gray") # Baseline
65+
# Objet distribution
66+
df <- dist_f(df1 = ___, df2 = ___)
67+
# Graphique de la distribution
68+
chart(df)
8469
8570
#### ATTENTION: Hint suivant = solution !####
8671
```
8772

8873
```{r fplot_h2-solution}
89-
# Fisher-Snedecor's F distribution (density probability) with parameter:
90-
.df1 <- 4; .df2 <- 95 # numerator (.df1) and denominator (.df2) df
91-
.col <- 1; .add <- FALSE # Plot parameters
92-
.x <- seq(0, qf(0.999, df1 = .df1, df2 = .df2), l = 1000) # Quantiles
93-
.d <- function (x) df(x, df1 = .df1, df2 = .df2) # Distribution function
94-
.q <- function (p) qf(p, df1 = .df1, df2 = .df2) # Quantile for lower-tail prob
95-
.label <- bquote(F(.(.df1), .(.df2))) # Curve parameters
96-
curve(.d(x), xlim = range(.x), xaxs = "i", n = 1000, col = .col,
97-
add = .add, xlab = "Quantiles", ylab = "Probability density") # Curve
98-
abline(h = 0, col = "gray") # Baseline
74+
# Objet distribution
75+
df <- dist_f(df1 = 4, df2 = 95)
76+
# Graphique de la distribution
77+
chart(df)
9978
```
10079

10180
```{r fplot_h2-check}
102-
grade_code("Le code pour obtenir ce graphique est un peu long... mais le snippet est là pour vous préremplir la majeure partie ! Vous avez cependant su convertir le nombre d'observations et le nombre de groupes en degrés de liberté intragroupe et intergroupe.", "Il semble que vous n'avez pas su déterminer correctement les paramètres de la distribution F. Si n correspond au nombre d'observations et k au nombre de groupes, alors le nombre de degrés intergroupe vaut k – 1 et le nombre de degrés intragroupe vaut n – k.")
81+
grade_code("La difficulté de cet exercice est dans la conversion du nombre d'observations et dunombre de groupes en degrés de liberté intragroupe et intergroupe.", "Il semble que vous n'avez pas su déterminer correctement les paramètres de la distribution F. Si n correspond au nombre d'observations et k au nombre de groupes, alors le nombre de degrés intergroupe vaut k – 1 et le nombre de degrés intragroupe vaut n – k.")
10382
```
10483

10584
## Croissance des dents de cochons d'Inde
@@ -123,7 +102,7 @@ glimpse(toothgrowth)
123102
```{r, echo=TRUE}
124103
# Vérification des types des variables et ajout des labels
125104
toothgrowth %>.%
126-
fmutate(.,
105+
smutate(.,
127106
supp = factor(supp, levels = c("OJ", "VC")),
128107
dose = ordered(dose, levels = c(0.5, 1, 2))) %>.%
129108
labelise(toothgrowth, self = FALSE,
@@ -145,37 +124,24 @@ toothgrowth %>.%
145124
Nous allons nous concentrer uniquement sur les individus qui ont reçu de la vitamine C. La question biologique est la suivante : **y a-t-il une différence de la longueur des odontoblastes en fonction de la ration journalière de vitamine C administrée ?**
146125

147126
```{r, echo=TRUE}
148-
tooth_vc <- fsubset(toothgrowth, supp == "VC")
127+
tooth_vc <- sfilter(toothgrowth, supp == "VC")
149128
```
150129

151130
### Description des données
152131

153-
Rappelez-vous que la description des données est une étape indispensable avant l'analyse (voir modules [2](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2021/visu1.html), [3](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2021/visu2.html) et [4](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2021/visu3.html) de SDD I).
132+
Rappelez-vous que la description des données est une étape indispensable avant l'analyse (voir modules [2](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2022/visu1.html), [3](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2022/visu2.html) et [4](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2022/visu3.html) de SDD I).
154133

155134
### Description numérique
156135

157-
Réalisez un tableau reprenant les moyennes et les écart-types de la longueur des dents des cochons d'Inde pour chaque dose administrée en vitamine C ainsi que le nombre d'observations par groupe. Le jeu de données à utiliser est donc `tooth_vc`.
136+
Réalisez un tableau reprenant les moyennes et les écart-types de la longueur des dents des cochons d'Inde pour chaque dose administrée en vitamine C ainsi que le nombre d'observations par groupe. Le jeu de données à utiliser est donc `tooth_vc`. Employez les fonctions "speedy" commençant par "s" comme `ssummarise()` et "fast" débutant par "f" comme `fvar()`
158137

159138
💬 **Ce code correspond au snippet `.hmanova1desc`**
160139

161140
```{r tg_prepare}
162141
toothgrowth <- read("ToothGrowth", package = "datasets", lang = "fr")
163142
toothgrowth$dose <- as.ordered(toothgrowth$dose)
164143
165-
toothgrowth <- labelise(toothgrowth, self = FALSE,
166-
label = list(
167-
len = "Longueur des odontaoblastes",
168-
supp = "Supplémentation",
169-
dose = "Dose de vitamine C"
170-
),
171-
units = list(
172-
len = "µm",
173-
supp = NA,
174-
dose = "mg/J"
175-
)
176-
)
177-
178-
tooth_vc <- fsubset(toothgrowth, supp == "VC")
144+
tooth_vc <- sfilter(toothgrowth, supp == "VC")
179145
180146
tooth_vc <- labelise(tooth_vc, self = FALSE,
181147
label = list(
@@ -193,29 +159,29 @@ tooth_vc <- labelise(tooth_vc, self = FALSE,
193159
anova. <- lm(data = tooth_vc, len ~ dose)
194160
```
195161

196-
```{r tooth_tab_h2, exercise=TRUE, exercise.lines=4, exercise.setup="tg_prepare"}
162+
```{r tooth_tab_h2, exercise=TRUE, exercise.lines=5, exercise.setup="tg_prepare"}
197163
___ %>.%
198-
group_by(., ___) |> summarise(
164+
___(., ___) |> ssummarise(
199165
moyenne = ___(___), `écart type` = ___(___),
200-
n = sum(!is.na(___))) %>.%
166+
n = fn(len))) %>.%
201167
___(.)
202168
```
203169

204170
```{r tooth_tab_h2-hint-1}
205171
tooth_vc %>.%
206-
group_by(., ___) |> summarise(
207-
moyenne = mean(___), `écart type` = sd(___),
208-
n = sum(!is.na(___))) %>.%
172+
sgroup_by(., ___) |> ssummarise(
173+
moyenne = fmean(___), `écart type` = fsd(___),
174+
n = fn(len)) %>.%
209175
collect_dtx(.)
210176
211177
#### ATTENTION: Hint suivant = solution !####
212178
```
213179

214180
```{r tooth_tab_h2-solution}
215181
tooth_vc %>.%
216-
group_by(., dose) |> summarise(
217-
moyenne = mean(len), `écart type` = sd(len),
218-
n = sum(!is.na(len))) %>.%
182+
sgroup_by(., dose) |> ssummarise(
183+
moyenne = fmean(len), `écart type` = fsd(len),
184+
n = fn(len)) %>.%
219185
collect_dtx(.)
220186
```
221187

@@ -225,22 +191,33 @@ grade_code("Vous obtenez le tableau adéquat en vue de réaliser ensuite une ANO
225191

226192
### Description graphique
227193

228-
Plusieurs graphiques différents permettent de visualiser correctement vos observations avant de réaliser une ANOVA. Employez ici les boîtes de dispersion parallèles.
194+
Plusieurs graphiques différents permettent de visualiser correctement vos observations avant de réaliser une ANOVA. Etant donné que nous avons 3 groupes avec 10 individus par groupe, nous vous proposons de réaliser des boites de dispersion parallèles avec l'ajout des valeurs sous la forme de point (tout en évitant le chevauchement des observations) et des moyennes.
229195

230-
💬 **Ce code correspond au snippet `.cbbox`**
196+
```{r tooth_graph_h2, exercise = TRUE, exercise.setup = "tg_prepare"}
197+
chart(data = ___, ___ ~ ___) ___
198+
geom____() ___ # boites de dispersion parallèles
199+
geom____(width = 0.05, alpha = 0.5) ___ # points évitant le chevauchement
200+
stat_summary(geom = "point", fun = "mean", color = "red", size = 2) # points représentant les moyennes
201+
```
231202

232-
```{r tooth_graph, exercise = TRUE, exercise.setup = "tg_prepare"}
203+
```{r tooth_graph_h2-hint-1}
233204
chart(data = ___, ___ ~ ___) +
234-
geom____()
205+
geom_boxplot() + # boites de dispersion parallèles
206+
geom____(width = 0.05, alpha = 0.5) + # points évitant le chevauchement
207+
stat_summary(geom = "point", fun = "mean", color = "red", size = 2) # points représentant les moyennes
208+
209+
#### ATTENTION: Hint suivant = solution !####
235210
```
236211

237-
```{r tooth_graph-solution}
212+
```{r tooth_graph_h2-solution}
238213
chart(data = tooth_vc, len ~ dose) +
239-
geom_boxplot()
214+
geom_boxplot() + # boites de dispersion parallèles
215+
geom_jitter(width = 0.05, alpha = 0.5) + # points évitant le chevauchement
216+
stat_summary(geom = "point", fun = "mean", color = "red", size = 2) # points représentant les moyennes
240217
```
241218

242-
```{r tooth_graph-check}
243-
grade_code("Vous obtenez le graphique adéquat qui permet de comparer la longueur des dents en fonction de la dose administrée. Notez toutefois que la boite de dispersion présente la médiane à la place de la moyenne. Ce graphique est donc, sans doute plus adapté au test de Kruskal-Wallis. Voyez dans le cours les autres graphiques qui comparent les moyennes pour des versions alternatives intéressantes dans le cas de l'ANOVA.")
219+
```{r tooth_graph_h2-check}
220+
grade_code("Ce graphique est adéquat afin de représenter graphiquement une ANOVA à un facteur avec 10 individus par groupe dont le but est de comparer la longueur des dents en fonction de la dose administrée. Avec un nombre plus important d'individus, vous auriez pu remplacer les boites de dispersion par des diagrammes en violon parallèles. Avec un nombre plus faible d'observation, il suffit d'afficher les points et la moyenne de chaque groupe.")
244221
```
245222

246223
Maintenant que vous avez pris connaissance de vos données grâce à un tableau et un graphique, vous pouvez réaliser votre test d'hypothèse... mais avant cela, assurez-vous que les conditions d'application du test sont respectées.
@@ -260,7 +237,7 @@ Pour les deux premières conditions, vous lisez attentivement le protocole expé
260237

261238
Les contraintes relatives au type de variables en jeu se vérifient facilement. Nous insistons encore une fois sur la nécessité de s'assurer que la variable explicative (celle qui sépare l'échantillon en sous-populations) soit bien qualitative, donc sous la forme d'un objet `factor` ou `ordered` dans R.
262239

263-
Les deux dernières conditions **doivent être vérifiées sur les données de l'échantillon**. Si les données sont en nombre suffisant, soit au moins une petite dizaine par sous-population, nous pourrons appliquer un test d'homogénéité de variance et comparer la distribution des résidus du modèle à une distribution Normale. Nous sommes dans cette situation. Si le nombre d'observations est trop faible, il faut le tester ou l'avoir testé précédemment sur un plus gros échantillon similaire, ou se rabattre sur un test non paramétrique (Kruskal-Wallis) en cas de doute. Rappelons aussi qu'il est possible de tester des transformations des données, si l'une ou les deux conditions ne sont pas rencontrées.
240+
Les deux dernières conditions **doivent être vérifiées sur les données de l'échantillon**. Si les données sont en nombre suffisant, soit au moins une petite dizaine par sous-population, nous pourrons appliquer un test d'homogénéité de variance et comparer la distribution des résidus du modèle à une distribution Normale. Nous sommes dans cette situation. Si le nombre d'observations est trop faible, il faut le tester ou l'avoir testé précédemment sur un plus gros échantillon similaire, ou se rabattre sur un test non paramétrique (Kruskal-Wallis) en cas de doute. **Rappelons aussi qu'il est possible de tester des transformations des données, si l'une ou les deux conditions ne sont pas rencontrées.**
264241

265242
En pratique, on commence par vérifier l'homoscédasticité, puis on réalise notre ANOVA et ensuite on vérifie la distribution Normale des résidus. La raison qui nous pousse à postposer la vérification de la Normalité des résidus sera expliquée plus loin dans ce tutoriel.
266243

@@ -325,6 +302,8 @@ Vérifiez maintenant la distribution Normale des résidus depuis votre objet `.a
325302

326303
💬 **Il existe une snippet pour vous aider `.hmanovaqqplot`**
327304

305+
<!-- Proposition : Remplacer par chart$qqresid(anova.)-->
306+
328307
```{r tooth_qqplot_h2, exercise = TRUE, exercise.setup = "tg_prepare"}
329308
plot(___, ___ = ___)
330309
```

0 commit comments

Comments
 (0)