Partie 2 : Régression linéaire multiple

Auteur·rice

Guillaume Franchi

On considère à nouveau le jeu de données cows.Rdata de la partie 1, disponible ici .

On cherche dorénavant à expliquer le poids vif d’un animal Live_Weight en fonction de toutes les autres variables à disposition.

  1. Importer les donnéees et retirer la \(1^{\text{ère}}\) colonne à l’aide de la fonction select() du package dplyr (disponible avec tidyverse).
Voir la réponse
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
load("cows.Rdata")

cows <- cows %>%
  select(-1)
  1. A l’aide de la fonction ggpairs()du package GGally, dresser les nuages de points des bovins prenant toutes les variables existantes par paires.
Voir la réponse
library(GGally)

ggpairs(cows,upper = list(continuous = wrap("cor", size = 5)))+
  theme_minimal()+
  theme(strip.background = element_rect(fill="grey50",colour = "white"),
        strip.text.x = element_text(size=rel(1)),
        strip.text.y = element_text(size=rel(1),angle = 0))+
  labs(title = "Nuages de points des bovins par paire de variables")

  1. Les variables vous semblent-elles corrélées linéairement deux à deux ? Quels avantages y voyez-vous ? Quels inconvénients ?
Voir la réponse

Toutes les variables semblent linéairement corrélées. Concernant le poids vif, c’est plutôt encourageant : on dervait être en mesure de très bien l’expliquer à partir des autres variables.

En revanche, le fait que toutes les variables soient corrélées entre elles pose problème. En effet, il est difficile de distinguer les variables qui vont réellement expliquer le poids vif de l’animal de celles qui semblent l’expliquer par simple “effet cascade”. Il va donc falloir déterminer les variables explicatives réellement essentielles des autres.

Par ailleurs, certaines variables apportant peu d’information supplémentaire, ou étant fortement corrélées aux autres variables, peuvent rendre les estimations moins précises et les prédictions plus instables.

On cherche à expliquer notre variable réponse \(Y\) (le poids vif), à partir de 9 autres variables explicatives , notées de manière formelle \(X_1, \ldots, X_9\).

Le modèle linéaire multiple suppose que l’on peut écrire \[ Y = \beta_0 + \beta_1 X_1 + \dots + \beta_9 X_9 + \varepsilon, \] où \(\varepsilon\) correspond toujours à un bruit non expliqué.

On suppose donc dans la suite que pour chaque individu \(i\), on a \[y_i = \beta_0 + \beta_1 x_{i,1}+\dots + \beta_9 x_{i,9} + \varepsilon_i,\] où \(y_i\) désigne l’observation de la variable réponse (poids vif) pour l’individu \(i\), \(x_{i,p}\) sa \(p^{\text{ème}}\) variable explicative, et \(\varepsilon_i\) l’erreur associée à cet individu. On supposera également que

  • les \(\varepsilon_i\) sont indépendants et identiquement distribués (i.i.d.) ;
  • les \(\varepsilon_i\) suivent tous une loi normale \(\mathcal{N}(0,\sigma^2)\).

L’objectif de la régression linéaire est d’estimer les \(p=10\) paramètres de la régression \(\beta_0,\ldots, \beta_9\) ainsi que \(\sigma\).

Comme dans la régression linéaire simple, la méthode des moindres carrés ordinaires propose comme estimation \[\left( \widehat{\beta}_0,\ldots,\widehat{\beta}_{p-1} \right) = \underset{\beta_0,\ldots,\beta_{p-1}}{\mathrm{argmin}} \ \sum_{i=1}^n \left(y_i - \beta_0 - \sum_{j=1}^{p-1} \beta_j x_j \right)^2.\] Une nouvelle fois, cette méthode fournit des estimateurs non biaisés.

  1. A l’aide de la fonction lm(), ajuster un modèle linéaire multiple aux données, où Live_Weight est la variable réponse. On enregistera ce modèle dans un objet mod_lm. Effectuer un résumé statistique du modèle.
Voir la réponse
mod_lm <- lm(data = cows,formula = Live_Weight ~.)
summary(mod_lm)

Call:
lm(formula = Live_Weight ~ ., data = cows)

Residuals:
     Min       1Q   Median       3Q      Max 
-113.246  -15.454    1.866   17.083   43.057 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)         -674.17528   54.60032 -12.347  < 2e-16 ***
Withers_Height        -0.36764    1.09450  -0.336  0.73771    
Hip_Height             2.22254    0.96419   2.305  0.02339 *  
Chest_Depth            0.34563    1.42293   0.243  0.80862    
Chest_Width            0.58232    0.99280   0.587  0.55893    
Ilium_Width            4.80715    1.54132   3.119  0.00242 ** 
Hip_Joint_Width        0.50004    0.87906   0.569  0.57084    
Oblique_Body_Length   -0.03396    0.08386  -0.405  0.68644    
Hip_Length             0.55342    1.22844   0.451  0.65339    
Heart_Girth            3.24367    0.60726   5.341 6.51e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 25.15 on 93 degrees of freedom
Multiple R-squared:  0.8879,    Adjusted R-squared:  0.877 
F-statistic: 81.83 on 9 and 93 DF,  p-value: < 2.2e-16

On peut encore une fois évaluer la qualité de l’ajustement du modèle aux données par le coefficient \[R^2 = \dfrac{SCE}{SCT} = 1 - \dfrac{SCR}{SCT}\] i.e. \[R^2 = \dfrac{\sum_{i=1}^n (\widehat{y}_i - \overline{y})^2}{\sum_{i=1}^n (y_i - \overline{y})^2} = 1 - \dfrac{\sum_{i=1}^n (\widehat{y}_i - y_i)^2}{\sum_{i=1}^n (y_i - \overline{y})^2}.\]

Ce nombre réel, compris entre 0 et 1, représente la proportion de variance de la variable réponse expliquée par le modèle. Plus il est proche de 1, plus le modèle semble adapté aux données.

  1. Quel est la valeur de \(R^2\) dans notre cas ?
Voir la réponse

D’après le résumé précédent, on a \(R^2 \approx 0,89\). Le modèle explique ici 89% de la variance du poids vif.

On note \(p\) le nombre de paramètres à estimer dans la régression linéaire, hors écart-type \(\sigma\) (ici, \(p=10\)). On peut montrer que \[ t_i = \dfrac{\widehat{\beta}_i - \beta_i}{\widehat{\sigma}_i} \sim \mathcal{T}_{n-p} \] où \(\widehat{\sigma}_i\) est un estimateur de \(Var(\beta_i)\) non explicité ici, et \(\mathcal{T}_{n-p}\) désigne la loi de Student à \(n-p\) degrés de liberté.

Cette propriété permet notamment de réaliser un test d’hypothèse \[ H_0 : \beta_i = 0 \quad \text{contre} \quad \beta_i \neq 0, \] ainsi que de déterminer un intervalle de confiance de niveau 95% pour chaque \(\beta_i\) \[ IC(\beta_i) = \left[ \widehat{\beta}_i - q \times \widehat{\sigma}_i, \widehat{\beta}_i + q\times \widehat{\sigma}_i \right] \] où \(q\) désigne le quantile d’ordre 0,975 de la loi \(\mathcal{T}_{n-p}\).

  1. Quels sont les coefficients \(\beta_i\) significativement non nuls dans notre cas, au niveau 95% ?
Voir la réponse

D’après le résumé de mod_lm, les coefficients significativement non nuls sont \(\beta_0, \beta_2, \beta_5\) et \(\beta_9\), correspondant à la constante, la hauteur aux hanches Hip_Height, la largeur aux hanches Ilium_Width et le périmètre thoracique Heart_Girth.

On souhaite dorénavant déterminer si toutes les variables à disposition contribuent réellement à la valeur de la variable réponse.

Pour ce faire, quitte à renuméroter les variables, on veut tester simultanément la nullité des \(q=p-p_0\) derniers coefficients du modèle \[ H_0 : \beta_{p_0+1} = \dots = \beta_p =0 \quad \text{contre} \quad H_1 : \exists j \in \{p_0+1,\ldots,p \}, \ \beta_j \neq 0. \]

Il ne s’agit pas d’effectuer tous les tests de Students possibles. En effet, la succession de ces tests va aggrandir la région de rejet, et augmenter le risque de \(1^{\text{ère}}\) espèce \(\alpha\). Si des critères de correction existent, il est préférable d’utiliser la résultat suivant.

Sous \(H_0\), on a \[F = \dfrac{n-p}{q} \times \dfrac{SCR_0 - SCR}{SCR} \sim \mathcal{F}_{n-p}^q\] où

  • \(SCR_0\) désigne la somme des carrés résiduelles du modèle ne considérant que les \(p_0\) premiers coefficients;
  • \(\mathcal{F}_{n-p}^q\) désigne la loi de Fisher à \(q\) et \(n-p\) degrés de liberté.

En particulier, si \(F > f_{1-\alpha}\), où \(f_{1-\alpha}\) est le quantile d’ordre \(1-\alpha\) de la loi \(\mathcal{F}_{n-p}^q\), on rejette \(H_0\) avec un risque de \(1^{\text{ère}}\) espèce \(\alpha\).

  1. A l’aide de la fonction anova() (qui sera revue ultérieurement dans le chapitre du même nom), tester la nullité des coefficients associés aux variables différentes de Hip_Height, Ilium_Widthet Heart_Girth. Auparavant, on ajustera un modèle linéaire mod_restreint prenant en compte uniquement ces 3 variables.
Voir la réponse
mod_restreint <- lm(data = cows,
                    formula = Live_Weight ~ Hip_Height + Ilium_Width + Heart_Girth)
anova(mod_restreint,mod_lm)
Analysis of Variance Table

Model 1: Live_Weight ~ Hip_Height + Ilium_Width + Heart_Girth
Model 2: Live_Weight ~ Withers_Height + Hip_Height + Chest_Depth + Chest_Width + 
    Ilium_Width + Hip_Joint_Width + Oblique_Body_Length + Hip_Length + 
    Heart_Girth
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     99 59669                           
2     93 58825  6    844.22 0.2224 0.9686

Ici, on ne rejette pas l’hypothèse nulle. On poura supposer par la suite que les 3 variables sélectionnées peuvent expliquer à elles seules le poids vif.

Par ailleurs, le gain sur l’ajustement en rajoutant d’autres variables est très faible, comme on le voit à la différence infime entre les coefficients \(R^2\) des deux modèles

summary(mod_restreint)

Call:
lm(formula = Live_Weight ~ Hip_Height + Ilium_Width + Heart_Girth, 
    data = cows)

Residuals:
     Min       1Q   Median       3Q      Max 
-111.197  -15.604    1.701   16.328   41.637 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -689.3151    45.7671 -15.061  < 2e-16 ***
Hip_Height     1.9983     0.5576   3.584 0.000527 ***
Ilium_Width    5.2078     1.4221   3.662 0.000404 ***
Heart_Girth    3.6384     0.3997   9.104 9.85e-15 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 24.55 on 99 degrees of freedom
Multiple R-squared:  0.8863,    Adjusted R-squared:  0.8828 
F-statistic: 257.2 on 3 and 99 DF,  p-value: < 2.2e-16

Enfin, pour une nouvelle observation indépendante des variables explicatives \(x_{n+1,1},\ldots x_{n+1,p-1}\), on peut déterminer une estimation de la variable réponse \(y_{n+1}\) par \[ \widehat{y}_{n+1} = \widehat{\beta}_0 + \widehat{\beta}_1 x_{n+1,1} + \dots \widehat{\beta}_{p-1} x_{n+1,p-1}.\]

Des calculs, non explicités ici, permettent d’obtenir un intervalle de confiance au niveau souhaité (souvent 95%) pour cette estimation.

  1. On considère alors 3 nouveaux bovins, dont on a les caractéristiques ci-dessous.
Hip_Height Ilium_Width Heart_Girth
107 36 150
127 44 183
134 48 197

Créer d’abord un dataframe new_cowscontenant ces valeurs. A l’aide de la fonction predict(), donner ensuite une estimation du poids vif de ces bovins, ainsi qu’un intervalle de confiance à 95%.

Voir la réponse
new_cows <- data.frame(Hip_Height = c(107,127,134),
                         Ilium_Width = c(36,44,48),
                         Heart_Girth = c(150,183,197))

predict(mod_restreint,newdata = new_cows,interval = "prediction")
       fit      lwr      upr
1 257.7486 206.9205 308.5767
2 459.4452 410.4156 508.4748
3 545.2024 495.6250 594.7799