Skip to content

Commit 98a2c24

Browse files
committed
B01Lb_residuals finalized
1 parent c930cab commit 98a2c24

File tree

3 files changed

+84
-1014
lines changed

3 files changed

+84
-1014
lines changed

inst/tutorials/B01Lb_residuals/B01Lb_residuals.Rmd

Lines changed: 72 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title: "Analyse des résidus d'une régression"
33
author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD II Module 1** Analyser les résidus d'une régression linéaire simple."
5+
bibliography: references.bib
56
tutorial:
67
id: "B01Lb_residuals"
78
version: 2.1.0/6
@@ -15,13 +16,11 @@ runtime: shiny_prerendered
1516
```{r setup, include=FALSE}
1617
BioDataScience2::learnr_setup()
1718
SciViews::R("model", lang = "fr")
18-
# ajout temporaire
19-
library(tabularise)
2019
2120
rice <- read("rice", package = "BioDataScience2")
22-
rice <- labelise(rice, self = FALSE,
21+
rice <- labelise(rice,
2322
label = list(area = "Surface", major_axis_length = "Longueur"),
24-
units = list(area = "pixels²", major_axis_length = "pixels")
23+
units = list(area = "pixels^2", major_axis_length = "pixels")
2524
)
2625
2726
rice_lm <- lm(data = rice, area ~ major_axis_length)
@@ -51,21 +50,25 @@ BioDataScience2::learnr_server(input, output, session)
5150

5251
## Description des données
5352

54-
Des ingénieurs agronomes s'intéressent à deux variétés de riz cultivées en Turquie. Ils ont pour objectif de mettre en place un outil capable, sur base d'analyse d'image, de classer des grains de riz. Les dimensions mesurées sur les images ne sont pas calibrées et sont exprimées en pixels. Nous rajoutons cette information dans `rice`.
53+
@Cinar_Koklu_2019 s'intéressent à deux variétés de riz cultivées en Turquie . Ils ont pour objectif de mettre en place un outil capable, sur base d'analyse d'image, de classer des grains de riz. Une copie de leurs données est disponible dans `rice` du package `BioDataScience2`. Les dimensions mesurées sur les images ne sont pas calibrées et sont exprimées en pixels. Nous rajoutons cette information dans notre jeu de données à l'aide de `labelise()`.
5554

5655
```{r, echo = TRUE}
5756
rice <- read("rice", package = "BioDataScience2")
58-
rice <- labelise(rice, self = FALSE,
57+
rice <- labelise(rice,
5958
label = list(area = "Surface", major_axis_length = "Longueur"),
60-
units = list(area = "pixels²", major_axis_length = "pixels")
59+
units = list(area = "pixels^2", major_axis_length = "pixels")
6160
)
6261
```
6362

64-
Vous avez à disposition le tableau `rice` constitué des variables suivantes `r names(rice)`. Consultez la page d'aide avec `?BioDataScience2::rice` afin d'en apprendre davantage.
63+
Vous avez à disposition le tableau `rice` constitué des variables suivantes :
6564

66-
Votre objectif est de réaliser une régression linéaire de la variable `area` sur à la variable `major_axis_length`. Vous devrez ensuite analyser le résumé de cette régression et utiliser les outils de diagnostic des résidus.
65+
`r paste0("<code>", names(rice), "</code>")`
6766

68-
Débutez cette analyse en réalisant un nuage de point de la variable `area` en fonction de la variable `major_axis_length` pour voir comment se présentent les données.
67+
Consultez la page d'aide avec `?BioDataScience2::rice` et la publication (référence en fin de document et dans la page d'aide) pour en apprendre davantage.
68+
69+
Votre objectif est de réaliser une régression linéaire de la variable `area` en fonction de `major_axis_length`, parce que vous soupçonnez cette relation d'être importante pour discriminer les deux variétés de riz plus tard. Vous devrez ensuite analyser le résumé de cette régression et utiliser les outils de diagnostic des résidus.
70+
71+
Débutez cette analyse en réalisant un nuage de point de `area` en fonction de `major_axis_length` pour voir comment se présentent les données.
6972

7073
```{r np_h2, exercise=TRUE}
7174
chart(data = ___, ___ ~ ___) ___
@@ -101,6 +104,7 @@ Nous voyons que `area` est raisonnablement bien corrélé à `major_axis_length`
101104
skimr::skim(rice)
102105
```
103106

107+
Les distributions des deux variables sont univariées et les moyennes assez proches des médianes, ce qui est bon signe (symétrie). Il n'y a pas de données manquantes. Avec `r nrow(rice)`, nous avons un nombre bien suffisant de cas pour réaliser notre régression linéaire.
104108

105109
## Modélisation
106110

@@ -137,7 +141,7 @@ chart(rice_lm)
137141
```
138142

139143
```{r rice_lm_h2-check}
140-
grade_code("Vous avez calculé votre objet `lm_rice`. Vous l'avez résumé et représenté graphiquement. Vous avez du matériel à examiner pour déterminer si cette régression tient la route.")
144+
grade_code("Vous avez calculé votre objet `lm_rice`. Vous l'avez résumé et représenté graphiquement. Vous avez du matériel à examiner pour déterminer si cette régression tient la route. Avec un R^2 de 0.815, la régression est bonne, mais pouvez-vous repérer des éléments importants dans le tableau via le Quiz ci-dessous ?")
141145
```
142146

143147
```{r qu_lm}
@@ -171,73 +175,96 @@ quiz(
171175
)
172176
```
173177

174-
### Paramétrisation du modèle
178+
#### Paramétrisation du modèle
179+
180+
Une fois que vous avez les estimateurs des différents paramètres de votre modèle, vous pouvez placer ces valeurs dans son équation. Cette étape importante se nomme la **paramétrisation** du modèle.
181+
182+
##### Comment faire en pratique ?
175183

176-
Une fois que vous avez les estimateurs des différents paramètres de votre modèle, vous pouvez placer ces valeurs dans son équation. Cette étape importante se nomme la **paramétrisation** du modèle. Dans la SciViews Box 2023, vous avez des outils pour vous y aider. La fonction `eq__()` extrait l'équation du modèle et son argument `use_coefs = TRUE` indique de remplacer les paramètres par les valeurs estimées. Ainsi, pour obtenir cette équation, vous pouvez écrire un chunk en ligne `` `r eq__(rice_lm, use_coefs = TRUE)` `` à l'intérieur de balises Markdown d'équation dite "display" (équation sur sa propre ligne, hors texte, par opposition à l'équation "inline", directement dans le texte). Cela s'écrit comme suit :
184+
Dans la SciViews Box 2023, vous avez des outils pour vous y aider. La fonction `eq__()` extrait l'équation du modèle et son argument `use_coefs = TRUE` indique de remplacer les paramètres par les valeurs estimées. Ainsi, pour obtenir cette équation, vous pouvez écrire un chunk en ligne `` `r eq__(rice_lm, use_coefs = TRUE)` `` à l'intérieur de balises Markdown d'équation dite "display" (équation sur sa propre ligne, hors texte, par opposition à l'équation "inline", directement dans le texte). Cela s'écrit comme suit :
177185

178-
- à une nouvelle ligne, vous entrez deux dollars `$$`, c'est la balise Markdown d'entrée d'une équation
186+
- à une nouvelle ligne, vous entrez deux dollars `$$`, c'est la balise Markdown d'entrée d'une équation "display"
179187
- à la ligne suivante, vous écrivez le chunk en ligne `` `r eq__(...)` `` qui viendra placer le contenu de l'équation calculé par R lors du rendu du document
180-
- à la troisième ligne, vous fermer le balisage d'équation à nouveau avec deux dollars `$$` et prenez soin d'encader le tout par deux lignes vide (une au dessus de la balise d'entrée, et une au dessous de la balise de sortie)
188+
- à la troisième ligne, vous fermez le balisage d'équation à nouveau avec deux dollars `$$` et prenez soin d'encadrer le tout par deux lignes vides (une au-dessus de la balise d'entrée, et une au-dessous de la balise de sortie)
181189

182190
Cela donne ceci :
183191

184192
$$
185-
`r eq__(rice_lm, use_coefs = TRUE, coef_digits = c(0, 2))`
193+
`r eq__(rice_lm, use_coefs = TRUE, coef_digits = c(0, 1))`
186194
$$
187195

188-
Notez que vous contrôlez le nombre de chiffres derrière la virgule pour chaque estimation à l'aide de l'argument supplémentaire `coef_digits =` qui accepte un entier (même nombre de chiffres derrière la virgule pour tous les estimateurs), ou un vecteur d'entiers pour varier la précision de chaque estimateur successif. Notez aussi que `eq__()` ne remplace pas encore les noms des variables par les labels. L'équation ci-dessus a été obtenue à l'aide de `` `r eq__(rice_lm, use_coefs = TRUE, coef_digits = c(0, 2))` ``.
196+
**Astuce:** vous contrôlez le nombre de chiffres derrière la virgule pour chaque estimateur à l'aide de l'argument supplémentaire `coef_digits =` qui accepte un nombre entier (même nombre de chiffres derrière la virgule pour tous les estimateurs), ou un vecteur d'entiers pour varier la précision de chaque estimateur successif. Il est important de limiter les valeurs à un nombre de chiffres **significatifs** par rapport au calcul qui est réalisé. Ne jamais conserver un grand nombre de décimales inutiles dans les équations ! L'équation ci-dessus a été obtenue à l'aide de `` `r eq__(rice_lm, use_coefs = TRUE, coef_digits = c(0, 1))` ``.
197+
198+
##### Compréhension de la paramétrisation du modèle
199+
200+
Maintenant que les aspects techniques sont expliqués, concentrez-vous sur le contenu de cette dernière équation et sa signification.
201+
202+
- Rappelez-vous que $Y = \hat{Y} + \epsilon$, les valeurs de la variable réponse $Y$ sont égales à leurs valeurs estimées par le modèle notées $\hat{Y}$ (on prononce "I grec chapeau" en français, ou "waïe hat" en anglais) additionnées des résidus $\epsilon$ et
203+
204+
- $\epsilon \sim \mathcal{N}(0, \sigma)$. les résidus forment la composante statistique du modèle et suivent une distribution Normale de moyenne nulle et d'écart type constant $\sigma$.
189205

190-
Maintenant que les aspects techniques sont expliqués, concentrez-vous sur cette équation *Comparez le modèle paramétrisé avec son équation générale qui est présentée dans le tableau résumé plus haut. Assurez-vous d'avoir bien compris la logique de la paramétrisation pour passer de l'un à l'autre avant de passer à la suite.*
206+
- Comparez l'équation du modèle paramétrisé avec l'équation générale du modèle qui est présentée dans le tableau résumé plus haut. **Assurez-vous d'avoir bien compris la logique de la paramétrisation pour passer de l'une à l'autre avant de passer à la suite.**
207+
208+
Pour vous faciliter la comparaison, l'équation générale du modèle est reproduite ci-dessous avec `` `r eq__(rice_lm)` `` :
209+
210+
$$
211+
`r eq__(rice_lm)`
212+
$$
191213

192214
## Analyse des résidus
193215

194-
Le graphique et le tableau ci-dessous vous permettent d'obtenir des informations sur l'objet `rice_lm` que vous avez calculé précédemment
216+
Le graphique et le tableau ci-dessous vous rappellent les informations importantes de votre régression `rice_lm`.
195217

196218
```{r, echo=TRUE}
197-
# Graphique de votre objet `lm`
219+
# Graphique de la régression `rice_lm`
198220
chart(rice_lm)
199-
# Tableau relatif à la paramétrisation du modèle
221+
# Tableau résumé court de la régression `rice_lm`
200222
tabularise$tidy(rice_lm)
201223
```
202224

203-
Vous avez à votre disposition l'objet `rice_lm` que vous avez créé précédemment. Construisez quatre graphiques afin d'étudier (1) la distribution générale des résidus, (2) le graphique quantile-quantile des résidus, (3) la position et l'échelle des résidus et (4) la distance de Cook des résidus.
225+
Vous avez toujours à disposition l'objet `rice_lm`. Construisez quatre graphiques afin d'étudier :
226+
227+
- les résidus par rapport aux valeurs prédites de `area`,
228+
- la distribution des résidus via un graphique quantile-quantile,
229+
- l'échelle et la position position des résidus par rapport à `area` et
230+
- l'a distance de Cook des résidus'effet de levier des observations.
204231

205232
```{r resid_h2, exercise=TRUE}
206-
# Distribution des résidus
233+
# Résidus en fonction des valeurs prédites de area
207234
chart$___(___)
208235
# Graphique quantile-quantile
209236
chart$___(___)
210-
# Position et échelle des résidus
237+
# Echelle et position des résidus
211238
chart$___(___)
212-
# Distance de Cook
239+
# Effet de levier
213240
chart$___(___)
214241
```
215242

216243
```{r resid_h2-hint-1}
217244
# Consultez la page d'aide `?modelit::chart.lm`
218245
219-
# Distribution des résidus
246+
# Résidus en fonction des valeurs prédites de area
220247
chart$___(___)
221248
# Graphique quantile-quantile
222249
chart$___(___)
223-
# Position et échelle des résidus
250+
# Echelle et position des résidus
224251
chart$___(___)
225-
# Distance de Cook
252+
# Effet de levier
226253
chart$___(___)
227254
228255
#### ATTENTION: Hint suivant = solution !####
229256
```
230257

231258
```{r resid_h2-solution}
232259
## Solution ##
233-
# Distribution des résidus
260+
# Résidus en fonction des valeurs prédites de area
234261
chart$resfitted(rice_lm)
235262
# Graphique quantile-quantile
236263
chart$qqplot(rice_lm)
237-
# Position et echelle des résidus
264+
# Echelle et position des résidus
238265
chart$scalelocation(rice_lm)
239-
# Distance de Cook
240-
chart$cooksd(rice_lm)
266+
# Effet de levier
267+
chart$resleverage(rice_lm)
241268
```
242269

243270
```{r resid_h2-check}
@@ -246,18 +273,22 @@ grade_code("Ce sont les quatre graphiques les plus courants de l'analyse des ré
246273

247274
```{r qu_resid}
248275
question("Sélectionnez parmi les éléments suivants les affirmations vraies.",
249-
answer("Aucune valeur n'influence trop fortement la régression linéaire.", correct = TRUE, message = "La régression linéaire est très influencée par les valeurs extrêmes. La distance de cook est parfaite pour étudier ces valeurs extrêmes."),
250-
answer("On observe autant de résidus positifs que négatifs.", correct = TRUE, message = "La distribution des résidus montre permet d'observer qu'il y a autant de résidus positifs que négatifs. La répartition des résidus est homogène tout le long de l'axe X (les valeurs prédites)."),
251-
answer("Les résidus suivent une distribution normale.", correct = TRUE, message = "Le graphique quantile-quantile permet d'étudier la distribution normale. On observe que les résidus les plus faible et les plus élévé s'éloigne de la droite. Il serait intéressant de tenter des transformations mathématique sur les variables pour rendre la distribution des résidus noramle."),
252-
answer("Les résidus positif et négatif ont des valeurs similaires dans l'absolu.", correct = TRUE, message = "La position et l'échelle des résidus permet dd superposer les résidus positifs et négatifs. On peut observer que la courbe bleue est presque horizontale."),
253-
correct = "Bien joué ! Vous avez sélectionné les affirmations correctes.",
254-
incorrect = "Oups, il semble que vous avez mal interpété les graphiques ci-dessus. C'est très complexe d'étudier les graphiques de diagnostic.",
255-
allow_retry = TRUE, random_answer_order = TRUE,
276+
answer("Les résidus sont contenus et se répartissent de manière équilibrée et linéaire.", correct = TRUE, message = "**Graphique1** La répartition des résidus sur le premier graphique permet d'observer sur l'axe des ordonnées des valeurs entre - 2000 et +2000 pour les résidus, par rapport à un plage plus élevée pour les valeurs prédites de 10000 à 17000. Les résidus sont donc, comparativement, raisonnables. La répartition des résidus est homogène autour de l'axe horizontal à zéro et il n'y a pas de dérive non linéaire (la courbe de tendance générale en bleu est pratiquement linéaire et reste proche de zéro)."),
277+
answer("Les résidus suivent une distribution Normale.", correct = TRUE, message = "<br/><br/>**Graphique 2** Le graphique quantile-quantile permet de vérifier si la distribution des résidus est Normale. On observe que les résidus les plus faibles et les plus élevés ne s'éloigne de la droite de référence que très légèrement. La distribution des résidus est donc Normale ou proche de la Normale."),
278+
answer("Il y a homoscédasticité des résidus.", correct = TRUE, message = "<br/><br/>**Graphique 3** La position et l'échelle des résidus sur le graphique 3, en représentant leur valeur absolue sur l'axe des ordonnées, superpose les résidus négatifs sur les résidus positifs. Cette représentation est la meilleure pour vérifier l'homoscédasticité, c'est-à-dire, la variance homogène en fonction des valeurs prédites sur l'axe des abscisses. La courbe de tendance en bleu est horizontale, ce qui le confirme. Nous avons bien ici homoscédasticité des résidus."),
279+
answer("Aucune valeur n'influence trop fortement la régression linéaire.", correct = TRUE, message = "<br/><br/>**Graphique 4** La régression linéaire par les moindres carrés est très influencée par les valeurs extrêmes. L'effet de levier quantifie l'impact de chaque observation sur la position de la droite de régression. La distance de Cook (taille des points sur le quatrième graphique) mets en évidence les valeurs extrêmes. Ici, le graphique 4 présente un comportement sain du point de vue des observations potentiellement influentes ou extrêmes."),
280+
correct = "Vous avez sélectionné les affirmations correctes.",
281+
incorrect = "Oups, il semble que vous avez mal interpété les graphiques ci-dessus. Observez bien, relisez la section correspondante du cours et retentez l'exercice.",
282+
allow_retry = TRUE, random_answer_order = FALSE,
256283
submit_button = "Soumettre une réponse",
257284
try_again_button = "Resoumettre une réponse"
258285
)
259286
```
260287

288+
L'analyse des résidus est importante pour déterminer la validité de votre modèle, mais ce n'est pas une tâche facile. Au début, ces graphiques ne paraissent pas des plus clairs. Vous apprendrez par la pratique et en faisant d'autres exercices dans la suite du cours.
289+
290+
Ici, le nombre important d'observations donne une réponse claire... et de plus, les résidus sont pratiquement parfaits. Retenez ceci comme un exemple d'excellents résultats. Avec moins de points (voyez par exemple le cas des cerisiers noirs développé dans le cours) il faut bien aiguiser son œil pour discerner les résultats corrects ou acceptables de ceux qui invalident votre modèle.
291+
261292
## Conclusion
262293

263294
Vous progressez dans votre apprentissage. Vous venez de découvrir comment réaliser une régression linéaire simple dans R, d'en produire un tableau résumé et une visualisation graphique. Vous avez abordé la paramétrisation de l'équation du modèle et vous avez entrepris une première approche de l'analyse des résidus du modèle.
@@ -273,3 +304,5 @@ question_text(
273304
try_again_button = "Resoumettre une réponse"
274305
)
275306
```
307+
308+
### Reference

0 commit comments

Comments
 (0)