You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: inst/tutorials/A10La_anova/A10La_anova.Rmd
+56-38Lines changed: 56 additions & 38 deletions
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
---
2
2
title: "ANOVA à un facteur"
3
3
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."
5
5
tutorial:
6
6
id: "A10La_anova"
7
7
version: 2.1.1/10
@@ -14,7 +14,7 @@ runtime: shiny_prerendered
14
14
15
15
```{r setup, include=FALSE}
16
16
BioDataScience1::learnr_setup()
17
-
SciViews::R("infer", "model", lang ="fr")
17
+
SciViews::R("infer", "model", lang ="fr")
18
18
library(BioDataScience1)
19
19
```
20
20
@@ -52,7 +52,7 @@ Dans ce tutoriel, vous allez pouvoir auto-évaluer votre capacité à :
52
52
53
53
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*.
54
54
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_*()`.
56
56
57
57
```{r fplot_h2, exercise=TRUE, exercise.lines=4}
58
58
# Objet distribution
@@ -71,19 +71,20 @@ chart(df)
71
71
```
72
72
73
73
```{r fplot_h2-solution}
74
+
## Solution ##
74
75
# Objet distribution
75
76
df <- dist_f(df1 = 4, df2 = 95)
76
77
# Graphique de la distribution
77
78
chart(df)
78
79
```
79
80
80
81
```{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.")
82
83
```
83
84
84
85
## Croissance des dents de cochons d'Inde
85
86
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).
87
88
88
89
{width="50%"}
89
90
@@ -115,13 +116,13 @@ toothgrowth %>.%
115
116
supp = NA,
116
117
dose = "mg/J"
117
118
)
118
-
) ->
119
+
) %->%
119
120
toothgrowth
120
121
```
121
122
122
123
**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).
123
124
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 ?**
125
126
126
127
```{r, echo=TRUE}
127
128
tooth_vc <- sfilter(toothgrowth, supp == "VC")
@@ -135,7 +136,7 @@ Rappelez-vous que la description des données est une étape indispensable avant
135
136
136
137
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()`
137
138
138
-
💬 **Ce code correspond au snippet `.hmanova1desc`**
139
+
<!--💬 **Ce code correspond au snippet `.hmanova1desc`**-->
139
140
140
141
```{r tg_prepare}
141
142
toothgrowth <- read("ToothGrowth", package = "datasets", lang = "fr")
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.")
190
195
```
191
196
192
197
### Description graphique
193
198
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.
stat_summary(geom = "point", fun = "mean", color = "red", size = 2) # points représentant les moyennes
217
223
```
218
224
219
225
```{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.")
221
227
```
222
228
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.
224
230
225
231
### Vérification des conditions d'applications
226
232
@@ -233,7 +239,7 @@ Pour réaliser une ANOVA, il faut respecter les conditions d'application suivant
233
239
- distribution Normale des résidus,
234
240
- homoscédasticité (même variance intragroupe).
235
241
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).
237
243
238
244
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.
239
245
@@ -245,13 +251,14 @@ En pratique, on commence par vérifier l'homoscédasticité, puis on réalise no
245
251
246
252
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.
247
253
248
-
💬 **Ce code correspond au snippet `.hvbartlett`**
254
+
<!--💬 **Ce code correspond au snippet `.hvbartlett`**-->
@@ -273,49 +280,51 @@ question("Y a-t-il homoscédasticité (égalité des variances entre sous-popula
273
280
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.
274
281
275
282
```{r, echo=TRUE, eval=FALSE}
276
-
anova(anova. <- lm(data = DF, YNUM ~ XFACTOR))
283
+
anova(DF_anova <- lm(data = DF, YNUM ~ XFACTOR))
277
284
```
278
285
279
286
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.
280
287
281
-
💬 **Ce code correspond au snippet `.hmanova1`**
288
+
<!--💬 **Ce code correspond au snippet `.hmanova1`**-->
anova(tg_anova <- lm(data = tooth_vc, len ~ dose))
295
303
```
296
304
297
305
```{r tooth_anova_h2-check}
298
306
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.")
299
307
```
300
308
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`.
302
310
303
-
💬 **Il existe une snippet pour vous aider `.hmanovaqqplot`**
311
+
<!--💬 **Il existe une snippet pour vous aider `.hmanovaqqplot`**-->
304
312
305
313
<!-- Proposition : Remplacer par chart$qqresid(anova.)-->
@@ -326,7 +335,7 @@ grade_code("Tous les points de ce graphique quantile-quantile s'alignent assez b
326
335
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% ?",
327
336
answer("oui", correct = TRUE),
328
337
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.",
330
339
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.",
331
340
allow_retry = TRUE)
332
341
```
@@ -335,30 +344,39 @@ question("Y a-t-il un effet significatif de la dose de vitamine C administrée s
335
344
336
345
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 !
337
346
338
-
💬 **Ce code correspond au snippet `.hmanovamult`**
347
+
<!--💬 **Ce code correspond au snippet `.hmanovamult`**-->
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.")
354
372
```
355
373
356
374
```{r post_quiz}
357
375
question("Quels sont les niveaux significativement différents au seuil alpha de 5% ?",
358
376
answer("0.5 par rapport à 1", correct = TRUE),
359
377
answer("0.5 par rapport à 2", correct = TRUE),
360
378
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.",
362
380
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.")
0 commit comments