?lmTP1 - Régression simple et régression multiple
Quarto
Ce document est écrit en quarto, un langage formaté qui permet de mélanger du texte (en markdown) et du code (ici, du R).
Nous utilisons ici Rstudio, un tutoriel de présentation est disponible ici. Vous pouvez utiliser un autre IDE en fonction de votre préférence, mais ce TP part du principe que vous utilisez Rstudio.
Vous pouvez partir de ce document pour créer votre rapport, ou bien en créer un nouveau depuis Rstudio : File > New File > Quarto Document....
R et documentation
Dans ce TP, nous utilisons plusieurs fonctions de R, qui sont toutes signalées dans le texte. Lorsqu’une nouvelle fonction apparaît, je vous invite à lire l’aide associée à la fonction dans R directement, en tapant directement dans la console ? suivit du nom de la fonction. Par exemple, pour avoir de l’aide sur la fonction lm :
L’aide de R, écrite directement par les personnes ayant développée les fonctions, est en générale bien écrite. Il est utile de savoir naviguer dans ces pages de documentation. Pour les fonctions de base que nous utilisons, votre LLM favori vous fournira bien entendu des exemples et explications détaillées. L’une des forces de R est que c’est un langage modulable, avec de nombreuses librairies écrites par des chercheurs et chercheuses, pour résoudre des problèmes avancés. Ces librairies auront toujours une documentation, mais ne seront pas toujours bien représentées par les LLM, car nouvelles. Dans une perspective de recherche et développement, il est donc utile de savoir lire cette documentation.
De manière similaire, ce TP en entier peut être “résolu” parfaitement par un LLM, les questions étant très classiques. Comme pour les exercices de TD, l’objectif principal est de vous entraîner, et de traduire les notions vues en cours en des exemples concrets d’application. Je vous invite donc à tenter de répondre aux questions sans aide, au moins dans un premier temps.
Données
On utilise les données Boston qui sont présentes dans le package MASS. Ce TP est inspiré de la section 3.6 du livre An Introduction to Statistical Learning, de G. James, D. Witten, T. Hastie and R. Tibshirani.
Le package MASS est standard, et s’installe si besoin avec la commande :
install.packages("MASS")On peut ensuite charger et voir les données :
library(MASS)
head(Boston) crim zn indus chas nox rm age dis rad tax ptratio black lstat
1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98
2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14
3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03
4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94
5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33
6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21
medv
1 24.0
2 21.6
3 34.7
4 33.4
5 36.2
6 28.7
Une description du jeu de données peut être obtenue dans l’aide, en tapant dans la console :
?Boston- Décrire brièvement le jeu de données. Qu’est-ce qu’un “individu” \(i\) dans ces données ? Combien y en a t il ? Combien y a t il de variables ? Décrivez brièvement ces variables, en précisant leur type (discret ou continu).
Régression simple
On s’intéresse d’abord au prix médian des maisons dans une ville (medv) en fonction du pourcentage de foyers avec un statut socio-économique faible (lstat).
- Tracer le nuage de point correspondant à ces deux variables. On pourra utiliser la librairie
ggplot2et le code ci-dessous. Que pensez-vous de la relation entre les deux variables ? Les hypothèses classiques du modèle linéaire semblent elles vérifiées ? (Ces points sont à discuter de manière qualitative, nous verrons plus tard dans le cours des manières plus rigoureuses de tester ces hypothèses).
library(ggplot2)
ggplot(Boston, aes(x = lstat, y = medv)) +
geom_point()- Faire la régression linéaire simple de
medven fonction delstatà l’aide de la fonctionlm. Interprétez les coefficients. Sont-ils significativement non nuls ? Donnez un intervalle de confiance à \(90%\) des coefficients. On pourra utiliser les fonctionssummary,coefetconfint, en utilisant le squelette suivant :
fit1 <- lm(medv ~ lstat, data = Boston)
summary(fit1)
confint(fit1)- Tracez la droite de régression sur le nuage de points en utilisant le code suivant. Que pensez-vous de l’ajustement du modèle ? Est-ce cohérent avec le résultat de l’ajustement linéaire ?
ggplot(Boston, aes(x = lstat, y = medv)) +
geom_point() +
geom_smooth(method = "lm")Donnez un intervalle de prédiction à \(95%\) pour la valeur de
medvlorsquelstatvaut \(2\), \(15\), \(30\) et \(50\) pour cent à l’aide de la fonctionpredict. Quand est-ce que l’intervalle est le plus grand ? Est-ce surprenant ? Discutez de la validité des prédictions, en particulier pourlstat=50.Par défaut,
ggplotdans le code de la fonction ci-dessus trace une zone d’incertitude en grisé. S’agit-il d’une bande de confiance, ou d’une bande de prédiction ? Quelle est la différence ?Ajoutez une bande de prédiction à l’aide du code (à compléter) suivant. Interprétez.
data_pred <- data.frame(lstat = seq(min(Boston$lstat), max(Boston$lstat), by = 0.1))
pred_grid <- predict(lm.fit, data_pred, interval = "prediction") # lm.fit is the fit object, result of `lm` call.
pred_grid <- as.data.frame(pred_grid)
pred_grid$lstat <- data_pred$lstat
ggplot(Boston, aes(x = lstat, y = medv)) +
geom_point() +
geom_smooth(method = "lm") +
geom_ribbon(data = pred_grid, aes(y = fit, ymin = lwr, ymax = upr), alpha = 0.1)Régression multiple
En régression multiple, on explique une variable à prédire (ici, medv), en fonction de plusieurs prédicteurs. Nous verrons en cours très prochainement comment cette régression multiple est formulée d’un point de vue mathématique et statistique. D’un point de vue pratique, il s’agit simplement d’ajouter des termes à la formule de prédiction, par exemple :
fit2 <- lm(medv ~ lstat + indus, data = Boston)représente le modèle linéaire suivant : \[
\mbox{mdev}_i = \beta_0 + \beta_1 \times \mbox{lstat}_i + \beta_2 \times \mbox{indus}_i + \epsilon_i
\] où \(\mbox{mdev}_i\), \(\mbox{lstat}_i\) et \(\mbox{indus}_i\) sont les variables mesurées pour l’individu \(i\) (\(1 \leq i \leq n\)), \(\epsilon_i\) l’erreur associée au modèle, qui est supposée i.i.d. gaussienne, centrée et de variance \(\sigma^2\) (\(\epsilon_i \sim \mathcal{N}(0, \sigma^2)\)). La commande lm trouve les estimateurs \(\hat{\beta}_0\), \(\hat{\beta}_0\), \(\hat{\beta}_0\) et \(\hat{\sigma}^2\) associés au modèle (par la méthode des moindres carrés), et les fonctions summary, confint, predict, etc utilisent la distribution de ces estimateurs pour réaliser des tests statistiques ou construire des intervalles de confiance.
Faire la régression linéaire simple de
medven fonction delstatetindus. Interprétez les coefficients en utilisant la fonctionsummary. Sont-ils significativement non nuls ? Qu’est-ce que cela signifie pour l’influence des variableslstatetindussur la variable à prédiremedv? Comparez le \(R^2\) associé à ce modèle à celui associé au modèle de régression simple de la section précédente. Que pouvez-vous en dire ?Faire la régression de
medvcontre toutes les autres variables du jeu de données. On pourra utiliser la formulemedv ~ ., qui est un raccourci pour éviter d’avoir à écrire toutes les variables à la main. Interprétez les résultats. Y-a-t-il des coefficients non significatifs ? Que vaut le \(R^2\) ?En utilisant la formula
medv ~ . -age - indus, faites la régression demedvcontre toutes les variables, saufageetindus. Interprétez. Quel modèle préférez-vous ?Nous verrons en cours comment utiliser un test de Fisher pour choisir de manière rigoureuse entre les deux modèles. Ce test peut être fait à l’aide de la fonction
anova. En utilisant la documentation, utilisez cette fonction, et interprétez. Est-ce cohérent avec les résultats de la question précédente ?Faites la régression linéaire de
medvcontre les seules variablesageetindus. Interprétez le résultat.
Croissance du \(R^2\)
- Générez une variable aléatoire
bruitindépendante des autres variables, avec la loi de votre choix. Ajouter cette variable à la régression avec la formulemedv ~ . + bruit. Comment a évolué le \(R^2\) ? Est-ce normal ? Que ce passe-t-il si vous ajoutez plusieurs variables de bruit ?
Nous verrons en cours pourquoi ce comportement est attendu, et plusieurs stratégies pour y remédier.
Transformation de données
Faites la régression de
medvcontrelstatetlog(lstat)à l’aide de la formulemedv ~ lstat + log(lstat). Interprétez.Faites la régression de
medvcontrelstatetlstat^2à l’aide de la formulemedv ~ lstat + I(lstat^2). Interprétez.
Note : la fonction
I()est utile ici pour protéger la fonction carrée, l’opérateur^ayant une autre signification dans le cadre d’une formule.
- Faites la régression de
medvcontrelstat,lstat^2,lstat^3, …,lstat^10à l’aide de la formulemedv ~ poly(lstat, 10). Interprétez.
Remarque : la fonction
polyretourne les polynomes orthogonalisés, et non les puissances simples, comme détaillé dans l’aide?poly.
Cette section illustre deux points principaux : premièrement, qu’il est possible de faire des régression linéaires contre des variables préalablement transformer pour rendre compte de relations complexes, et deuxièmement qu’il peut être difficile de choisir la bonne transformation à appliquer.