Skip to content

Commit c6edcec

Browse files
committed
Learnr tutorial A10La_anova revised
1 parent cc637f8 commit c6edcec

File tree

3 files changed

+61
-39
lines changed

3 files changed

+61
-39
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: BioDataScience1
2-
Version: 2022.6.1
2+
Version: 2022.7.0
33
Title: A Series of Learnr Documents for Biological Data Science 1
44
Description: Interactive documents using learnr and shiny applications for studying biological data science.
55
Authors@R: c(

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# BioDataScience 2022.7.0
2+
3+
- Revision of tutorial **A10La_anova**.
4+
15
# BioDataScience 2022.6.1
26

37
- Slight correction in tutorial **A09La_ttest**.

inst/tutorials/A10La_anova/A10La_anova.Rmd

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: "ANOVA à un facteur"
33
author: "Guyliann Engels & Philippe Grosjean"
4-
description: "**SDD I Module 10** ANOVA à un facteur et des tests post-hocs."
4+
description: "**SDD I Module 10** ANOVA à un facteur et tests post-hocs."
55
tutorial:
66
id: "A10La_anova"
77
version: 2.1.1/10
@@ -14,7 +14,7 @@ runtime: shiny_prerendered
1414

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

@@ -52,7 +52,7 @@ Dans ce tutoriel, vous allez pouvoir auto-évaluer votre capacité à :
5252

5353
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*.
5454

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
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** que vous nommez `df` à l'aide de la fonction adéquate `dist_*()`.
5656

5757
```{r fplot_h2, exercise=TRUE, exercise.lines=4}
5858
# Objet distribution
@@ -71,19 +71,20 @@ chart(df)
7171
```
7272

7373
```{r fplot_h2-solution}
74+
## Solution ##
7475
# Objet distribution
7576
df <- dist_f(df1 = 4, df2 = 95)
7677
# Graphique de la distribution
7778
chart(df)
7879
```
7980

8081
```{r fplot_h2-check}
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.")
82+
grade_code("La difficulté de cet exercice est dans la conversion du nombre d'observations et du 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.")
8283
```
8384

8485
## Croissance des dents de cochons d'Inde
8586

86-
Vous allez maintenant réaliser une analyse complète de l'effet de la vitamine C sur la longueur des odontoblastes (cellules responsables de la croissance et de la formation de l'émail des dents) de cochons d'Inde. Les données utilisées proviennent du jeu de données `ToothGrowth` du package `datasets` (vous pouvez donc consulter la page d'aide si vous souhaitez obtenir plus d'informations).
87+
Vous allez maintenant réaliser une analyse complète de l'effet de la vitamine C sur la longueur des odontoblastes (cellules responsables de la croissance et de la formation de l'émail des dents) de cochons d'Inde. Les données utilisées proviennent du jeu de données `ToothGrowth` du package {datasets} (vous pouvez donc consulter la page d'aide correspondante si vous souhaitez obtenir plus d'informations).
8788

8889
![](images/guinea-pig.jpg){width="50%"}
8990

@@ -115,13 +116,13 @@ toothgrowth %>.%
115116
supp = NA,
116117
dose = "mg/J"
117118
)
118-
) ->
119+
) %->%
119120
toothgrowth
120121
```
121122

122123
**Cette étape est la première à réaliser après avoir importé les données. Il faut vérifier et adapter les types et les labels des variables.** Il est particulièrement important que les variables qui définissent les sous-populations comparées soient bien encodées sous forme d'objets `factor` ou `ordered` ! Le piège lorsqu'il s'agit de valeurs numériques, comme ici, est de laisser la variable sous forme `integer` ou `numeric`, car alors, la fonction `lm()` fera une autre analyse (régression linéaire que nous verrons au cours SDD II).
123124

124-
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 ?**
125+
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 sous forme d'acide ascorbique ?**
125126

126127
```{r, echo=TRUE}
127128
tooth_vc <- sfilter(toothgrowth, supp == "VC")
@@ -135,7 +136,7 @@ Rappelez-vous que la description des données est une étape indispensable avant
135136

136137
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()`
137138

138-
💬 **Ce code correspond au snippet `.hmanova1desc`**
139+
<!-- 💬 **Ce code correspond au snippet `.hmanova1desc`** -->
139140

140141
```{r tg_prepare}
141142
toothgrowth <- read("ToothGrowth", package = "datasets", lang = "fr")
@@ -156,20 +157,22 @@ tooth_vc <- labelise(tooth_vc, self = FALSE,
156157
)
157158
)
158159
159-
anova. <- lm(data = tooth_vc, len ~ dose)
160+
tg_anova <- lm(data = tooth_vc, len ~ dose)
160161
```
161162

162163
```{r tooth_tab_h2, exercise=TRUE, exercise.lines=5, exercise.setup="tg_prepare"}
163164
___ %>.%
164-
___(., ___) |> ssummarise(
165+
___(., ___) %>.%
166+
ssummarise(.,
165167
moyenne = ___(___), `écart type` = ___(___),
166168
n = fn(len))) %>.%
167169
___(.)
168170
```
169171

170172
```{r tooth_tab_h2-hint-1}
171173
tooth_vc %>.%
172-
sgroup_by(., ___) |> ssummarise(
174+
sgroup_by(., ___) %>.%
175+
ssummarise(.,
173176
moyenne = fmean(___), `écart type` = fsd(___),
174177
n = fn(len)) %>.%
175178
collect_dtx(.)
@@ -178,22 +181,24 @@ tooth_vc %>.%
178181
```
179182

180183
```{r tooth_tab_h2-solution}
184+
## Solution ##
181185
tooth_vc %>.%
182-
sgroup_by(., dose) |> ssummarise(
186+
sgroup_by(., dose) %>.%
187+
ssummarise(.,
183188
moyenne = fmean(len), `écart type` = fsd(len),
184189
n = fn(len)) %>.%
185190
collect_dtx(.)
186191
```
187192

188193
```{r tooth_tab_h2-check}
189-
grade_code("Vous obtenez le tableau adéquat en vue de réaliser ensuite une ANOVA : les moyennes correspondent à ce que nous comparons, les écart-types indiquent la dispersion des données dans chaque sous-population et le nombre d'observations permet de cerner la quantité d'information disponible.")
194+
grade_code("Vous obtenez le tableau adéquat en vue de réaliser ensuite une ANOVA : les moyennes correspondent à ce que nous comparons, les écart-types indiquent la dispersion des données dans chaque sous-population (nous aurions aussi pu représenter les variances qui sont le carré des écarts types) et le nombre d'observations permet de cerner la quantité d'information disponible.")
190195
```
191196

192197
### Description graphique
193198

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.
199+
Plusieurs graphiques différents permettent de visualiser correctement vos observations avant de réaliser une ANOVA. Étant donné que nous avons trois groupes avec dix 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.
195200

196-
```{r tooth_graph_h2, exercise = TRUE, exercise.setup = "tg_prepare"}
201+
```{r tooth_graph_h2, exercise=TRUE, exercise.setup="tg_prepare"}
197202
chart(data = ___, ___ ~ ___) ___
198203
geom____() ___ # boites de dispersion parallèles
199204
geom____(width = 0.05, alpha = 0.5) ___ # points évitant le chevauchement
@@ -210,17 +215,18 @@ chart(data = ___, ___ ~ ___) +
210215
```
211216

212217
```{r tooth_graph_h2-solution}
218+
## Solution ##
213219
chart(data = tooth_vc, len ~ dose) +
214220
geom_boxplot() + # boites de dispersion parallèles
215221
geom_jitter(width = 0.05, alpha = 0.5) + # points évitant le chevauchement
216222
stat_summary(geom = "point", fun = "mean", color = "red", size = 2) # points représentant les moyennes
217223
```
218224

219225
```{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.")
226+
grade_code("Ce graphique est adéquat pour visualiser les données avant une ANOVA à un facteur avec dix 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 par un graphique en \"violon\". Avec un nombre plus faible d'observation, l'affichage plus simple des points et de la moyenne de chaque groupe est encore le meilleur choix.")
221227
```
222228

223-
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.
229+
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... tout en vous assurant de bien vérifier que les conditions d'application du test sont respectées.
224230

225231
### Vérification des conditions d'applications
226232

@@ -233,7 +239,7 @@ Pour réaliser une ANOVA, il faut respecter les conditions d'application suivant
233239
- distribution Normale des résidus,
234240
- homoscédasticité (même variance intragroupe).
235241

236-
Pour les deux premières conditions, vous lisez attentivement le protocole expérimental pour déterminer si l'échantillonnage est représentatif et les observations sont indépendantes les unes des autres. Il faut un processus aléatoire qui intervienne dans la sélection des individus dans l'expérience et pour leur attribution à un des niveaux (ration de vitamine C quotidienne). Chaque individu doit avoir une chance égale d'être tiré au sort. Il ne doit pas y avoir de dépendance (par exemple, utiliser une portée de cobayes au sein d'une même sous-population est une mauvaise idée car la ressemblance génétique entre frères et sœurs rend les observations partiellement dépendantes entre elles).
242+
Pour les deux premières conditions, vous lisez attentivement le protocole expérimental pour déterminer si l'échantillonnage est représentatif et les observations sont indépendantes les unes des autres. Il faut un processus aléatoire qui intervienne dans la sélection des individus dans l'expérience et pour leur attribution à un des niveaux (ration de vitamine C quotidienne). Chaque individu doit avoir une chance égale d'être tiré au sort si l'échantillonnage aléatoire est utilisé. Il ne doit pas y avoir de dépendance (par exemple, utiliser une portée de cobayes au sein d'une même sous-population est une mauvaise idée car la ressemblance génétique entre frères et sœurs rend les observations partiellement dépendantes entre elles).
237243

238244
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.
239245

@@ -245,13 +251,14 @@ En pratique, on commence par vérifier l'homoscédasticité, puis on réalise no
245251

246252
Il existe plusieurs tests qui permettent de vérifier l'homoscédasticité. Nous vous proposons d'utiliser le test de Bartlett. Avant de foncer dans la zone de code R, réfléchissez à l'hypothèse nulle et à l'hypothèse alternative de ce test. Cela doit être clair dans votre esprit, sans quoi vous serez incapable d'interpréter correctement le test.
247253

248-
💬 **Ce code correspond au snippet `.hvbartlett`**
254+
<!-- 💬 **Ce code correspond au snippet `.hvbartlett`** -->
249255

250256
```{r tooth_bart, exercise = TRUE, exercise.setup = "tg_prepare"}
251257
bartlett.test(data = ___, ___ ~ ___)
252258
```
253259

254260
```{r tooth_bart-solution}
261+
## Solution ##
255262
bartlett.test(data = tooth_vc, len ~ dose)
256263
```
257264

@@ -273,49 +280,51 @@ question("Y a-t-il homoscédasticité (égalité des variances entre sous-popula
273280
Dans R, nous avons plusieurs fonctions pour réaliser une ANOVA. Nous utilisons `lm()` qui demande un jeu de données et une formule. Nous lui appliquons ensuite la fonction `anova()` pour produire le tableau de l'analyse de la variance.
274281

275282
```{r, echo=TRUE, eval=FALSE}
276-
anova(anova. <- lm(data = DF, YNUM ~ XFACTOR))
283+
anova(DF_anova <- lm(data = DF, YNUM ~ XFACTOR))
277284
```
278285

279286
Vous êtes habitué à cette interface formule que vous utilisez dans la réalisation de vos graphiques ou de vos tests d'hypothèse précédents. Cette fonction calcule un objet de classe `lm` (pour "linear model", que nous aborderons plus en détails au cours SDD II) duquel la fonction `anova()` va extraire l'information qui nous intéresse pour interpréter ce test. Réalisez votre modèle ANOVA sur la longueur des odontoblastes en fonction de la dose de vitamine C administrée pour votre sous-tableau relatif aux cochons d'Inde ayant reçu de l'acide ascorbique.
280287

281-
💬 **Ce code correspond au snippet `.hmanova1`**
288+
<!-- 💬 **Ce code correspond au snippet `.hmanova1`** -->
282289

283290
```{r tooth_anova_h2, exercise = TRUE, exercise.setup = "tg_prepare"}
284-
anova(anova. <- lm(data = ___, ___ ~ ___))
291+
anova(tg_anova <- lm(data = ___, ___ ~ ___))
285292
```
286293

287294
```{r tooth_anova_h2-hint-1}
288-
anova(anova. <- lm(data = tooth_vc, ___ ~ ___))
295+
anova(tg_anova <- lm(data = tooth_vc, ___ ~ ___))
289296
290297
#### ATTENTION: Hint suivant = solution !####
291298
```
292299

293300
```{r tooth_anova_h2-solution}
294-
anova(anova. <- lm(data = tooth_vc, len ~ dose))
301+
## Solution ##
302+
anova(tg_anova <- lm(data = tooth_vc, len ~ dose))
295303
```
296304

297305
```{r tooth_anova_h2-check}
298306
grade_code("Vous avez compris le principe. Mais attention : n'allez pas plus loin dans l'interprétation des résultats sans avoir vérifié la Normalité des résidus.")
299307
```
300308

301-
Vérifiez maintenant la distribution Normale des résidus depuis votre objet `.anova`.
309+
Vérifiez maintenant la distribution Normale des résidus depuis votre objet `tg_anova`.
302310

303-
💬 **Il existe une snippet pour vous aider `.hmanovaqqplot`**
311+
<!-- 💬 **Il existe une snippet pour vous aider `.hmanovaqqplot`** -->
304312

305313
<!-- Proposition : Remplacer par chart$qqresid(anova.)-->
306314

307315
```{r tooth_qqplot_h2, exercise = TRUE, exercise.setup = "tg_prepare"}
308-
plot(___, ___ = ___)
316+
chart$___(___, ___ = ___)
309317
```
310318

311319
```{r tooth_qqplot_h2-hint-1}
312-
plot(___, which = 2)
320+
chart$qqplot(___, lang = "___")
313321
314322
#### ATTENTION: Hint suivant = solution !####
315323
```
316324

317325
```{r tooth_qqplot_h2-solution}
318-
plot(anova., which = 2)
326+
## Solution ##
327+
chart$qqplot(tg_anova, lang = "fr")
319328
```
320329

321330
```{r tooth_qqplot_h2-check}
@@ -326,7 +335,7 @@ grade_code("Tous les points de ce graphique quantile-quantile s'alignent assez b
326335
question("Y a-t-il un effet significatif de la dose de vitamine C administrée sur la longueur des odontoblastes au seuil alpha de 5% ?",
327336
answer("oui", correct = TRUE),
328337
answer("non"),
329-
correct = "Excellent ! Vous avez correctement analysé votre tableau de l'analyse de la variance. L'ANOVA vous permet de savoir qu'au moins un des groupes diffère des autres. Vous allez devoir réaliser une analyse complémentaire pour déterminer la ou les moyennes qui diffère(nt) des autres.",
338+
correct = "Vous avez correctement analysé votre tableau de l'analyse de la variance. L'ANOVA vous permet de savoir qu'au moins un des groupes diffère des autres. Vous allez devoir réaliser une analyse complémentaire pour déterminer la ou les moyennes qui diffèrent des autres.",
330339
incorrect = "Il semble que vous avez mal interprété votre ANOVA. Allez revoir la règle de décision basée sur la comparaison de la valeur P d'un test au seuil alpha.",
331340
allow_retry = TRUE)
332341
```
@@ -335,30 +344,39 @@ question("Y a-t-il un effet significatif de la dose de vitamine C administrée s
335344

336345
Votre ANOVA indique donc qu'il y a au moins une des moyennes qui est significativement différente des autres au seuil $\alpha$ de 5%. Un test post-hoc de comparaisons multiples va vous permettre de préciser cela. **Attention : ce genre de test est conçus pour être fiable uniquement lorsque H~0~ est rejetée pour l'ANOVA.** Ne l'utilisez pas *avant* d'avoir fait votre ANOVA, ni lorsque H~0~ n'est *pas* rejetée !
337346

338-
💬 **Ce code correspond au snippet `.hmanovamult`**
347+
<!-- 💬 **Ce code correspond au snippet `.hmanovamult`** -->
339348

340-
```{r tooth_post, exercise = TRUE, exercise.setup = "tg_prepare"}
341-
summary(anovaComp. <- confint(multcomp::glht(anova.,
349+
```{r tooth_post, exercise=TRUE, exercise.setup="tg_prepare"}
350+
summary(tg_posthoc <- confint(multcomp::glht(tg_anova,
342351
linfct = multcomp::mcp(___ = "Tukey")))) # Add a second factor if you want
343-
.oma <- par(oma = c(0, 5.1, 0, 0)); plot(anovaComp.); par(.oma); rm(.oma)
352+
# Graphique
353+
oma <- par(oma = c(0, 5.1, 0, 0))
354+
plot(tg_posthoc)
355+
par(oma)
356+
rm(oma)
344357
```
345358

346359
```{r tooth_post-solution}
347-
summary(anovaComp. <- confint(multcomp::glht(anova.,
360+
## Solution ##
361+
summary(tg_posthoc <- confint(multcomp::glht(tg_anova,
348362
linfct = multcomp::mcp(dose = "Tukey")))) # Add a second factor if you want
349-
.oma <- par(oma = c(0, 5.1, 0, 0)); plot(anovaComp.); par(.oma); rm(.oma)
363+
# Graphique
364+
oma <- par(oma = c(0, 5.1, 0, 0))
365+
plot(tg_posthoc)
366+
par(oma)
367+
rm(oma)
350368
```
351369

352370
```{r tooth_post-check}
353-
grade_code("Avec l'aide des snippets, il est relativement simple de réaliser un test post-hoc. Le graphique montre une comparaison deux à deux des différentes moyennes (pour la comparaison i - j, moyenne_i - moyenne_j) avec une correction via la méthode HSD de Tukey pour éviter l'inflation de l'erreur.")
371+
grade_code("Le graphique montre une comparaison deux à deux des différentes moyennes (pour la comparaison i - j, moyenne_i - moyenne_j) avec une correction via la méthode HSD de Tukey pour éviter l'inflation de l'erreur.")
354372
```
355373

356374
```{r post_quiz}
357375
question("Quels sont les niveaux significativement différents au seuil alpha de 5% ?",
358376
answer("0.5 par rapport à 1", correct = TRUE),
359377
answer("0.5 par rapport à 2", correct = TRUE),
360378
answer("1 par rapport à 2", correct = TRUE),
361-
allow_retry = TRUE, correct = "Superbe ! Les trois moyennes sont toutes différentes les unes des autres ici. Les intervalles sur le graphique ne contiennent jamais zéro.",
379+
allow_retry = TRUE, correct = "Les trois moyennes sont toutes différentes les unes des autres ici. Les intervalles sur le graphique ne contiennent jamais zéro.",
362380
incorrect = "Votre réponse est probablement incomplète. Pour une première analyse, regardez bien le tableau et le graphique issus de l'analyse post-hoc.")
363381
```
364382

0 commit comments

Comments
 (0)