Régression linéaire : partie 1

Extensions

Installez l’extension ISLR2 et car contenant les jeux de données et les fonctions qui nous intéressent.

Régression linéaire simple

L’extension ISLR2 contient le jeu de données Boston. Boston possède la variable medv (valeur médiane d’une maison) pour \(506\) recensements à Boston. Nous voulons prédire la valeur médiane d’une maison à partir de \(12\) variables explicatives comme rmvar (nombre moyen de pièces par maison), age (âge moyen des maisons), et lstat (pourcentage de ménage avec un statut socioéconomique faible). ?Boston pour une description détaillée sur jeu de données.

head(Boston)
str(Boston)
## 'data.frame':    506 obs. of  13 variables:
##  $ crim   : num  0.00632 0.02731 0.02729 0.03237 0.06905 ...
##  $ zn     : num  18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
##  $ indus  : num  2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
##  $ chas   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ nox    : num  0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
##  $ rm     : num  6.58 6.42 7.18 7 7.15 ...
##  $ age    : num  65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
##  $ dis    : num  4.09 4.97 4.97 6.06 6.06 ...
##  $ rad    : int  1 2 2 3 3 3 5 5 5 5 ...
##  $ tax    : num  296 242 242 222 222 222 311 311 311 311 ...
##  $ ptratio: num  15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
##  $ lstat  : num  4.98 9.14 4.03 2.94 5.33 ...
##  $ medv   : num  24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...

La fonction attach permet d’importer les variables d’un tableau de données dans votre environnement. Par exemple, après avoir utilisé attach, Boston$age pourra être accessible en utilisant la variable age importée.

attach(Boston)

Avant d’entrainer notre modèle de régression linéaire, nous pouvons observer avec plot() s’il existe une relation linéaire entre la variable à prédire et la variable explicative.

plot(lstat, medv)

Nous utilisons la fonction lm() pour l’entrainement d’un modèle de régression linéaire simple à partir de la variable explicative lstat pour prédire la variable medv.

lm.fit <- lm(medv ~ lstat, data = Boston)

La fonction summary(lm.fit) retourne les \(p\)-valeurs et les écarts types des coefficients (a et b) ainsi que les statistiques \(R^2\) et \(F\) du modèle de régression.

lm.fit
## 
## Call:
## lm(formula = medv ~ lstat, data = Boston)
## 
## Coefficients:
## (Intercept)        lstat  
##       34.55        -0.95
summary(lm.fit)
## 
## Call:
## lm(formula = medv ~ lstat, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.168  -3.990  -1.318   2.034  24.500 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 34.55384    0.56263   61.41   <2e-16 ***
## lstat       -0.95005    0.03873  -24.53   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.216 on 504 degrees of freedom
## Multiple R-squared:  0.5441, Adjusted R-squared:  0.5432 
## F-statistic: 601.6 on 1 and 504 DF,  p-value: < 2.2e-16

Interpretez les résultats retournés par la fonction summary(lm.fit).

On utilise la fonction names() pour connaitre les informations stockées dans lm.fit.

names(lm.fit)
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "xlevels"       "call"          "terms"         "model"
lm.fit$coefficients
## (Intercept)       lstat 
##  34.5538409  -0.9500494

Si nous voulons prédire 3 nouvelles valeurs de lstat (5, 10 et 15) avec la fonction predict() :

predict(lm.fit, data.frame(lstat = (c(5, 10, 15))))
##        1        2        3 
## 29.80359 25.05335 20.30310

Nous affichons la droite de régression entre medv et lstat en utilisant la fonction abline().

plot(lstat, medv)
abline(lm.fit, lwd = 3, col ="red")

Nous observons qu’il pourrait y avoir une relation non-linéaire entre lstat et medv.

Aller plus loin

  • Prendre en compte la non-linéarité entre la variable à prédire et les variables explicatives (transformation non-linéaire des variables explicatives)
  • Effectuer une régression sur plusieurs variables (prendre en compte la totalité des variables explicatives de notre jeu de données, et pas seulement lstat)

Par exemple, si nous voulons utiliser lstat et age :

lm.fit <- lm(medv ~ lstat + age, data = Boston)
  • Vérifier les 4 hypothèses du modèle de régression linéaire (linéarité du modèle, normalité, indépendance et homoscédasticité des erreurs)

Des idées pour aborder ces problèmes ?