[MOD3] : Introduction à la régression multiple

GEO UNIV’R Tunisie 2024

Auteur·rice

Malika Madelin, Claude Grasland,

Date de publication

2024-05-17

# liste des packages nécessaires
liste_packages <- c("knitr", "readxl", "corrplot")
# liste des éventuels packages à installer (= ceux qui ne sont pas déjà installés)
new_packages <- liste_packages[!(liste_packages %in% installed.packages()[,"Package"])]
# s'il y en a, installation 
if(length(new_packages)) install.packages(new_packages)
# Importantc: définit les options pr défaut
knitr::opts_chunk$set(echo = TRUE,  # n'affiche pas le code R
                      warning = FALSE,
                      message = FALSE)
library(knitr)  # Pour afficher les tableaux avec kable
library(readxl) # Pour importer le fichier Excel
library(corrplot) # Pour visualiser une matrice de corrélation facile à lire

1.DONNEES

Nous allons reprendre l’exemple des données climatiques sur la Tunisie.

Télécharger le jeux de données

Importation des données

# Importe les données
library(readxl)
tab_depart <-read_xlsx(path = "data/TUN-CLIMAT/tun_climat.xlsx",
              sheet = "data")
kable(tab_depart, caption = "Tableau de données")
Tableau de données
code nom reg_code reg_nom lat lon alt tmin tmax tmoy prec vent rosee
BJ Beja NO Nord-ouest 36.73333 9.183333 159.00 11.45894 24.62033 18.55692 590.000 6.436291 10.881502
BZ Bizerte NE Nord-est 37.24545 9.791453 6.09 13.36735 23.96475 18.73467 639.000 13.080826 13.507263
GB Gabes SE Sud-est 33.87692 10.103333 7.92 15.62121 25.44585 20.64563 192.000 11.564158 12.396331
GF Gafsa SO Sud-ouest 34.42202 8.822503 323.08 13.73596 26.88865 20.42736 163.000 12.759514 7.894512
JE Jendouba NO Nord-ouest 36.48333 8.800000 144.00 12.03502 25.75739 19.17381 458.000 8.187385 11.549468
KR Kairouan CO Centre-ouest 35.66667 10.100000 68.00 15.05704 27.37991 20.88537 303.000 5.826256 10.894726
KS Kasserine CO Centre-ouest 35.16667 8.833333 707.00 11.47720 24.13852 18.46683 340.000 12.853035 8.366253
KB Kebili SO Sud-ouest 33.70000 8.966667 46.00 15.34825 28.66706 22.71979 89.000 14.061362 10.373775
KF Le Kef NO Nord-ouest 36.13333 8.700000 518.00 10.30506 23.19958 17.24170 528.000 8.246948 8.059934
MH Mahdia CE Centre-est 35.50000 11.066667 12.00 16.50674 23.29379 20.16491 290.000 10.854368 14.624500
ME Medenine SE Sud-est 33.35000 10.483333 117.00 16.17117 27.56439 22.57362 159.000 8.743863 11.404804
MS Monastir CE Centre-est 35.66667 10.750000 2.00 15.64783 24.26410 19.76152 322.062 13.888661 13.587094
NB Nabeul NE Nord-est 36.46667 10.700000 78.00 15.70167 23.43309 19.81197 450.000 12.190401 14.033335
SF Sfax CE Centre-est 34.71795 10.690972 25.90 14.88812 25.24082 20.05744 221.000 11.408961 12.427977
SZ Sidi Bou Zid CO Centre-ouest 35.00000 9.483333 355.00 13.03144 26.20685 20.25616 280.000 8.283933 9.461638
SL Siliana NO Nord-ouest 36.06667 9.366667 445.00 11.36109 24.50220 19.02255 389.000 9.242761 9.455365
SS Sousse CE Centre-est 35.70000 10.600000 5.00 15.70000 24.40000 19.90000 310.000 12.500000 13.600000
TA Tataouine SE Sud-est 32.91667 10.450000 215.00 15.90320 27.20100 21.41218 110.000 10.298155 9.182343
TO Tozeur SO Sud-ouest 33.93972 8.110556 87.47 16.83189 28.64269 22.63410 97.000 14.732460 8.697420
TU Tunis NE Nord-est 36.85103 10.227217 6.70 14.26899 24.61744 19.14238 453.000 13.405618 12.626422
ZA Zaghouan NE Nord-est 36.43333 10.083333 156.00 12.43361 25.06573 18.57657 501.000 10.331711 11.907365

Sélection de variables

Pour la suite de l’exercice, nous retenons seulement quelques variables ou colonnes du tableau de départ : des identifiants (code, nom), des variables qu’on va chercher à expliquer (tmoy, tmin, tmax, prec) et des variables a priori explicatives (lat, lon, alt).

don <- tab_depart[,c("code", "nom", "tmoy", "tmin", "tmax", "prec", "lat", "lon", "alt")]
don_reg <- don[, c("tmoy", "lat","lon","alt")]

L’objectif de cet exercice est de chercher à expliquer les variations des températures moyennes des stations par les 3 variables explicatives : don_reg. Mais tout d’abord, commençons par une première étape, l’exploration visuelle des relations entre ces variables.

?plot()
?cor.test()
?lm()

Les ? devant les fonctions permettent d’obtenir de l’aide sous R.

2. EXPLORATION DE LA RELATION

La manière la plus simple d’analyser la relation entre Y et plusieurs X1:n est d’utiliser un simple plot

plot(don_reg)

Il est possible aussi d’afficher la matrice des coefficients de corrélation entre ces 4 variables (cf. cours précédent) :

cor(don_reg)
            tmoy         lat         lon         alt
tmoy  1.00000000 -0.79665265  0.06494534 -0.40454447
lat  -0.79665265  1.00000000  0.02982053 -0.01528285
lon   0.06494534  0.02982053  1.00000000 -0.54596270
alt  -0.40454447 -0.01528285 -0.54596270  1.00000000

Ou encore d’utiliser la fonction le package corrplot() et sa fonction, pour faciliter la lecture des relations

library(corrplot)
# Ce graphique utilise les données de la matrice de corrélation : cor(don_reg)
corrplot(cor(don_reg), type = "lower", 
         diag=FALSE, tl.col = "dark grey", tl.srt = 45,addCoef.col = TRUE)


#### > Existe-t-il des relations significatives ? quelle est la variable la plus fortement corrélée avec tmoy ?

3. VERS LA REGRESSION MULTIPLE PAR LA METHODE “STAGEWISE” ou comment construire un modèle petit à petit

Nous allons construire un modèle permettant d’expliquer les variations des températures moyennes en Tunisie (Y) à partir de plusieurs facteurs explicatifs (X1:n). La régression multiple “stagewise” nous permettra de revoir les étapes de la régression simple et de construire un modèle multiple. Voici les étapes :

  • quelle est la variable X1 (parmi les X) qui explique le plus tmin (Y) ? on modélise cette relation modele1 ;

  • une fois cette relation modélisée, quelle est la variable X2 (parmi les X - X1) qui explique le plus la variation des résidus de modele1 ? on construit alors un modele2 ;

  • etc.

modele1

::: ATTENTION, texte à trou, à vous de le remplir
Rappel : on écrit la variable à expliquer [Y] en fonction [~] de la variable explicative [X], soit lm(Y~X). Choisir ici les variables en question.

modele1 <- lm(...)
summary(modele1)

Est-ce que la relation est significative ? Quel est son sens ? Quelle est son intensité ?
Que doit-on vérifier au-delà de la p-value et de la significativité pour valider le modèle ?
Quel est le pouvoir explicatif de cette relation ?

Notez que le R ajusté est utile lorsque l’on compare plusieurs modèles sur un même jeu de données.

modele2

corrplot(cor(don_reg[,c("...", "...")], 
             m1$residuals), 
         addCoef.col = TRUE)
modele2 <- lm(m1$residuals ~ don_reg$...)
summary(modele2)

Si la nouvelle variable est significative avec ce qui n’a pas été expliqué par le premier modèle (= les résidus), alors on continue.

modele3

Il ne reste plus qu’une variable à tester sur les résidus.

modele3 <- lm(m2$residuals ~ don_reg$...)
summary(m3)

Chacune des variables retenues, in fine, explique significativement une partie non expliquée auparavant. Il s’agit à présent de combiner l’ensemble des variables dans un seul modèle de régression multiple.

4. REGRESSION MULTIPLE LINEAIRE

Rappel : Pour construire un modèle linéaire simple lm(Y~X).
Pour construire un modèle linéaire multiple : lm(Y\~X1+X2+X3...)

Construire alors le modèle multiple à partir des variables sélections précédemment.

modele_final <- lm(tmoy ~ ... + ..., data=don_reg)
summary(modele_final)
plot(modele_final)

> Quelles sont vos conclusions ?

> Quelle est l’équation du modèle ?

> Et les résidus ?

5. COLINEARITÉ ENTRE VARIABLES ou comment, plus largement, sélectionner les variables explicatives ?

Même si ce module n’est qu’une introduction à la régression multiple linéaire, nous aimerions aborder la notion de la multicolinéarité ou la colinéarité entre les variables explicatives (c’est lorsqu’il existe une forte relation linéaire entre 2 ou + variables explicatives). Cette colinéarité est parfois préjudiciable, elle entraîne une instabilité dans l’estimation des coefficients et cela peut aller jusqu’à fausser les tests statistiques. Une partie de l’explication apportée par une variable peut être déjà prise en compte dans une autre. L’idéal serait que les variables soient indépendantes (cf. à ce propos l’article du blog de Freakonometrics d’Arthur Charpentier).

L’objectif principal d’une modélisation à partir de variables est de rechercher un équilibre entre le modèle le plus simple et le meilleur ajustement.
Plusieurs méthodes cherchent à sélectionner au mieux les variables :

  • approche exhaustive : toutes les combinaisons possibles sont testées et on choisit la “meilleure” ; rapidement très lourde à mettre en place ;

  • approche backward : on met l’ensemble des variables et petit à petit on enlève celle(s) avec la plus grande valeur de p-value jusqu’à n’avoir que des fortement significatives ;

  • approche forward : c’est l’inverse, on ajoute petit à petit les variables les plus significatives ;

  • approche stepwise : un mélange des 2 précédentes ;

  • et l’approche stagewise que nous avons vue dans la section précédente.

6. COMPARAISON DE MODÈLES

Plusieurs critères permettent de comparer plusieurs modèles, les plus connus étant AIC (An Information Criterion d’Akaike) et le BIC (Bayesian Information Criterion), basés sur des compromis : plus les valeurs sont petites, plus le modèle est adapté. Sous R:

AIC(modele)
BIC(modele)

Si vous hésitez entre 2 modèles (2 combinaisons de variables), vous pouvez tester par une analyse de la variance les 2 modèles. En d’autres termes, vous cherchez à savoir l’influence d’une ou de plusieurs variables dans un modèle, tout en prenant en considération les autres.

anova(mod1,mod2)

Si la significativité est supérieure à 0,05 (ou 0,10), alors vous pouvez conclure que les variables introduites ne contribuent pas significativement.