Skip to content

Commit 59cd92b

Browse files
new version of B02La_reg_multi
1 parent 1c64285 commit 59cd92b

File tree

1 file changed

+95
-130
lines changed

1 file changed

+95
-130
lines changed

inst/tutorials/B02La_reg_multi/B02La_reg_multi.Rmd

Lines changed: 95 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD II Module 2** Aborder la régression linéaire multiple dans R."
55
tutorial:
66
id: "B02La_reg_multi"
7-
version: 2.2.1/7
7+
version: 2.3.0/7
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -14,7 +14,20 @@ runtime: shiny_prerendered
1414

1515
```{r setup, include=FALSE}
1616
BioDataScience2::learnr_setup()
17-
SciViews::R()
17+
SciViews::R("model",lang = "fr")
18+
19+
# dataset -----
20+
fat <- read("fat", package = "faraway")
21+
22+
# lm
23+
densi_lm1 <- lm(data = fat, density ~ abdom)
24+
lm_lin_result <- tidy(densi_lm1)
25+
lm_lin_param <- glance(densi_lm1)
26+
27+
# lm multi
28+
densi_lm2 <- lm(data = fat, density ~ abdom + hip)
29+
lm_mult_result <- tidy(densi_lm2)
30+
lm_mult_param <- glance(densi_lm2)
1831
```
1932

2033
```{r, echo=FALSE}
@@ -31,219 +44,171 @@ BioDataScience2::learnr_server(input, output, session)
3144

3245
## Objectifs
3346

47+
Le premier module vous a permis de vous familiariser avec la régression linéaire. Vous avez appris à interpréter une partie des résultats proposés par le résumé du modèle ainsi qu'à interpréter les graphiques d'analyses des résidus. Les objectifs de ce tutoriel sont :
48+
3449
- Être capable de lire la sortie renvoyée par `summary()` lorsqu'il est appliqué à un objet **lm**.
3550
- Maîtriser la régression linéaire multiple dans R avec la fonction `lm()`.
3651

37-
## Régression linéaire
38-
39-
Réalisez une régression linéaire simple sur le jeu de données `df1` de la variable `y` en fonction de la variable `x`.
40-
41-
```{r reglin-init}
42-
set.seed(42)
43-
44-
reg_lin <- function(x, a, b)
45-
a * x + b
46-
47-
v1 <- seq(from = 5, to = 20, by = 0.25)
48-
v2 <- v1 + rnorm(length(v1), sd = 0.5)
49-
50-
df1 <- dtx(
51-
x = v2,
52-
y = reg_lin(v2, 0.5, 0.001) + rnorm(length(v1), sd = 0.5)
53-
)
54-
55-
lm_lin <- lm(data = df1, y ~ x)
56-
lm_lin_param <- glance(lm_lin)
57-
lm_lin_result <- tidy(lm_lin)
58-
```
52+
## Description des données
5953

60-
Vous avez à votre disposition le graphique suivant pour visualiser les données :
54+
Le tableau de données `fat` traite du pourcentage de masse grasse sur 252 hommes. Les participants à cette étude ont été immergés afin de déterminer leur densité corporelle. Cette méthode bien que très fiable n'est pas des plus simples à mettre en place. Les scientifiques font donc appel à vous afin d'estimer la densité des participants à l'aide de mesures biométriques plus simples à obtenir.
6155

62-
```{r}
63-
chart(data = df1, y ~ x) +
64-
geom_point()
56+
```{r, echo = TRUE}
57+
fat <- read("fat", package = "faraway")
58+
skimr::skim(fat)
6559
```
6660

67-
```{r reglin-prep}
68-
set.seed(42)
61+
## Régression linéaire simple
6962

70-
reg_lin <- function(x, a, b)
71-
a * x + b
72-
73-
v1 <- seq(from = 5, to = 20, by = 0.25)
74-
v2 <- v1 + rnorm(length(v1), sd = 0.5)
75-
76-
df1 <- dtx(
77-
x = v2,
78-
y = reg_lin(v2, 0.5, 0.001) + rnorm(length(v1), sd = 0.5)
79-
)
63+
Intéressez-vous à la densité (`density`) des participants. Modélisez la densité en fonction du tour de taille (`abdom`). Le graphique ci-dessous vous présente le nuage de point associé au modèle demandé.
8064

81-
lm_lin <- lm(data = df1, y ~ x)
82-
lm_lin_param <- glance(lm_lin)
83-
lm_lin_result <- tidy(lm_lin)
65+
```{r, echo=TRUE}
66+
chart(data = fat, density ~ abdom) +
67+
geom_point()
8468
```
8569

86-
💬 **Un snippet peut vous aider à réaliser cet exercice.**
70+
Modélisez la densité (`density`) en fonction du tour de taille (`abdom`) sur les données du tableau `fat`.
8771

88-
```{r reglin_h2, exercise = TRUE, exercise.setup = "reglin-prep"}
89-
summary(lm. <- lm(data = ___, ___ ~ ___))
72+
```{r reglin_h2, exercise = TRUE}
73+
summary(densi_lm1 <- lm(data = ___, ___ ~ ___))
9074
```
9175

9276
```{r reglin_h2-hint}
93-
summary(lm. <- lm(data = DF, FORMULA))
77+
summary(densi_lm1 <- lm(data = DF, FORMULA))
9478
9579
#### ATTENTION: Hint suivant = solution !####
9680
```
9781

9882
```{r reglin_h2-solution}
9983
## Solution ##
100-
summary(lm. <- lm(data = df1, y ~ x))
84+
summary(densi_lm1 <- lm(data = fat, density ~ abdom))
10185
```
10286

10387
```{r reglin_h2-check}
10488
grade_code("D'accord, on a maintenant une régression linéaire simple comme point de départ.")
10589
```
10690

107-
Suite à votre analyse répondez aux questions suivantes :
91+
Analysez le tableau des résultats et répondez aux questions suivantes :
10892

10993
```{r qu_reglin}
11094
quiz(
11195
question(text = "Quelle est la valeur de l'ordonnée à l'origine ?",
112-
answer(sprintf("%.2f", lm_lin_result$estimate[1]), correct = TRUE),
113-
answer(sprintf("%.2f", 0)),
114-
answer(sprintf("%.2f", lm_lin_param$sigma[1])),
115-
answer(sprintf("%.2f", lm_lin_result$estimate[2])),
116-
answer(sprintf("%.2f", lm_lin_param$r.squared[1])),
96+
answer(sprintf("%.4f", lm_lin_result$estimate[1]), correct = TRUE),
97+
answer(sprintf("%.4f", 0)),
98+
answer(sprintf("%.4f", lm_lin_param$sigma[1])),
99+
answer(sprintf("%.4f", lm_lin_result$estimate[2])),
100+
answer(sprintf("%.4f", lm_lin_param$r.squared[1])),
117101
allow_retry = TRUE, random_answer_order = TRUE
118102
),
119103
question(text = "Quelle est la valeur de la pente ?",
120-
answer(sprintf("%.2f", 0)),
121-
answer(sprintf("%.2f", lm_lin_result$estimate[2]), correct = TRUE),
122-
answer(sprintf("%.2f", lm_lin_param$BIC[1])),
123-
answer(sprintf("%.2f", lm_lin_result$estimate[1])),
124-
answer(sprintf("%.2f", lm_lin_param$r.squared[1])),
104+
answer(sprintf("%.4f", 0)),
105+
answer(sprintf("%.4f", lm_lin_result$estimate[2]), correct = TRUE),
106+
answer(sprintf("%.4f", lm_lin_param$BIC[1])),
107+
answer(sprintf("%.4f", lm_lin_result$estimate[1])),
108+
answer(sprintf("%.4f", lm_lin_param$r.squared[1])),
125109
allow_retry = TRUE, random_answer_order = TRUE
126110
),
127111
question(text = "Quelle est la fraction de la variance exprimée par la régression linéaire ?",
128-
answer(sprintf("%.3f", lm_lin_param$r.squared), correct = TRUE),
129-
answer(sprintf("%.3f", lm_lin_param$statistic)),
130-
answer(sprintf("%.3f", as.numeric(lm_lin_param$df))),
131-
answer(sprintf("%.3f", lm_lin_result$estimate[1])),
112+
answer(sprintf("%.4f", lm_lin_param$r.squared), correct = TRUE),
113+
answer(sprintf("%.4f", lm_lin_param$statistic)),
114+
answer(sprintf("%.4f", as.numeric(lm_lin_param$df))),
115+
answer(sprintf("%.4f", lm_lin_result$estimate[1])),
132116
allow_retry = TRUE, random_answer_order = TRUE
133117
)
134118
)
135119
```
136120

137-
## Régression linéaire multiple
138-
139-
```{r regmulti-init}
140-
set.seed(381)
141-
142-
v <- seq(from = 1, to = 15, by = .2)
143-
x <- v + rnorm(length(v), sd = 3)
144-
145-
reg_lin_rand <- function(x, a, b, random = 0.5)
146-
a * x + b + rnorm(length(v), sd = random)
147-
148-
reg_mutli3_rand <- function(x1, a1, x2, a2, x3, a3, b, random = 5)
149-
a1 * x1 + a2 * x2 + a3 * x3 + b + rnorm(length(x1), sd = random)
150-
151-
df2 <- dtx(
152-
x = x,
153-
x0 = reg_lin_rand(x = x, a = 1.26, b = 2, random = 3.5),
154-
x1 = reg_lin_rand(x = x, a = 1.5, b = 1, random = 10),
155-
y = reg_mutli3_rand(x1 = x, x2 = x0, x3 = x1,
156-
a1 = 0.2, a2 = 0.3, a3 = 1.1, b = 2))
157-
158-
lm_mult <- lm(data = df2, y ~ x + x1)
159-
lm_mult_coef <- tidy(lm_mult)
160-
lm_mult_param <- glance(lm_mult)
161-
```
121+
L'analyse des résidus n'est pas l'objectif de cette séance d'exercice. Prenez cependant le temps de critiquer chaque graphique.
162122

163123
```{r}
164-
summary(df2)
124+
chart$residuals(densi_lm1)
165125
```
166126

167-
Réalisez une régression linéaire simple sur le jeu de données `df2` de la variable `y` en fonction de la variable `x` et `x1`.
168-
169-
```{r regmulti-prep}
170-
set.seed(381)
171-
172-
v <- seq(from = 1, to = 15, by = .2)
173-
x <- v + rnorm(length(v), sd = 3)
174-
175-
reg_lin_rand <- function(x, a, b, random = 0.5)
176-
a * x + b + rnorm(length(v), sd = random)
177-
178-
reg_mutli3_rand <- function(x1, a1, x2, a2, x3, a3, b, random = 5)
179-
a1 * x1 + a2 * x2 + a3 * x3 + b + rnorm(length(x1), sd = random)
127+
## Régression linéaire multiple
180128

181-
df2 <- dtx(
182-
x = x,
183-
x0 = reg_lin_rand(x = x, a = 1.26, b = 2, random = 3.5),
184-
x1 = reg_lin_rand(x = x, a = 1.5, b = 1, random = 10),
185-
y = reg_mutli3_rand(x1 = x, x2 = x0, x3 = x1,
186-
a1 = 0.2, a2 = 0.3, a3 = 1.1, b = 2))
129+
Tentez de réaliser à présent une régression linéaire multiple afin d'améliorer votre modèle. Réalisez à présent un modèle de la densité (`density`) en fonction du tour de taille (`abdom`) et du tour de hanche (`hip`). Le graphique de la densité en fonction du tour de taille vous a été présenté précédemment. Vous trouverez ci-dessous le graphique de la densité en fonction du tour de hanches.
187130

188-
lm_mult <- lm(data = df2, y ~ x + x1)
189-
lm_mult_coef <- tidy(lm_mult)
190-
lm_mult_param <- glance(lm_mult)
131+
```{r, echo = TRUE}
132+
chart(data = fat, density ~ hip) +
133+
geom_point()
191134
```
192135

193-
💬 **Un snippet peut vous aider à réaliser cet exercice.**
194-
195-
```{r regmulti_h2, exercise = TRUE, exercise.setup = "regmulti-prep"}
136+
```{r regmulti_h2, exercise = TRUE}
196137
# régression multiple
197-
summary(lm. <- lm(data = ___, ___ ~ ___))
138+
summary(densi_lm2 <- lm(data = ___, ___ ~ ___))
198139
```
199140

200141
```{r regmulti_h2-hint}
201-
summary(lm. <- lm(data = DF, Y ~ VAR1 + VAR2))
142+
summary(densi_lm2 <- lm(data = DF, Y ~ VAR1 + VAR2))
202143
203144
#### ATTENTION: Hint suivant = solution !####
204145
```
205146

206147
```{r regmulti_h2-solution}
207148
## Solution ##
208-
summary(lm. <- lm(data = df2, y ~ x + x1))
149+
summary(densi_lm2 <- lm(data = fat, density ~ abdom + hip))
209150
```
210151

211152
```{r regmulti_h2-check}
212153
grade_code("Vous venez de réaliser votre première régression linéaire multiple. Elles n'auront bientôt plus de secrets pour vous !")
213154
```
214155

215-
Suite à votre analyse répondez aux questions suivantes :
156+
Suite à votre analyse, répondez aux questions suivantes :
216157

217158
```{r qu_regmulti}
218159
quiz(
219-
question(text = "Quelle est la valeur de l'ordonnée à l'origine ?",
220-
answer(sprintf("%.2f", lm_mult_coef$estimate[1]), correct = TRUE),
221-
answer(sprintf("%.2f", lm_mult_coef$estimate[2])),
222-
answer(sprintf("%.2f", lm_mult_coef$p.value[1])),
223-
answer(sprintf("%.2f", lm_mult_param$AIC[1])),
224-
answer(sprintf("%.2f", lm_mult_param$r.squared[1])),
160+
question(text = "Quelle est la valeur de l'écart-type résiduel de ce modèle ?",
161+
answer(sprintf("%.4f", lm_mult_param$sigma[1]), correct = TRUE),
162+
answer(sprintf("%.4f", lm_mult_result$estimate[2])),
163+
answer(sprintf("%.4f", lm_mult_result$p.value[1])),
164+
answer(sprintf("%.4f", lm_mult_param$AIC[1])),
165+
answer(sprintf("%.4f", lm_mult_param$r.squared[1])),
225166
allow_retry = TRUE, random_answer_order = TRUE
226167
),
227168
question(text = "Quelle est la fraction de la variance exprimée par la régression linéaire ?",
228-
answer(sprintf("%.3f", lm_mult_param$adj.r.squared), correct = TRUE),
229-
answer(sprintf("%.3f", lm_mult_param$r.squared)),
230-
answer(sprintf("%.3f", lm_mult_param$df)),
231-
answer(sprintf("%.3f", lm_mult_coef$estimate[1])),
169+
answer(sprintf("%.4f", lm_mult_param$adj.r.squared), correct = TRUE),
170+
answer(sprintf("%.4f", lm_mult_param$r.squared)),
171+
answer(sprintf("%.4f", lm_mult_param$df)),
172+
answer(sprintf("%.4f", lm_mult_result$estimate[1])),
232173
allow_retry = TRUE, random_answer_order = TRUE
233174
)
234175
)
235176
```
236177

178+
L'analyse des résidus n'est pas l'objectif de cette séance d'exercice. Prenez cependant le temps de critiquer chaque graphique.
179+
180+
```{r}
181+
chart$residuals(densi_lm2)
182+
```
183+
184+
## Choix du meilleur modèle
185+
186+
Vous venez de réaliser deux modèles. Il s'agit d'un cas particulier. Ces deux modèles sont imbriqués. Le premier modèle de la densité en fonction du tour de taille se nomme `densi_lm1` et le second modèle de la densité en fonction du tour de taille et du tour de hanche se nomme `densi_lm2`. Comment pourriez-vous départager ces deux modèles ? Outre l'analyse du résumé des modèles et des résidus, il existe des outils pour départager ces deux modèles. L'ANOVA ci-dessus vous permet de définir qu'il y a une différence significative entre ces deux modèles.
187+
188+
```{r, echo = TRUE}
189+
anova(densi_lm1, densi_lm2)
190+
```
191+
192+
Le critère d'Akaike est une métrique adaptée à la comparaison de modèles. Le meilleur modèle selon le critère d'Akaike est le modèle ayant obtenu la valeur la plus faible.
193+
194+
```{r}
195+
AIC(densi_lm1, densi_lm2)
196+
```
197+
198+
Suite à l'analyse des résumés des deux modèles, l'interprétation des graphiques des résidus et des valeurs du critère d'Akaike, le second modèle est plus performant afin de modéliser la densité des personnes étudiées.
199+
237200
## Conclusion
238201

239-
Vous venez de terminer votre séance d'exercices relive à la régression multiple.
202+
Vous venez de terminer votre séance d'exercices relative à la régression multiple.
240203

241204
```{r comm_noscore, echo=FALSE}
242205
question_text(
243206
"Laissez-nous vos impressions sur ce learnr",
244207
answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."),
245208
incorrect = "Vos commentaires sont enregistrés.",
246209
placeholder = "Entrez vos commentaires ici...",
247-
allow_retry = TRUE
210+
allow_retry = TRUE,
211+
submit_button = "Soumettre une réponse",
212+
try_again_button = "Resoumettre une réponse"
248213
)
249214
```

0 commit comments

Comments
 (0)