Skip to content

Commit 2d51b86

Browse files
committed
Learnrs ready for new module 6
1 parent 9943aa0 commit 2d51b86

File tree

13 files changed

+401
-391
lines changed

13 files changed

+401
-391
lines changed

BioDataScience1.Rproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
Version: 1.0
2+
ProjectId: 44c74280-827c-489c-9f67-e3eba8c995d9
23

34
RestoreWorkspace: No
45
SaveWorkspace: No

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: BioDataScience1
2-
Version: 2024.5.0
2+
Version: 2024.6.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+
# BioDataScience1 2024.6.0
2+
3+
- Learnrs **A06La_proba**, **A06Lb_distri** and **A06Lc_correlation** revised.
4+
15
# BioDataScience1 2024.5.0
26

37
- Learnrs **A05La_recombination** and **A05Lb_multi-table** revised.

inst/tutorials/A06La_proba/A06La_proba.Rmd.inactivated renamed to inst/tutorials/A06La_proba/A06La_proba.Rmd

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD I Module 6** Calculer des probabilités dans R."
55
tutorial:
66
id: "A06La_proba"
7-
version: 2.0.0/10
7+
version: 2.1.0/10
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -37,7 +37,7 @@ Le calcul des probabilités et le B-A-BA des statistiques. Il n'est pas toujours
3737

3838
- Calculer des probabilités sur base d'un tableau de contingence
3939

40-
Avant d'aborder ce tutoriel, assurez-vous d'avoir bien compris le contenu de la [section 6.1](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2024/probabilit%25C3%25A9s.html) du cours. En effet, ce learnr sert d'auto-évaluation sur cette matière et ne sera utile que dans un contexte où vous la maîtrisez déjà, à des fins de vérification de vos acquis.
40+
Avant d'aborder ce tutoriel, assurez-vous d'avoir bien compris le contenu de la [section 6.1](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2024/proba.html) du cours. En effet, ce learnr sert d'auto-évaluation sur cette matière et ne sera utile que dans un contexte où vous la maîtrisez déjà, à des fins de vérification de vos acquis.
4141

4242
## Lire des probabilités
4343

@@ -47,34 +47,34 @@ Le calcul des probabilité est assorti d'un formalisme mathématique qu'il vous
4747

4848
```{r qu_formalism}
4949
quiz(
50-
question("Comment lire la proposition suivante : Pr{A.B} ?",
50+
question("Comment lire la proposition suivante : Pr{A.B} ?",
5151
answer("Probabilité d'observer A ou B"),
5252
answer("Probabilité d'observer A et B", correct = TRUE, message = "Probabilité d'évènements successifs indépendants "),
5353
answer("Probabilité d'observer A si B se produit"),
5454
allow_retry = TRUE, random_answer_order = TRUE,
5555
incorrect = "Pas exactement. Recommencez afin de trouver la bonne réponse.",
5656
correct = "Oui, les deux évènements sont indépendant ici, ce qui signifie que l'occurence de l'un n'a aucune incidence sur la probabilité d'occurence de l'autre."),
57-
question("Comment lire la proposition suivante : Pr{A|B} ?",
57+
question("Comment lire la proposition suivante : Pr{A|B} ?",
5858
answer("Probabilité d'observer A ou B"),
5959
answer("Probabilité d'observer A et B"),
6060
answer("Probabilité d'observer A si B se produit", correct = TRUE, message = "Ici, nous avons une probabilité conditionnelle que A se produise, sachant que B s'est produit"),
6161
allow_retry = TRUE, random_answer_order = TRUE,
6262
incorrect = "Désolé, mais ce n'est pas correct. Recommencez afin de trouver la bonne réponse",
6363
correct = "Les probabilités conditionnelles ont une dépendance entre elles."),
64-
question("Comment lire la proposition suivante : Pr{A+B} ?",
64+
question("Comment lire la proposition suivante : Pr{A+B} ?",
6565
answer("Probabilité d'avoir A ou B", correct = TRUE, message = "En calcul de probabilité, l'addition signifie que l'on considère la probabilité que l'un parmi plusieurs évènements disjoints se produise"),
6666
answer("Probabilité d'avoir A et B"),
6767
answer("Probabilité d'avoir A si B se produit"),
6868
allow_retry = TRUE, random_answer_order = TRUE,
6969
incorrect = "Concentrez-vous sur ce que l'opérateur '+' signifie en calcul des probabilités. Recommencez afin de trouver la bonne réponse",
7070
correct = "La probabilité d'observer A ou d'observer B."),
71-
question("Comment écrira-t-on la probabilité d'obtenir quatre mâles Pr{M} dans une portée de quatre châtons ?",
71+
question("Comment écrira-t-on la probabilité d'obtenir quatre mâles Pr{M} dans une portée de quatre châtons ?",
7272
answer("Pr{M . M . M . M}", correct = TRUE),
7373
answer("Pr{M et M et M et M}", correct = TRUE),
7474
answer("Pr{M + M + M + M}" ),
7575
answer("Pr{M ou M ou M ou M}"),
7676
allow_retry = TRUE, random_answer_order = TRUE,
77-
incorrect = "Est-ce des évènements successifs indépendants ou des évènements dépendants, réfléchissez. Recommencez afin de trouver la bonne réponse",
77+
incorrect = "Est-ce des évènements successifs indépendants ou des évènements dépendants ? Réfléchissez. Recommencez afin de trouver la bonne réponse",
7878
correct = "Le '.' est synonyme ici de 'et' et concerne des évènements indépendants successifs.")
7979
)
8080
```
@@ -103,38 +103,38 @@ Calculez les probabilités suivantes relatives à cette étude (vous pouvez vous
103103

104104
```{r qu_calcul}
105105
quiz(caption = "Stress et revenus",
106-
question("Quelle est la probabilité d'être stressé ?",
107-
answer("0.15", correct = TRUE , message = "Résultat issu du calcul suivant : 1016/6549, total stressés sur total général"),
106+
question("Quelle est la probabilité d'être stressé ?",
107+
answer("0.15", correct = TRUE , message = "Résultat issu du calcul suivant : 1016/6549, total stressés sur total général"),
108108
answer("0.52"),
109109
answer(" 0.08"),
110110
answer(" 0.30"),
111111
allow_retry = TRUE, random_answer_order = TRUE,
112112
incorrect = "Vous avez fait une erreur. Recommencez afin de trouver la bonne réponse",
113-
correct = "C'est correct !"),
114-
question("Quelle est la probabilité d'être stressé et d'avoir des revenus moyens ?",
115-
answer("0.042", correct = TRUE, message = "Cette réponse est obtenue comme suit : 274/6549, nombre de stressés à revenus moyens sur le total général"),
113+
correct = "C'est correct !"),
114+
question("Quelle est la probabilité d'être stressé et d'avoir des revenus moyens ?",
115+
answer("0.042", correct = TRUE, message = "Cette réponse est obtenue comme suit : 274/6549, nombre de stressés à revenus moyens sur le total général"),
116116
answer("0.52"),
117117
answer("0.15"),
118118
answer("0.08"),
119119
allow_retry = TRUE, random_answer_order = TRUE,
120120
incorrect = "Concentrez-vous et recommencez afin de trouver la bonne réponse",
121-
correct = "C'est correct !"),
121+
correct = "C'est correct !"),
122122
question("Pr{revenus moyens ou stressé} ?",
123123
answer("0.41", correct = TRUE, message = "Cette réponse s'obtient en effet comme ceci : (1954/6549) + (1016/6549) - (274/6549), probabilité d'être stressé + probabilité d'avoir des revenus moyens. Mais les stressés à revenus moyens sont ici comptabilisés deux fois... donc on doit les soustraire un fois du calcul"),
124124
answer("0.042"),
125125
answer("0.52"),
126126
answer("0.086"),
127127
allow_retry = TRUE, random_answer_order = TRUE,
128128
incorrect = "Pas exactement. Recommencez afin de trouver la bonne réponse",
129-
correct = "C'est correct !"),
129+
correct = "C'est correct !"),
130130
question("Pr{revenus faibles | non stressé}",
131-
answer("0.35", correct = TRUE, message = "Le calcul est le suivant : 1954/5533, ici, nous considérons uniquement la population de non stressés. Donc on divise les revenus faibles par le total de non stressés et pas par le total général."),
131+
answer("0.35", correct = TRUE, message = "Le calcul est le suivant : 1954/5533, ici, nous considérons uniquement la population de non stressés. Donc on divise les revenus faibles par le total de non stressés et pas par le total général."),
132132
answer("0.41"),
133133
answer("0.52"),
134134
answer("0.15"),
135135
allow_retry = TRUE, random_answer_order = TRUE,
136136
incorrect = "C'est une probabilité conditionnelle. Elle se traite d'une façon particulière dans un tableau de contingence. Recommencez afin de trouver la bonne réponse",
137-
correct = "C'est correct !")
137+
correct = "C'est correct !")
138138
)
139139
```
140140

@@ -171,8 +171,8 @@ Un nouveau médicament contre une maladie permet de soigner 80% des individus at
171171

172172
```{r medic1_h3-check}
173173
grade_result(
174-
pass_if(~ identical(.result, 0.5 + (0.2 * 0.5)), "Nous avons deux sous-populations indépendantes : celle qui peut recevoir le médicament et celle qui ne le peut pas à cause d'allergie ou d'intolérance (nous additionnons donc les probabilités respectives). Parmi ceux qui reçoivent le médicament, 20% d'entre eux ne guérissent pas (nous multiplions la probabilité d'appartenir à la sous-population qui peut recevoir le médicament avec la probabilité de ne pas guérir si elle reçoit ce médicament). Vous pouvez aussi tracer un arbre de probabilité pour résoudre ce problème, si vous préférez"),
175-
fail_if(~ TRUE, "Votre calcul n'est pas correct. Combien ne peuvent recevoir le médicament ? Combien n'y réagissent pas positivement ? C'est la clé.")
174+
pass_if(~ identical(.result, 0.5 + (0.2 * 0.5)), "Nous avons deux sous-populations indépendantes : celle qui peut recevoir le médicament et celle qui ne le peut pas à cause d'allergie ou d'intolérance (nous additionnons donc les probabilités respectives). Parmi ceux qui reçoivent le médicament, 20% d'entre eux ne guérissent pas (nous multiplions la probabilité d'appartenir à la sous-population qui peut recevoir le médicament avec la probabilité de ne pas guérir si elle reçoit ce médicament). Vous pouvez aussi tracer un arbre de probabilité pour résoudre ce problème, si vous préférez"),
175+
fail_if(~ TRUE, "Votre calcul n'est pas correct. Combien ne peuvent recevoir le médicament ? Combien n'y réagissent pas positivement ? C'est la clé.")
176176
)
177177
```
178178

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
---
2+
title: "Distributions continues"
3+
author: "Guyliann Engels & Philippe Grosjean"
4+
description: "**SDD I Module 6** Calculs avec une distributions normale."
5+
tutorial:
6+
id: "A07La_distri"
7+
version: 2.1.0/5
8+
output:
9+
learnr::tutorial:
10+
progressive: true
11+
allow_skip: true
12+
runtime: shiny_prerendered
13+
---
14+
15+
```{r setup, include=FALSE}
16+
BioDataScience1::learnr_setup()
17+
SciViews::R("infer")
18+
library(BioDataScience1)
19+
```
20+
21+
```{r, echo=FALSE}
22+
BioDataScience1::learnr_banner()
23+
```
24+
25+
```{r, context="server"}
26+
BioDataScience1::learnr_server(input, output, session)
27+
```
28+
29+
------------------------------------------------------------------------
30+
31+
## Objectifs
32+
33+
La loi de distribution normale est centrale en statistiques. Ce tutoriel vous permet d'auto-évaluer vos acquis à son sujet. Vous allez :
34+
35+
- Vérifier que vous comprenez bien la logique des calculs autour de la distribution normale
36+
37+
- Pouvoir calculer des quantiles à partir de probabilités
38+
39+
- Être capable de calculer des probabilités à partir de quantiles
40+
41+
42+
Vous devez avoir étudié le contenu du [module 6](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2024/probacorr.html) du cours SDD I, et en particulier les sections relatives à la [distribution normale](https://wp.sciviews.org/sdd-umons/?iframe=wp.sciviews.org/sdd-umons-2024/distribution-normale.html). Assurez-vous également au préalable d'être à l'aise avec le calcul des probabilités (que vous vérifiez avec le learnr `BioDataScience1::run("A06La_proba")`).
43+
44+
## Distribution normale
45+
46+
![](images/para_normal_distribution.jpg)
47+
48+
La distribution normale (ou Gaussienne) est appelée comme cela parce que c'est celle qui se rencontre le plus souvent. Elle s'observe à chaque fois que le résultat est la somme de petits effets aléatoires qui se combinent. Elle a une forme caractéristique, dite "en cloche".
49+
50+
### Graphique
51+
52+
Employez R pour représenter la densité de probabilité de la distribution $Y \sim N(10, 9)$ (attention à la différence entre la variance ici et l'écart type "sigma" qui est utilisé dans la fonction de calcul) !
53+
54+
<!-- 💬 **Ce code correspond au snippet `.indens`** [`.in` = (d)`i`stribution: `n`ormal]. -->
55+
56+
```{r normal1_h2, exercise=TRUE, exercise.lines=5}
57+
N1 <- dist_normal(mu = ___, sigma = ___)
58+
___(___) +
59+
___("Densité de probabilité")
60+
```
61+
62+
```{r normal1_h2-hint-1}
63+
N1 <- dist_normal(mu = ___, sigma = ___)
64+
___(___) +
65+
___("Densité de probabilité")
66+
67+
#### ATTENTION: Hint suivant = solution !####
68+
```
69+
70+
```{r normal1_h2-solution}
71+
## Solution ##
72+
N1 <- dist_normal(mu = 10, sigma = 3)
73+
chart(N1) +
74+
ylab("Densité de probabilité")
75+
```
76+
77+
```{r normal1_h2-check}
78+
grade_code("Ceci est plutôt simple à réaliser une fois que l'on se rappelle que l'écart type \"sigma\" est la racine carrée dce la variance. La ligne avec `ylab()` n'est là que pour s'assurer d'avoir le label de l'axe en français.")
79+
```
80+
81+
Ajoutez maintenant sur le graphique une aire en rouge délimitée entre les quantiles 8 et 12 et annotez-là en son centre avec l'indication "P[8, 12]" en rouge. Pour ajouter une aire colorée sous la courbe, vous utilisez `geom_funfill()` avec l'argument `fun = dfun(...)` pour un graphique de densité de probabilité ou `fun = cdfun(...)` pour un graphique de densité de probabilité cumulée. Enfin pour annoter le graphique avec du texte, vous utilisez `annotate("text", ...)`.
82+
83+
<!-- 💬 **Le code ajouté en dernière ligne après celui qui génère le graphique correspond au snippet `.inllabel`.** -->
84+
85+
```{r normal2_h2, exercise=TRUE, exercise.lines=5}
86+
N1 <- dist_normal(mu = 10, sigma = 3)
87+
chart(N1) +
88+
ylab("Densité de probabilité") +
89+
___(fun = ___(N1), from = ___, to = ___) +
90+
___("text", x = ___, y = 0.06, label = "P[8, 12]", col = "red")
91+
```
92+
93+
```{r normal2_h2-hint-1}
94+
N1 <- dist_normal(mu = 10, sigma = 3)
95+
chart(N1) +
96+
ylab("Densité de probabilité") +
97+
geom_funfill(fun = ___(N1), from = ___, to = ___) +
98+
annotate("text", x = ___, y = 0.06, label = "P[8, 12]", col = "red")
99+
100+
#### ATTENTION: Hint suivant = solution !####
101+
```
102+
103+
```{r normal2_h2-solution}
104+
## Solution ##
105+
N1 <- dist_normal(mu = 10, sigma = 3)
106+
chart(N1) +
107+
ylab("Densité de probabilité") +
108+
geom_funfill(fun = dfun(N1), from = 8, to = 12) +
109+
annotate("text", x = 10, y = 0.06, label = "P[8, 12]", col = "red")
110+
```
111+
112+
```{r normal2_h2-check}
113+
grade_code("Si `geom_funfill()` est une function spécifique à `SciViews::R` pour compléter les graphiques des distributions, `annotate(\"text\", ...)` est classique pour les graphiques de type {ggplot2} comme ici et est donc réutilisable pour annoter tous vos graphiques.")
114+
```
115+
116+
### Calculs avec la loi normale
117+
118+
Comme pour les autres lois de distributions, il est vital de pouvoir calculer des probabilités en fonctions de quantiles et des quantiles à partir de probabilités. Nous nous référerons toujours à la probabilités d'avoir une valeur plus petite (aire à gauche avec `lower.tail = TRUE`) ou plus grande (aide à droite avec `lower.tail = FALSE`) que ce quantile. Une aire comprise entre deux quantiles doit se calculer en deux temps (Pr{Q2} - Pr{Q1}).
119+
120+
![](images/maize.jpg)
121+
122+
Vous étudiez la croissance de plants de maïs. A partir d'un grand nombre de mesures, vous avez pu déterminer que la hauteur de vos plants suit une distribution normale avec une moyenne de 145 cm et une variance de 484 (donc un écart type de 22 cm).
123+
124+
Calculez la probabilités d'avoir un plant de maïs pris au hasard de moins de 100 cm de haut dans votre champ.
125+
126+
<!-- 💬 **Ce code correspond au snippet `.inproba`.** -->
127+
128+
```{r normal3_h3, exercise=TRUE}
129+
pnorm(___, mean = ___, sd = ___, lower.tail = ___)
130+
```
131+
132+
```{r normal3_h3-hint-1}
133+
pnorm(100, mean = ___, sd = ___, lower.tail = ___)
134+
```
135+
136+
```{r normal3_h3-hint-2}
137+
pnorm(100, mean = 145, sd = ___, lower.tail = ___)
138+
139+
#### ATTENTION: Hint suivant = solution !####
140+
```
141+
142+
```{r normal3_h3-solution}
143+
## Solution ##
144+
pnorm(100, mean = 145, sd = 22, lower.tail = TRUE)
145+
```
146+
147+
```{r normal3_h3-check}
148+
grade_code("Ici, c'est bien l'aire à gauche du quantile 100 cm qui nous intéresse. Elle correspond à la probabilité qu'un plant soit moins haut que ce quantile et se calcule en spécifiant `lower.tail = FALSE` dans la fonction `pnorm()`.")
149+
```
150+
151+
Calculez la probabilités d'avoir un plant de maïs prélevé au hasard dont la hauteur est comprise entre 120 et 150 cm en utilisant les aires à gauche des quantiles et toujours la fonction `pnorm()`.
152+
153+
```{r normal4_h3, exercise=TRUE}
154+
pnorm(___, mean = ___, sd = ___, lower.tail = ___) -
155+
___
156+
```
157+
158+
```{r normal4_h3-hint-1}
159+
pnorm(150, mean = ___, sd = ___, lower.tail = ___) -
160+
pnorm(___, mean = ___, sd = ___, lower.tail = ___)
161+
```
162+
163+
```{r normal4_h3-hint-2}
164+
pnorm(150, mean = ___, sd = ___, lower.tail = ___) -
165+
pnorm(120, mean = ___, sd = ___, lower.tail = ___)
166+
167+
#### ATTENTION: Hint suivant = solution !####
168+
```
169+
170+
```{r normal4_h3-solution}
171+
## Solution ##
172+
pnorm(150, mean = 145, sd = 22, lower.tail = TRUE) -
173+
pnorm(120, mean = 145, sd = 22, lower.tail = TRUE)
174+
```
175+
176+
```{r normal4_h3-check}
177+
grade_code("Une aire comprise entre deux quantiles se calcule toujours en soustrayant la plus petite de la plus grande (par rapport aux deux quantiles respectifs). Deux calculs sont possibles : via les aires à gauche comme ici, ou via les aires à droite en utilisant `lower.tail = FALSE`.")
178+
```
179+
180+
En partant de la distribution théorique $Y \sim N(10, 6.25)$, calculez le quantile délimitant une probabilités à droite de 0.1 (10% des plus grandes observations), en utilisant l'une des fonctions p/q/r/d.
181+
182+
<!-- 💬 **Ce code correspond au snippet `.inquant`.** -->
183+
184+
```{r normal5_h2, exercise=TRUE}
185+
qnorm(___, mean = ___, sd = __, lower.tail = ___)
186+
```
187+
188+
```{r normal5_h2-hint-1}
189+
qnorm(0.1, mean = ___, sd = ___, lower.tail = ___)
190+
191+
#### ATTENTION: Hint suivant = solution !####
192+
```
193+
194+
```{r normal5_h2-solution}
195+
## Solution ##
196+
qnorm(0.1, mean = 10, sd = 2.5, lower.tail = FALSE)
197+
```
198+
199+
```{r normal5_h2-check}
200+
grade_code("La fonction `qnorm()` calcule un quantile à partir d'une probabilité, contrairement à `pnorm()` qui calcule une probabilité à partir d'un quantile. Vous auriez aussi pu utiliser `quantile(dist_normal(10, 2.5), 1 - 0.1)`... pourquoi `1 - 0.1` ? Parce que `quantile()` calcule toujours par rapport à l'aire à gauche, donc, l'aire complémentaire à nos 10%, soit 90% ici !")
201+
```
202+
203+
## Conclusion
204+
205+
Vous rencontrerez très souvent la loi normale dans vos analyses de données biologiques. Être capable de vérifier si un échantillon suit cette distribution ou non sera également très utile. Faites tout de même attention à la **taille de l'échantillon**. Il vous faut plusieurs dizaines d'observations, sinon, vous n'aurez pas suffisamment de données pour l'estimer de manière valable.
206+
207+
```{r comm_noscore, echo=FALSE}
208+
question_text(
209+
"Laissez-nous vos impressions sur cet outil pédagogique",
210+
answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."),
211+
incorrect = "Vos commentaires sont enregistrés.",
212+
placeholder = "Entrez vos commentaires ici...",
213+
allow_retry = TRUE
214+
)
215+
```

0 commit comments

Comments
 (0)