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
La première partie de ce module vous a permis de vous familiariser avec la régression linéaire multiple. L'objectif de ce tutoriel est :
50
-
51
-
- Maîtriser la régression linéaire polynomiale dans R avec la fonction `lm()`.
45
+
L'objectif de ce tutoriel est de vous exercer à réaliser une régression polynomiale dans R avec la fonction `lm()`.
52
46
53
47
## Description des données
54
48
55
-
Le tableau de données `reddrum` traite de la croissance de *Sciaenops ocellatus* (L., 1766), un poisson da la famille des Scianidae. Sur base des études Porch et Nieland (2002), le tableau comprend des données simulées de la relation de la longueur en fonction de l'âge. Le tambour rouge est un poisson ayant une longueur totale moyenne de 1 mètre adulte. L'individu le plus long recensé mesurait 1.55 mètre et l'individu le plus âgé avait 50 ans. On le retrouve dans l'océan atlantique, le long des côtes est de l'Amérique du Nord et dans le golfe du Mexique.
49
+
Le jeu de données `reddrum` traite de la croissance de l'ombrine tachetée *Sciaenops ocellatus* (L., 1766), un poisson da la famille des Scianidae qui vit sur la côte américaine de l'Océan Atlantique, du Massachusetts jusqu'au nord du Mexique. Les données de la longueur du poisson en fonction de son âge sont simulées sur base de mesures réalisées par Porch, Wilson et Nieland (2002). Cette espèce peut atteindre 1,5 mètre et peut vire plusieurs dizaines d'années jusqu'à 50 ou 60 ans.
56
50
57
-
```{r, echo = TRUE}
51
+
Voir Porch, C., C.A. Wilson & D. Nieland (2002). A new growth model for red drum (*Scianops ocellatus*) that accommodates seasonal and ontogenic changes in growth rates. Fish. Bull., 100:149-152.
52
+
53
+

54
+
55
+
```{r, echo=TRUE}
58
56
SciViews::R("model",lang = "fr") # Configuration du système
59
57
60
58
# Importation des données
61
59
reddrum <- read("reddrum", package = "UsingR")
62
60
# Conversion de pouce en mètre
63
-
reddrum$length <- reddrum$length*0.0254
61
+
reddrum$length <- reddrum$length * 0.0254
64
62
# Ajout des labels et unités
65
63
reddrum <- labelise(reddrum,
66
-
label = list(length = "Longueur totale", age = "Age"),
67
-
units = list(length = "m", age = "Année"))
64
+
label = list(length = "Longueur", age = "Âge"),
65
+
units = list(length = "m", age = "années"))
68
66
69
67
skimr::skim(reddrum)
70
68
```
71
69
72
-
Les données employées sont une simulation basée sur le papier suivant :
73
-
74
-
- Porch, Clay & C.A., Wilson & Nieland, David. (2002). A new growth model for red drum (Scianops ocellatus) that accommodates seasonal and ontogenic changes in growth rates. Fishery Bulletin- National Oceanic and Atmospheric Administration. 100. 149-152
75
-
76
70
## Modélisation
77
71
78
-
Vous allez modéliser la longueur (m) des poissons en fonction de leur âge. Le graphique ci-dessous vous propose à nouveau le nuage de points correspondant.
72
+
Vous allez modéliser la longueur (m) de l'ombrine tachetée en fonction de son âge dont voici la représentation graphique.
79
73
80
74
```{r, echo=TRUE}
81
75
chart(data = reddrum, length ~ age) +
82
76
geom_point()
83
77
```
84
78
85
-
La croissance de ces poissons est particulière. Les juvéniles ont une croissance très rapide et les adultes croient très lentement. La modélisation de cette relation s'annonce une tâche complexe.
79
+
La croissance de ces poissons est particulière. Les juvéniles ont une croissance très rapide et ensuite, la croissance ralentit nettement sans jamais devenir nulle. La forme du nuage de points est telle qu'il est difficile, voire impossible de trouver une transformation capable de le linéariser. Commencez, à titre de référence, par ajuster une régression linéaire sur les données non transformées.
86
80
87
-
```{r reglin_h2, exercise = TRUE}
81
+
```{r reglin_h2, exercise=TRUE}
88
82
reddrum_lm1 <- lm(data = ___, ___ ~ ___)
89
83
# Résumé du modèle
90
84
summary(___)
@@ -112,9 +106,11 @@ chart(reddrum_lm1)
112
106
```
113
107
114
108
```{r reglin_h2-check}
115
-
grade_code("Voici notre régression linéaire. Le R^2 est de 0.82. On pourrait penser que ce modèle est très intéressant, si on se limite à cette valeur. Cependant, en visualisant notre droite sur le graphique, on observe un problème d'ajustement du modèle pour les jeunes individus. Interprétez chaque graphique de l'analyse des résidus pour déterminer si la régression linéaire est justifiée ici.")
109
+
grade_code("Voici notre régression linéaire. Le R^2 est de 0.82. On pourrait penser que ce modèle est très intéressant, si on se limite à cette valeur. Cependant, en visualisant notre droite sur le graphique, on observe un problème d'ajustement du modèle pour les jeunes individus.")
116
110
```
117
111
112
+
Afin de compléter notre analyse, voici les graphiques des résidus.
113
+
118
114
```{r}
119
115
chart$residuals(lm1)
120
116
```
@@ -149,9 +145,11 @@ chart(reddrum_lm2)
149
145
```
150
146
151
147
```{r regpoly_h2-check}
152
-
grade_code("Voici notre parabole ajustée dans les données... Est-ce mieux que la droite ? Visuellement, on peut observer que notre modèle est meilleur. Cela n'empêche pas d'étudier le résumé du modèle et d'étudier les graphiques de l'analyse des résidus")
148
+
grade_code("Cette fois-ci, nous avons ajusté une parabole dans les données... C'est déjà mieux, mais insuffisant.")
153
149
```
154
150
151
+
Analyse des résidus pour le modèle polynomial d'ordre 2.
152
+
155
153
```{r}
156
154
chart$residuals(lm2)
157
155
```
@@ -186,24 +184,25 @@ chart(reddrum_lm3)
186
184
```
187
185
188
186
```{r regpoly3_h2-check}
189
-
grade_code(" Est-ce mieux que la la régression linéaire ou que la régression linéaire polynomiale d'ordre 2 ? Visuellement, on peut observer que notre modèle semble meilleur. Attention, vous devez toujours étudier le résumé du modèle et étudier les graphiques de l'analyse des résidus")
187
+
grade_code("Observez comme la courbe devient de plus en plus flexible à mesure que l'ordre du polynome augmente.")
190
188
```
191
189
190
+
Analyse des résidus pour la régression polynomiale d'ordre 3.
191
+
192
192
```{r}
193
193
chart$residuals(lm3)
194
194
```
195
195
196
-
Étudiez la régression polynomiale d'ordre 3 et répondez aux questions ci-dessous.
196
+
Étudiez les résultats obtenus et répondez aux question ci-dessous.
197
197
198
198
```{r qu_regpoly}
199
199
quiz(
200
-
question(text = "Quelle est la valeur de l'ordonnée à l'origine pour la régression polynomiale d'ordre 3 ?",
Nous avons pu observer que notre modèle s'ajustait de mieux en mieux en augmentant l'ordre de notre polynôme. Une méthode consiste à augmenter l'ordre du polynôme de manière itérative jusqu'à ce que les variables du modèle ne soient plus significatives. Nous ne détaillons pas chaque modèle. Voici le polynome d'ordre 6.
224
+
Nous avons pu observer que notre modèle s'ajuste de mieux en mieux en augmentant l'ordre de notre polynôme. Une méthode consiste à augmenter l'ordre du polynôme de manière itérative jusqu'à ce que le paramètre relatif au terme d'ordre maximum ne soit plus significativement différent de zéro. Ici, cela implique de tester aussi un modèle polynomial d'ordre 4, 5, 6, 7... Nous ne détaillons pas chaque modèle, mais voici ce que donne le polynôme d'ordre 6.
Jusqu'à la régression polynomiale d'ordre 7, toutes les variables de nos modèles successifs sont significatives au seuil alpha de 5%. À partir de ce dernier, nous avons franchi la limite. Les variables du modèle ne sont plus significatives. Le meilleur modèle polynomial est le polynôme d'ordre 6.
248
+
Nous voyons ici que le paramètre du terme en puissance 7 n'est plus significativement différent de zéro au seuil alpha de 5%. Nous avons franchi la limite. Nous en concluons donc que le meilleur modèle polynomial est ici le polynôme d'ordre 6.
246
249
247
250
Poussons notre réflexion encore un peu plus loin. Si nous calculons une régression polynomiale d'ordre n-1. La courbe va s'adapter parfaitement à la distribution de nos observations. La valeur de R^2^ sera de 1. Ce modèle ne sera d'aucune utilité. Nous seront dans un cas de surajustement. Il ne contient plus aucune information pertinente.
248
251
249
-
Voici une analyse de la régression linéaire simple à la régression polynomiale d'ordre 9.
252
+
Voici une analyse de la régression linéaire simple à la régression polynomiale d'ordre 9. Au lieu d'utiliser `age + I(age^2) + I(age^3) + ...`, ce qui devient rapidement fastidieux, nous utilisons ici `poly(x, n, raw = TRUE)`, avec `n`, l'ordre du polynôme (l'explication relative à `raw = TRUE` sort du cadre de ce cours, mais `raw = FALSE`, la valeur par défaut, conduit à transformer le polynôme de sorte que ses paramètres soient orthogonaux l'un à l'autre, ce qui leurs confère plus de stabilité).
250
253
251
254
```{r, echo=TRUE}
252
-
# Création successive des modèles
253
-
lm1 <- lm(data = reddrum, length ~ age)
254
-
lm2 <- lm(data = reddrum, length ~ age + I(age^2))
Nous pouvons extraire les paramètres du modèle avec la fonction glance() et le fonction rmse().
269
+
Nous pouvons extraire les paramètres du modèle en utilisant `glance()` et nous utilisons `rmse()` pour calculer une métrique, **l'erreur quadratique moyenne**, qui quantifié l'ajustement du modèle.
> Le chunk ci-dessus mérite une petite explication. Nous avons neuf modèles. Tous ces modèles sont regroupés dans une liste nommée `models`. La fonction glance() et la fonction rmse() vous permettent d'extraire les paramètres d'un modèle. Ici, nous souhaitons extraire en série ces paramètres. Les fonctions map() du package {purrr} vont exécuter une fonction à chaque élément d'une liste ou d'un vecteur. Grâce à ces fonctions, on obtient un tableau `mod_params` qui comprend tous les paramètres des neuf modèles.
282
+
> Le chunk ci-dessus mérite une petite explication. Nous avons neuf modèles. Tous ces modèles sont regroupés dans une liste nommée `models`. `purrr::map()` et ses variantes `map_dfr()`, `map_dbl()` exécutent une fonction donnée en second argument sur chaque élément de la liste en premier argument, c'est-à-dire, sur chacun des neuf modèles que notre liste contient. Une liste est renvoyée, ou un data frame pour `map_dfr()`, ou un vecteur de valeurs numériques doubles pour `map_dbl()`.
284
283
285
-
```{r}
284
+
Voici un graphique de la variation du R^2^ et de l'erreur quadratique moyenne en fonction de l'ordre du polynôme ajusté :
285
+
286
+
```{r, echo=TRUE}
286
287
a <- chart(data = mod_params, adj.r.squared ~ model) +
287
-
geom_line(group=1) +
288
+
geom_line(group = 1) +
288
289
geom_point()
289
290
290
291
b <- chart(data = mod_params, rmse ~ model) +
291
-
geom_line(group=1) +
292
+
geom_line(group = 1) +
292
293
geom_point()
293
294
294
-
combine_charts(list(a,b), ncol = 1)
295
+
combine_charts(list(a,b), ncol = 1)
295
296
```
296
297
297
-
Les graphiques ci-dessus nous montrent les variations du R^2^ (A) et de l'erreur quadratique moyenne (B). On observe un gain de performance des modèles jusqu'au modèle polynomial d'ordre 5 ou 6. Ensuite, ces gains deviennent quasi nuls.
298
+
Nous pouvons observer un gain de performance des modèles jusqu'au modèle polynomial d'ordre 5 ou 6. Ensuite, ces gains deviennent nuls ou quasi nuls. Ceci confirme qu'il est inutile d'augmenter l'ordre du polynôme au delà de 6 et cela valide aussi la première méthode itérative que nous avons utilisée qui consiste à s'arrêter juste avant que le paramètre du terme de plus forte puissance ne s'annule.
299
+
300
+
> Pour le polynôme d'ordre 2, il est intéressant de déterminer si nous pouvons laisser tomber le terme de puissance 1 et simplifier le modèle. Cela signifie alors utiliser `y = a*x^2 + b`, soit une droite dans les données après avoir élevé `x` au carré. Pour les polynômes d'ordre plus élevé, il faut considérer le modèle comme un tout. Analysez-le sur base du paramètre de puissance la plus élevée uniquement, comme nous l'avons fait ici, et n'essayer pas de simplifier si des termes intermédiaires apparaissent non significatifs.
298
301
299
-
**La visualisation du modèle, l'étude du résumé du modèle, l'analyse des résidus et l'étude des indicateurs de performances forment un tout. Vous devez maîtriser l'ensemble des outils pour valider la pertinence d'un modèle et ensuite comparer des modèles entre eux.**
302
+
**La visualisation du modèle, l'étude du résumé du modèle, l'analyse des résidus et l'étude des indicateurs de performances forment un tout. Vous devez maîtriser l'ensemble des outils pour être capable de valider la pertinence d'un modèle et pour pouvoir comparer des modèles entre eux.**
300
303
301
304
## Conclusion
302
305
303
-
Vous venez de terminer ce tutoriel sur la régression polynomiale. La régression polynomiale d'ordre 6 nous a permis de proposer un modèle qui s'ajuste correctement à la croissance des tambours rouges. Vous devez cependant être très vigilant au surajustement.
306
+
Vous venez de terminer ce tutoriel sur la régression polynomiale. La régression polynomiale d'ordre 6 nous a permis d'ajuster un modèle dans ces données malgré la forme non linéaire du nuage de points. Ce genre de modèle est utile dans un but de prédiction, mais il n'est d'aucune utilité pour aider à expliquer le mécanisme de la croissance de ce poisson. Pour cela, nous devrons nous tourner vers des modèles non linéaires spécialisés (modèles de croissance) que nous étudierons au module 5. Avec le modèle polynomial, vous devez rester très vigilant à deux aspects : le surajustement, car un polynome d'ordre suffisamment élevé peut, à la limite, passer par tous les points mais il inclut alors l'erreur de mesure ce qui est contre-productif, et (2) ne jamais faire des extrapolations lors de prédictions car la courbe polynomiale s'écarte généralement très rapidement du "vrai modèle" aux deux extrémités.
0 commit comments