# liste des packages nécessaires
<- c("knitr", "readxl", "corrplot")
liste_packages # liste des éventuels packages à installer (= ceux qui ne sont pas déjà installés)
<- liste_packages[!(liste_packages %in% installed.packages()[,"Package"])]
new_packages # s'il y en a, installation
if(length(new_packages)) install.packages(new_packages)
[MOD3] : Introduction à la régression multiple
GEO UNIV’R Tunisie 2024
# Importantc: définit les options pr défaut
::opts_chunk$set(echo = TRUE, # n'affiche pas le code R
knitrwarning = 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.
Importation des données
# Importe les données
library(readxl)
<-read_xlsx(path = "data/TUN-CLIMAT/tun_climat.xlsx",
tab_depart sheet = "data")
kable(tab_depart, caption = "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).
<- tab_depart[,c("code", "nom", "tmoy", "tmin", "tmax", "prec", "lat", "lon", "alt")]
don <- don[, c("tmoy", "lat","lon","alt")] don_reg
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.
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.
<- lm(...)
modele1 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("...", "...")],
$residuals),
m1addCoef.col = TRUE)
<- lm(m1$residuals ~ don_reg$...)
modele2 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.
<- lm(m2$residuals ~ don_reg$...)
modele3 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.
<- lm(tmoy ~ ... + ..., data=don_reg)
modele_final 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.