Régression linéaire avec R

Transcription

Régression linéaire avec R
Régression linéaire avec R
avec
l’utilisation de ggplot2
N ICOLAS J UNG
disp
500
70
10
2
5
mpg
30
21 janvier 2015
1
wt
2
Table des matières
1
Introduction
1.1 À propos du package ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Analyse liminaire du jeu de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
Régression linéaire simple
2.1 Écriture du modèle . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Estimation des cœfficients . . . . . . . . . . . . . . . . . . . . .
2.3 Hypothèses relatives au modèle linéaire simple . . . . . . . . . .
2.3.1 Vérification de la condition de linéarité . . . . . . . . . .
2.3.2 Les variables sont mesurées sans erreur . . . . . . . . . .
2.3.3 Tester les hypothèses implicites . . . . . . . . . . . . . .
2.4 Ajustement de la droite de régression et tests . . . . . . . . . . . .
2.5 Prédiction en régression linéaire . . . . . . . . . . . . . . . . . .
2.6 Diagnostics de la régression linéaire . . . . . . . . . . . . . . . .
2.6.1 Graphiques permettant de valider la normalité des résidus
2.6.2 Graphe des résidus studentisés . . . . . . . . . . . . . . .
2.6.3 Leviers . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6.4 Distance de Cook . . . . . . . . . . . . . . . . . . . . . .
2.6.5 Diagnostic final . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
14
15
15
22
22
24
27
27
27
28
30
30
33
La régression linéaire multiple
3.1 Hypothèses relatives au modèle linéaire multiple . . . . . . . . .
3.1.1 L’hypothèse de relation linéaire . . . . . . . . . . . . . .
3.1.2 L’hypothèse de non corrélation des variables explicatives .
3.1.3 Vérification des autres hypothèses . . . . . . . . . . . . .
3.2 Estimation des cœfficients . . . . . . . . . . . . . . . . . . . . .
3.3 Test dans la régression linéaire multiple . . . . . . . . . . . . . .
3.3.1 Les tests t pour chaque paramètre . . . . . . . . . . . . .
3.3.2 La fonction anova appliquée à un objet de type lm . . .
3.4 Utilisation de la fonction anova sans utiliser de deuxième modèle
3.5 Intervalles de confiance . . . . . . . . . . . . . . . . . . . . . . .
3.6 Valeurs ajustées . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.7 Prédiction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8 Diagnostics . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8.1 Diagnostic de colinéarité . . . . . . . . . . . . . . . . . .
3.8.2 Tableau récapitulatif . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
36
36
37
39
39
40
40
41
43
44
44
45
46
46
46
Sélection de modèle
4.1 Les critères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Procédure de sélection de modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Recherche exhaustive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
49
50
50
3
4
3
5
5
9
4.3
5
Procédure forward, backward et stepwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
Quand les hypothèses ne sont pas respectées...
5.1 Quand la variable explicative est mesurée avec une erreur . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
55
4
Chapitre 1
Introduction
L’objectif de ce cours est de permettre à des utilisateurs non familiers des formules mathématiques et autres théorèmes
d’utiliser le logiciel R dans le cadre de la régression linéaire. La réalisation d’une régression linéaire est d’apparence très
simple, puisqu’elle ne nécessite que la commande lm pour la réaliser et la commande summary pour visualiser les résultats.
Néanmoins, cette simplicité ne résiste pas à une analyse rigoureuse. Comme nous allons le voir, la régression linéaire
nécessite la validité de plusieurs hypothèses sans lesquelles toute interprétation que nous pourrions faire à partir des résultats
serait erronée.
Vous trouverez dans ce cours plusieurs exemples didactiques qui vous permettront d’affiner votre compréhension et
votre intuition. Aussi, nous avons privilégié l’étude de la régression linéaire à travers un exemple, lequel pourra être pris en
modèle pour vos analyses futures. Par ailleurs, vous trouverez à la fin une courte bibliographie dans laquelle vous trouverez
des informations supplémentaires.
Dans le cadre de ce cours, nous allons utiliser plusieurs fonctions qui appartiennent à des librairies (ou encore packages)
qui ne sont pas initialement installés dans R. Nous rappelons que l’installation d’un package se fait par la commande :
install.packages("nom du package") (ne pas oublier les guillemets dans cette commande !). Une fois le package installé, il faudra le charger dans la mémoire de R, ce qui se fait par la commande library ou require. Si cette
dernière retourne une erreur stipulant : “Erreur dans require(“nom”) : aucun package nommé ‘nom’ n’est trouvé” c’est que
le package en question n’est pas encore installé.
Afin de vous aider, nous mettons à votre disposition, en annexe, l’ensemble des librairies qui ne sont pas installées de
base. De plus, nous vous proposons avant l’utilisation de ce cours d’utiliser la commande suivante, qui va installer et charger
tous les packages nécessaires :
source("http://www-irma.u-strasbg.fr/˜njung/Packages.R")
Dans ce cours, vous trouverez le code pour tous les résultats et tous les graphiques présentés. Chacune des lignes de
code est reproductible. Notez cependant que la fonction xtable permet simplement d’avoir un meilleur rendu en Latex
(logiciel avec lequel est construit ce document) et doit être ignorée. Par ailleurs, ce cours ne prétend pas fournir une initiation à l’utilisation du logiciel R, et nous proposons au lecteur la lecture des premiers chapitres du livre de Frédéric Bertrand
et Myriam Maumy-Bertrand [1].
1.1
À propos du package ggplot2
Le package ggplot2 est le package qui va nous servir à faire les graphiques pour ce cours. Les graphiques issus
de ce package ont un meilleur rendu : meilleure gestion de l’espace, des couleurs, légende insérée automatiquement... De
plus, il est possible d’ajouter une grande variété d’informations sur le graphique, comme des courbes lissées, des boı̂tes à
moustaches... La seule difficulté dans l’utilisation de ce package réside dans la syntaxe, légèrement différente que pour les
5
fonctions graphiques de bases ; cependant, nous n’utiliserons pas ici toutes les possibilités offertes par ce package, et nous
nous contenterons, dans la plupart des cas, d’utiliser la fonction qplot qui fonctionne essentiellement comme la fonction
basique plot.
Pour cette fonctions, deux options sont nécessaires : la variable pour l’abscisse, et la variable pour l’ordonnée. Attention : impossible de fournir à cette fonction une matrice avec deux colonnes ! Il est fortement recommandé d’avoir toutes
les variables utiles dans un data.frame, en utilisant ensuite l’option data dans la fonction qplot.
Regardons ce que nous pouvons faire grâce à ce package sur un jeu de données bien connu : le jeu de données iris.
Commençons par tracer longueur des petales en fonction de leur largueur.
data(iris)
#petit aperçu
head(iris)
##
##
##
##
##
##
##
1
2
3
4
5
6
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1
3.5
1.4
0.2 setosa
4.9
3.0
1.4
0.2 setosa
4.7
3.2
1.3
0.2 setosa
4.6
3.1
1.5
0.2 setosa
5.0
3.6
1.4
0.2 setosa
5.4
3.9
1.7
0.4 setosa
require(ggplot2)
#la fonction plot basique
plot(iris$Petal.Length,iris$Petal.Width)
#la fonction qplot de ggplot2
qplot(Petal.Length,Petal.Width,data=iris)
Si nous voulions colorer chaque point en fonction de son espèce avec la fonction basique plot, il faudrait créer un
vecteur comprenant les couleurs de chaque point. Avec qplot, cela se fait de manière naturelle :
qplot(Petal.Length,Petal.Width,data=iris,colour=Species)
De plus, vous remarquerez qu’une légende est apparue automatiquement. Mieux encore :
qplot(Petal.Length,Petal.Width,data=iris,colour=Species,size=Sepal.Length+Sepal.Width)
Vous remarquerez que la taille des points est fonction de la longueur plus la largueur du sépale ; une nouvelle légende
est apparue automatiquement. Sans efforts supplémentaires, nous pouvons maintenant ajouter sur le graphique des droites
de régression (ce que nous allons voir en détails dans la suite) :
qplot(Petal.Length,Petal.Width,data=iris,colour=Species,size=Sepal.Length+Sepal.Width)+geom
Nous terminerons par l’exemple suivant :
qplot(Species,Petal.Width,data=iris,geom=c("boxplot", "jitter"))
Un argument utile de cette fonction est geom qui permet de choisir la manière dont les données sont traitées : point
permet d’avoir des points, line permet de tracer la ligne entre les points, smooth permet de rajouter une courbe lissée.
6
2.5
●
2.5
●
●
●
●●
● ● ●
●
● ●
2.0
●●●●
●
●● ●
●
●
●
●●
● ● ●
●
●
●
●
1.5
●
●
●
●●
1.0
●
●
●●
●
●
●
●●●
●●●
●●●
●
●
●●●●●●●
●
●●
●
●
●
●
● ● ●●
●●●●●
●● ● ●
●
●
●
Petal.Width
1.5
●
●●
●
●● ● ●
●
●
●
●
●●● ●●●
● ●●●
●
●
●●●●
●
● ●
●
●
1.0
iris$Petal.Width
2.0
●
●
●
●●
●●
●
● ●
●
●●●●
●
●●●● ●
●
●
●
●
●●●●
●●
●
●●●●
●
●
●
●●
●
●
●
●●
0.5
●
●
●
● ●●● ●
0.5
●
●●● ●
●
●●●
●
● ●●
● ● ●●
●●
●●
●● ●
●
●●●
●●
●
1
2
3
4
5
6
●
7
●
●●●●●●
●
●●
0.0
2
iris$Petal.Length
4
6
Petal.Length
(a) Utilisation de la fonction plot
(b) Utilisation de la fonction qplot
F IGURE 1.1 – Différences entre plot et qplot
Une fois le graphique initial établi, il est possible de rajouter un grand nombre d’éléments sur le graphique. La syntaxe est
la suivante qplot(...) + element1(...) + element2(...) + .... Dans les éléments, qui sont chacun des
fonctions, nous avons (principalement) :
– xlab et ylab : titre des axes
– geom fonc avec fonc pouvant être line pour rajouter une ligne, point pour rajouter un point, text pour rajouter du texte...
Nous n’irons pas plus loin dans l’explication de ce package, et pensons qu’avec ces notions de base, ainsi que la lecture
du document, le lecteur sera à même de produire, en s’inspirant de ce qui a été fait ici, ses propres graphiques.
7
2.5
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●● ●
●
●
●●●
●●●
Species
●
●
setosa
●
versicolor
●
virginica
●●●●●●●
●●
●
●
●
●
●●●
● ●●●●
1.5
●
●
●
●
●
setosa
●
versicolor
●
virginica
●
Sepal.Length + Sepal.Width
●
7
●
8
●● ● ● ●
●●
●
1.0
●●
●●
●●●
●●●●●●●
●
●
●●
1.0
Species
●
●● ●
●
●●●
●
●● ●● ●
●
●
●
●
●● ●
●
●
1.5
●
●●
●●●
●
2.0
●
●
Petal.Width
●
●
●
●●●●●
●
●
●
●
●●
●
●
●●●●
●●
Petal.Width
●
●
●●●●
2.0
● ●●
●
●
●●●● ●●●
2.5
●●
●
●●●●
●
● ●
●
● 9
●●
●
10
● 11
●
●
0.5
●
●●●
●●●
●
●●● ●
●●
●
●● ●
●●
●
●●●●●●
●
●
0.5
●
●
●●
●●
●●
●
●●
●● ●
● ●●
●
●●
●
0.0
●●
●
●
0.0
2
4
6
2
4
Petal.Length
6
Petal.Length
(a) Couleurs en fonction de l’espèce
(b) Taille des points en fonction de la dimensions des sépales
F IGURE 1.2 – Ajout d’informations
● ●●
●
●
●●●● ●●●
2.5
●● ●
●● ●
●
●
●
●● ●
●●●
● ●●●●
Petal.Width
1.5
●
●●
●●●
●●
●
●
● ●
●
●
●
● ●
Species
●
●
●
●
setosa
●
versicolor
●
virginica
7
●
8
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
1.0
●
●
●
●
●
●
●
●
●
● ● ●●
●●
●
●
● ●●
1.5
● 9
●●
●
●
● ●
●
Sepal.Length + Sepal.Width
●● ● ● ●
1.0
●
2.0
●
●●●●●●●
●
●
●
●
●
●●
●
●● ●● ●
●
●
●
●●●●●
●●●
●
●
●
●
●
●
●
●●
●
●●
2.0
● ●●
●
●
●
Petal.Width
2.5
●●
●
●
● ●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
● ●
●
●
10
● 11
●
●
●
0.5
●
●
●
●
●
● ●
●●
●
●
● ●
●
● ●
● ●
●●● ●●●●
● ● ●●
●
●
●
●
●● ● ●
● ● ●
●● ●
●●
●
●●
●●
●●
●
●●
●● ●
● ●●
●
●
0.5
● ●●● ●
●●
●
●
●
0.0
●
●
●
●
●● ●
●
●
●
0.0
2
4
6
setosa
Petal.Length
versicolor
virginica
Species
(a) Droites de régression pour chacun des groupes
(b) Autre possibilité : boı̂tes à moustaches
F IGURE 1.3 – Autres possibilités.
8
1.2
Analyse liminaire du jeu de données
Nous allons travailler sur le jeu de données bodyfat issu du package mboost. Pour ce faire, nous entrons les lignes
de commande suivantes :
require(xtable)
data("bodyfat", package="TH.data")
La commande data permet simplement de charger le jeu de données dans la mémoire de R. En réalité, de la même
manière que l’ouverture de R n’entraı̂ne pas le chargement de tous les packages disponibles, le chargement d’un package
par la commande library n’entraı̂ne pas le chargement de tous les jeux de données contenus dans le package.
Face à un nouveau jeu de données, il est utile d’obtenir quelques informations élémentaires telles que : le nombre
d’individus N , le nombre de variables P , la nature de chacune des variables... Les fonctions nrow, ncol et summary
permettent de répondre à ces questions :
N<-nrow(bodyfat)
print(N) #Nombre d'individus
## [1] 71
P<-ncol(bodyfat)
print(P) #Nombre de variables
## [1] 10
summary(bodyfat)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
age
Min.
:19.00
1st Qu.:42.00
Median :56.00
Mean
:50.86
3rd Qu.:62.00
Max.
:67.00
elbowbreadth
Min.
:5.200
1st Qu.:6.200
Median :6.500
Mean
:6.508
3rd Qu.:6.900
Max.
:7.400
anthro3c
Min.
:2.050
1st Qu.:3.480
Median :3.990
Mean
:3.886
3rd Qu.:4.345
Max.
:4.620
DEXfat
Min.
:11.21
1st Qu.:22.32
Median :29.63
Mean
:30.78
3rd Qu.:39.33
Max.
:62.02
kneebreadth
Min.
: 7.200
1st Qu.: 8.600
Median : 9.200
Mean
: 9.301
3rd Qu.: 9.800
Max.
:11.800
anthro4
Min.
:3.180
1st Qu.:5.040
Median :5.530
Mean
:5.398
3rd Qu.:5.840
Max.
:6.370
waistcirc
Min.
: 65.00
1st Qu.: 78.50
Median : 85.00
Mean
: 87.38
3rd Qu.: 99.75
Max.
:117.00
anthro3a
Min.
:2.400
1st Qu.:3.540
Median :3.970
Mean
:3.869
3rd Qu.:4.155
Max.
:4.680
hipcirc
Min.
: 88.00
1st Qu.: 96.75
Median :103.00
Mean
:105.28
3rd Qu.:111.15
Max.
:132.00
anthro3b
Min.
:2.580
1st Qu.:4.060
Median :4.390
Mean
:4.291
3rd Qu.:4.660
Max.
:5.010
Dans le cadre de cette introduction aux modèles linéaires avec R, nous ne retiendrons que les 6 premières variables de
ce jeu de données :
9
donnees<-bodyfat[,1:6]
rownames(donnees)<-paste("ind",1:71)
Notons que la sélection d’une sous-sélection de variables dans un data.frame peut aussi se faire en sélectionnant les
variables par leur nom. Ainsi, bodyfat[,c("age","DEXfat")] permet de sélectionner les deux premières variables.
Afin de visualiser graphiquement le jeu de données, nous utiliserons la fonction ggpairs du package GGally. La
figure obtenue (Figure 1.4) représente un diagramme de double projection (biplot graphic, en anglais) pour chaque couple
de variable (scatterplot, en anglais). Des informations supplémentaires, comme une estimation de la distribution de chaque
variable et une estimation de la distribution bivariée de chaque couple de variables peuvent être ajoutées sur le graphique.
Notons que la fonction basique de R, pairs permet d’obtenir un résultat équivalent.
require(GGally)
ggpairs(donnees, diag=list(continuous="density"),
upper=list(continuous="density"),
lower=list(continuous="smooth"),
axisLabels='show')
À ce stade, plusieurs remarques peuvent être formulées :
– Le jeu de données contient majoritairement des individus plutôt âgés. En effet, la médiane est de 56 ans (voir résultat
de fonction summary) et la distribution des âges est très asymétrique avec un mode aux alentours de 60 ans.
– Certaines variables de ce jeu de données semblent présenter une corrélation linéaire très forte (par exemple la variable
DEXfat et la variable waistcirc).
Dans la prochaine partie, nous allons étudier l’influence du tour de taille (variable waistcirc) sur la mesure de la
graisse corporelle (variable DEXfat). Ce choix est naturel au vu de la remarque précédente.
10
60
age
50
40
30
DEXfat
60
50
40
30
20
10
waistcirc
110
100
90
80
70
130
hipcirc
120
110
100
kneebreadth elbowbreadth
90
7.5
7.0
6.5
6.0
5.5
12
11
10
9
8
7
●
●
●
● ●
● ● ●● ● ●
●
● ●●●
●● ● ●
●
●
● ●● ●●● ●
●
●
● ●●
●
●
●
●
●●
●
●●
●●
●
●●● ● ● ● ●●●●
●
●
● ●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●●
●
●
●
●●
●
●● ●
●
●
●
●
●
●
●
●
● ●●
●
●●●
●
●
●
● ●
●
●●
●●
●●
●●
●
● ●
● ● ●
●
●
●●●
●●
●● ●
●
● ●●
●●
●
●
●
●
●
●
●
●
●
●●
●
● ●●
●
●
●●● ●
●●
● ●
●●
●
●
●
●
●●
●●
● ●●
●
●
● ●●● ●
●
● ●
●
●
●
●
●●
●
●●
●
●
●
●
●
●●●
●
●
●
● ● ●●
●●●●
● ●●
●●
●
● ● ● ●
●
●
●● ●
●
●●
●
●●● ●
●
●●
●●
●●
●
● ●
●
●
● ●●
●●●
●
●
●● ● ● ●●●
●
●
●
●
●● ●
●
●
●
●●
● ●
●
●
●
●
●●●
●
●●●
●●
●●●
●
● ●●
●●●
●
●
●
●
●
● ●
●
●
● ●●
●
●
●
●
●
●
●
●●
●●
●
● ●●
●●
●●
●● ●
●
●● ●
●
● ● ● ●●
● ●● ● ●
●
●
● ●
●
●●
●
● ●●
●
●●
●●
● ●●
● ●
●●●
●
● ●● ●●
●●
●
● ●●●
●●
●● ●
● ● ●
●●●● ● ●
●
● ●
●● ●
●
●
●● ●
●●
●
● ●●
● ●●
●
●
●
●●●
●
●
●
●
●
● ●
●●
● ●
●
●
● ●
●
●● ●
●
●
●
●
●●
●● ●
●
●
●●
●
●
●
●●●
●
●
●
●
●
●●
●●
● ●
● ● ●●●
●
●●
●●●
●
●
●●
●
●
● ●●
●
●● ●
●
●
●● ●
●●
●
●● ●
●
●●●
●
●
● ●
●
●
●
●
●
●
● ●
●
●●
●
●
● ●
●
●
●● ●
●
●
● ●
● ● ● ●
●
● ●
●●
● ●
● ●●
● ●
●
●
●
● ●
●
●
●●
●
● ●
●● ●
●● ●
● ●● ●
●●
●
●● ● ●
● ●●● ● ● ●
●
● ● ●●
●●
●●● ● ●
●
●●
●
● ●
●
● ●
●● ●● ● ●
●● ●● ●●
●●
●●
●
●●
●
●
●
●
●●
●
●
●●● ●
●●●
●
●
●
●
●
●●
●
●●
●
● ● ●●
● ●
●
●
●●
●
●●
● ●●
● ●●
●●
●
●●●
●●●
●
●
●
●
●●
●●
●
●
●●
●
●
●●
●●●●
●
●●●●●
●●
●
● ● ●
● ●●
●●
●
●
●●
●
●●
●●
●
● ● ●
●
●
●
●
●
●
●
●
●
●
●●
●●
●●● ● ●●
●●● ●●
●
●
●
●
●
●
●
●
● ●● ●
●
●
● ● ●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●●
●
●
●
●
●
●
●● ●
●● ● ●● ● ●●
● ●●
●
●
● ●●
●● ●
●
●
● ●
●●
●
● ●●●
●●● ●
●●
●
● ●●
●
●
●●
● ●
●
●●
●● ● ●
●
●
●
●
●
●
●●
●●●
● ●
●●
●
●
●●
●●
●● ● ●
●
●
●●●●
●
●
●
●●
●
●
●●
●
●
●●●
● ●●
●●●● ●●●
●
●
●
●
●●
●
●
● ● ●● ●
●●●
● ●●
●●
●● ●●●●
●●
●● ●
●●● ●●●●
●
●● ● ●●
● ●
● ●●●
●●
●●●● ●● ● ●
● ●●
●● ●
●
●
20 30 age
40 50 60 10 20DEXfat
30 40 50 60 70waistcirc
80 90100110 90 100110120130
5.5 6.0 6.5 7.0 7.5
7kneebreadth
8 9 10 11 12
hipcirc
elbowbreadth
F IGURE 1.4 – Présentation graphique du jeu de données (scatterplot)
11
12
Chapitre 2
Régression linéaire simple
Le but de la régression linéaire simple permet d’étudier est de trouver la meilleure relation affine entre deux variables.
Les deux variables ne jouent pas ici un rôle symétrique. Nous avons d’une part la variable explicative, qui peut également
être appelée variable exogène, et d’autre part une variable à expliquer, ou encore variable réponse ou variable endogène. La
régression linéaire se donne alors pour but d’expliquer les variations de la variable réponse par les variations de la variable
explicative. Une fois la meilleure relation affine trouvée, il sera possible de tester l’importance du lien entre les deux
variables, et de prédire une valeur plausible de la variable réponse en fonction d’une nouvelle observation de la variable
explicative. Nous verrons également que la régression linéaire simple est assujettie à des hypothèses qu’il s’agira de vérifier
et de valider.
2.1
Écriture du modèle
Tout d’abord, formalisons notre problème dans un cadre statistique. Nous définissons les variables suivantes :
– soit y = (y1 , ..., yN )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable DEXfat pour chacun des
individus : c’est la variable réponse, également nommée variable endogène ou variable à expliquer,
– soit xwaist = (xwaist,1 , ..., xwaist,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable waistcirc
pour chacun des individus : c’est la variable explicative ou variable exogène,
– soient β0 et βwaist deux paramètres réels inconnus.
Dans l’idéal, nous voudrions trouver une relation strictement affine de la forme :
y = β0 + βwaist xwaist .
(2.1)
Si la relation décrite par l’équation (2.1) était vérifiée, elle impliquerait que le diagramme de double projection entre les
variables réponse et explicative consiste en une droite parfaite. La relation entre les deux variables serait alors entièrement
déterministe, et la connaissance de la valeur de la variable explicative permettrait de connaı̂tre avec exactitude la valeur
de la valeur réponse. Si ce genre de relation déterministe existe (il suffit de penser au lien entre le périmètre d’un cercle
et son rayon), la grande majorité des phénomènes observés contiennent une part stochastique. Nous représentons ces deux
variables sur un tel graphique (Figure 2.1).
require(ggplot2)
qplot(donnees$waistcirc,donnees$DEXfat,
xlab="Tour de taille",
ylab="Mesure de graisse corporelle",
geom = c("point", "smooth","line"),
method="loess")
13
●
●
60
●
Mesure de graisse corporelle
●
●
●
●
●●
●●
40
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
20
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
70
80
90
100
110
Tour de taille
F IGURE 2.1 – Mesure de masse corporelle en fonction du tour de taille
Notez que la fonction qplot permet de rajouter sur le graphique des informations supplémentaires comme une courbe
lissée. Nous constatons que les points semblent s’allonger grossièrement autour d’une droite. En revanche, il n’existe aucune
droite (ou, autrement dit, aucun couple (β0 , βwaist )) telle que tous les points appartiennent à cette droite. Le modèle proposé
dans l’équation (2.1) n’est donc pas le bon. Pour corriger le modèle précédent, nous allons être obligés de considérer que
les données que nous observons contiennent un bruit, une erreur d’ajustement. Notons donc ε = (ε1 , ..., εN )0 le vecteur
de longueur N = 71 qui contient les erreurs aléatoires de moyenne nulle (ou écarts à la droite de régression), et posons le
modèle classique de régression linéaire à une variable :
y = β0 + βwaist xwaist + ε.
2.2
(2.2)
Estimation des cœfficients
Il faut distinguer deux étapes dans la réalisation d’une régression linéaire ; la première étape consiste à estimer les
cœfficients du modèle 2.2 tandis que la seconde étape consiste à effectueur des tests sur ces cœfficients. L’estimation des
paramètres peut se faire sans aucune hypothèse statistique ; c’est un procédé purement algébrique. Pour cela nous devons
définir une fonction d’erreur, notée erreur ici, qui va permettre de déterminer la qualité de l’adéquation des données à la
droite de régression. Ensuite, il suffit de choisir les paramètres qui permettent de minimiser cette fonction.
Dans notre cas, nous chercherons à minimiser :
erreur(β0 , βwaist ) =
N
X
(yn − β0 − βwaist xwaist,n )2 .
n=1
Autrement dit, cette fonction correspond la somme des erreurs au carré de la distance entre les données et leurs projections orthogonales sur la droite de régression. Pourquoi utiliser la somme des erreurs au carré plutôt que la somme des
valeurs absolues des erreurs ? Pour des raisons essentiellement calculatoires et pour des propriétés intéressantes sur les lois
des estimateurs. Notez cependant qu’il existe une version de la régresion linéaire avec la fonction valeur absolue intervenant
dans la fonction erreur : il s’agit de la régression robuste.
Nous ne détaillons pas ici les calculs des paramètres.
14
2.3
Hypothèses relatives au modèle linéaire simple
Plusieurs hypothèses sont nécessaires afin d’obtenir de bonnes propriétés des estimateurs (β̂0 , β̂1 ) des paramètres du
modèle (estimateurs des paramètres sans biais et de variance minimale, par exemple). Nous distinguons deux types d’hypothèses : celles que nous appellerons explicites portent sur les termes d’erreur, et celles que nous appellerons implicites
sont directement liées à l’équation du modèle (équation (2.2)).
Les hypothèses explicites, c’est-à-dire celles qui portent sur les termes d’erreur εi , sont au nombre de trois :
– Ils sont de variance constante, notée σ 2 , c’est l’hypothèse d’homoscédasticité : en particulier, les erreurs ne sont pas
dépendantes de la variable exogène xwaist .
– Ils suivent une loi normale de moyenne nulle et de variance σ 2 .
– Ils sont indépendants.
À ces hypothèses sur le terme d’erreur, nous devons ajouter deux hypothèses supplémentaires, qui sont implicites au
modèle :
– La relation entre la variable exogène xwaist et la variable endogène y est linéaire. En particulier, il faudra se méfier
des relations non-linéaires (relation quadratique, exponentielle ou logarithmique par exemple) et des ruptures de
pentes. Nous préciserons ce dernier point dans le paragraphe concerné.
– La variable exogène xwaist est mesurée sans erreur. En effet, le modèle décrit dans l’équation (2.2) suppose que la
variable xwaist est fixe. Dans la conception originelle du modèle linéaire, la variable y est également supposée être
mesurée sans erreur car le terme aléatoire ne représente que le défaut d’ajustement.
La première étape de notre travail consiste maintenant à tester ces hypothèses.
2.3.1
Vérification de la condition de linéarité
Nous présentons trois façons de tester la linéarité de la relation entre les deux variables.
Le test de corrélation linéaire
La première chose à faire ici est de tracer la variable réponse en fonction de la variable explicative, si cela n’a pas encore
été fait (Figure 2.1). La corrélation linéaire peut être calculée grâce à la fonction cor :
cor(donnees$waistcirc,donnees$DEXfat)
## [1] 0.8986535
Nous rappelons que la corrélation linéaire varie entre -1 et 1. Lorsque la corrélation vaut 1, elle indique une corrélation
positive parfaite entre les données ; les données sont alors parfaitement alignées le long d’une droite dont le cœfficient directeur est positif. Lorsqu’elle vaut -1, elle indique une corrélation négative parfaite entre les données ; ces dernières sont
alors parfaitement alignées le long d’une droite dont le cœfficient directeur est négatif.
Attention : si les variables dont nous calculons la corrélation sont indépendantes les unes par rapport aux autres, alors le
cœfficient de corrélation linéaire vaudra 0. En revanche, la réciproque n’est pas vraie. Regardons l’exemple suivant :
#cette commande vous permettra d'obtenir exactement les mêmes résultats
set.seed(1)
exemple<-rnorm(1000,0,1)
cor(exemple,exempleˆ2)
## [1] -0.02948134
15
La corrélation quadratique entre le vecteur exemple et son carré est parfaite ; cependant, la corrélation linéaire entre
les deux vecteurs est proche de zéro. Dans la Figure 2.2, nous avons représenté le vecteur exemple2 en fonction du vecteur
exemple et nous avons ajouté la droite de régression linéaire :
qplot(exemple,exempleˆ2,
xlab="exemple",
ylab="exempleˆ2",
geom=("point"))+
geom_smooth(method='lm')
L’hypothèse de linéarité est essentielle, et le défaut de linéarité peut conduire à une interprétation erronée des résultats
obtenus.
Il est possible de tester si la corrélation observée est significativement différente de 0 ou non. Plus précisément, voici les
hypothèses du test :
H0 : la corrélation linéaire entre les deux variables est nulle
contre
H1 : la corrélation linéaire entre les deux variables est différente de zéro.
Ce test repose sur la bi-normalité des données. Attention : la bi-normalité est une condition plus forte que la normalité
de la première variable combinée à la normalité de la deuxième variable. Pour tester la bi-normalité, nous allons faire
appel à la fonction mshapiro.test du package mvnormtest qui effectue le test de Shapiro-Wilk multidimensionnel.
Comme pour le test unidimensionnel, l’hypothèse nulle de ce test est la multinormalité des données tandis que l’hypothèse
alternative est la non-multinormalité :
H0 : Le couple de vecteurs suit une loi binormale
contre
H1 : Le couple de vecteurs ne suit pas une loi binormale
Avec R, nous pouvons donc effectuer ce test de la manière suivante :
#Si le package n'est pas encore installé
#install.packages("mvnormtest")
require(mvnormtest)
mshapiro.test(rbind(donnees$waistcirc,donnees$DEXfat))
##
## Shapiro-Wilk normality test
##
## data: Z
## W = 0.9527, p-value = 0.009369
La p-valeur étant inférieure au seuil α = 0.05, nous rejetons l’hypothèse nulle et acceptons l’hypothèse alternative de
non bi-normalité. En conséquence, nous ne pouvons pas faire le test sur le cœfficient de corrélation. Si la p-valeur avait été
supérieure au seuil α = 0.05 nous aurions pu analyser la p-valeur retournée par la fonction cor.test de R, qui permet de
16
15
●
●
6
10
●
●
●
●
exemple^2
●
●
●
y
4
●
●
●
●
●
5
0
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
−2
0
2
●
●
●●
●
●
2
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●●
0
4
●●
●●
●
●
●●
●
●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
0
exemple
●
2
4
6
x
F IGURE 2.2 – Une corrélation nulle n’implique pas qu’il
n’y ait aucun lien entre les variables.
F IGURE 2.3 – Les données ne suivent pas une loi binormale mais l’hypothèse de linéarité est vérifiée !
tester la significativité du cœfficient de corrélation.
Le fait que les données ne suivent pas une loi bi-normale ne présume en rien de la linéarité des données, comme le
montre l’exemple suivant, dans lequel nous simulons un modèle linéaire dont la variable explicative est générée grâce à une
distribution exponentielle :
set.seed(123)
#Nous simulons une varaiable explicative
x<-rexp(90)
#Nous simulons un vecteur d'erreur
erreur<-rnorm(90,0,10ˆ-2)
#La variable réponse est la somme des deux
y<-x+erreur
#Nous réprésentons graphiquement le lien entre les deux variables
qplot(x,y)
#Nous effectuons le test de bi-normalité
mshapiro.test(rbind(x,y))
##
## Shapiro-Wilk normality test
##
## data: Z
## W = 0.7539, p-value = 5.635e-11
Test de linéarité basé sur l’anova
17
Ce paragraphe peut être sauté en première lecture
Le test de bi-normalité nous ayant conduit à une impasse, et les données étant visiblement alignées, nous allons employer une autre stratégie. Pour la mettre en œuvre, nous devons d’abord discrétiser la variable réponse waistcirc. La
discrétisation d’une variable continue est le processus qui permet regrouper ses valeurs en un petit nombre fini de valeurs
(c’est-à-dire, grossièrement, faire des paquets). Nous choisissons de faire 5 catégories comme suit :
require(arules)
#L'option frequency permet de faire des groupes d'effectifs semblables
#Nous faisons 5 groupes
waist_fact<- discretize(donnees$waistcirc,method="frequency",5)
waist_fact<-as.numeric(waist_fact)
nb_levels<-5
#Cette boucle permet d'assigner à chaque observation la moyenne
#des observations du groupe qui la contient
for(i in 1:nb_levels){
indice<-which(i==waist_fact)
waist_fact[indice]<-round(mean(donnees$waistcirc[indice]))
}
#Nous pouvons enfin tracer une voı̂te à moustache
qplot(as.factor(waist_fact),donnees$DEXfat)+
geom_boxplot(outlier.colour = "green",notch=TRUE,
fill = "purple", colour = "#3366FF")
## notch went outside hinges. Try setting notch=FALSE.
## notch went outside hinges. Try setting notch=FALSE.
Nous avons créé une nouvelle variable, waist fact qui comporte 5 classes. Chaque classe est représentée par la valeur moyenne des individus qui la composent. En considérant la nouvelle variable tantôt comme un facteur, tantôt comme
un vecteur quantitatif, nous allons pouvoir tester la linéarité. Nous avons représenté la variable réponse en fonction de la
nouvelle variable waist fact dans la Figure 2.4
Dans ce cas (c’est-à-dire quand nous avons plusieurs observations pour chaque niveau de la variable réponse), la
régression linéaire peut être vue comme une simplification de l’analyse de la variance. En effet, dans l’analyse de la variance, chaque niveau possède son propre paramètre. Dans la régression, les niveaux sont paramétrés par une droite ; ils ont
donc moins de liberté. Procédons maintenant l’analyse de variance et l’analyse de la variance de la régression linéaire :
anov<-aov(donnees$DEXfat˜as.factor(waist_fact))
xtable(anova(anov))
as.factor(waist fact)
Residuals
Df
4
66
Sum Sq
6616.00
1919.99
18
Mean Sq
1654.00
29.09
F value
56.86
Pr(>F)
0.0000
●
●
60
donnees$DEXfat
50
●
40
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
30
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
20
●
●
●
●
●
●
●
●
●
●
10
70
79
86
98
110
as.factor(waist_fact)
F IGURE 2.4 – Discrétisation de la variable explicative.
droite<-lm(donnees$DEXfat˜waist_fact)
xtable(anova(droite))
waist fact
Residuals
Df
1
69
Sum Sq
6613.81
1922.18
Mean Sq
6613.81
27.86
F value
237.41
Pr(>F)
0.0000
Les deux tableaux obtenus se ressemblent beaucoup, mais reflètent deux analyses bien différentes.
La première analyse est l’analyse de la variance classique, où la variable waist fact est considérée comme un facteur
comprenant 5 niveaux. Le nombre de degrés de liberté associé au facteur est 5 − 1 = 4.
La deuxième analyse où waist fact est considérée comme quantitative. C’est l’analyse de la variance de la régression.
Le nombre de degré de liberté correspondant à la variable explicative est 1.
Les deux tableaux montrent que l’anova a un meilleur pouvoir explicatif que la régression. La somme des carrés liée
au facteur est plus grande dans le cas de l’anova que de la régression. La Figure 2.5 vous aidera à comprendre ce que nous
venons d’écrire :
qplot(waist_fact,donnees$DEXfat)+
geom_abline(intercept=coef(droite)[1],slope=coef(droite)[2])+
geom_point(aes(x=c(70,79,86,98,110),
y=unlist(lapply(split(donnees$DEXfat,as.factor(waist_fact)),mean)),
color="red"),lwd=6,alpha=0.8)+
geom_point(aes(x=c(70,79,86,98,110),
y=sort(unique(round(fitted(droite),2))),color="green"),lwd=6,alpha=0.8)+
scale_colour_discrete(name ="",
labels=c("Regression", "ANOVA"))
19
●
●
60
donnees$DEXfat
50
●
●
●
●
●
●
●
●
●
●
●
●
●
●
40
●
●
●
●
●
●
●
Regression
●
●
ANOVA
●
●
●
●
30
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
20
●
●
●
●
●
●
●
●
●
●
10
70
80
90
100
110
waist_fact
F IGURE 2.5 – Anova contre régression : les points de la régression sont parfaitement alignés tandis que ceux pour l’anova
n’ont aucune contrainte. La question que nous nous posons est alors la suivante : faisons-nous une grande erreur en supposant
que les points sont alignés ? Dans ce cas, la proximité entre les points de la régression et ceux de l’anova semble indiquer
que l’erreur faite est négligeable (et donc, il est légitime de décrire la relation comme une relation linéaire).
Écrivons maintenant l’égalité de la somme des carrés pour l’analyse de la variance. Nous avons :
SCT = SCf + SCR ,
où SCT est la somme des carrés totale, SCf est la somme des carrés du facteur (ou encore, somme des carrés intergroupes) et SCR est la somme des carrés résiduelles (ou encore, somme des carrés intra-groupes). La quantité SCf contient
en réalité deux éléments distincts : elle contient la variabilité liée à la régression linéaire, et la variabilité qui n’est pas liée
à la régression linéaire SCl et que nous appelons variabilité non-linéaire SCnl . Nous pouvons alors réécrire l’égalité de la
somme des carrés :
SCT = SCl + SCnl + SCR .
Nous aboutissons au tableau de l’analyse de la variance suivant :
linéaire
non-linéaire
résiduelle
totale
SC
6614
2
1920
8536
ddl
1
3
66
70
Les p-valeurs ont été obtenues par la commande :
1-pf(228,1,66)
## [1] 0
1-pf(0.03,3,66)
## [1] 0.9929393
20
CM
6614
0.67
29
Fobs
228
0.03
p-valeur
0
0.99
Pour pouvoir les interpréter, il faut vérifier les conditions fondamentales de l’ANOVA :
bartlett.test(residuals(anov),as.factor(waist_fact))
##
## Bartlett test of homogeneity of variances
##
## data: residuals(anov) and as.factor(waist_fact)
## Bartlett's K-squared = 8.8038, df = 4, p-value = 0.06619
shapiro.test(residuals(anov))
##
## Shapiro-Wilk normality test
##
## data: residuals(anov)
## W = 0.9818, p-value = 0.3921
Les deux p-valeurs étant plus grandes que 0.05, nous décidons de garder les hypothèses nulles des deux tests que sont
la normalité des résidus et l’homoscédasticité. Nous pouvons maintenant interpréter le tableau de l’anova que nous venons
d’établir. Les deux p-valeurs correspondent aux deux tests suivants (donnés dans l’ordre du tableau) :
H0 : il n’existe pas de relation linéaire,
contre
H1 : il existe une relation linéaire.
et le deuxième test :
H0 : le modèle s’écrit β0 + βwaist xwaist ou il n’existe pas de relation non-linéaire,
contre
H1 : le modèle ne s’écrit pas β0 + βwaist xwaist ou encore il existe une relation non-linéaire.
La p-valeur du premier test est 0, et nous rejetons donc l’hypothèse nulle et décidons qu’il existe une partie linéaire.
Par ailleurs, la p-valeur du deuxième test est de 0.99, nous gardons donc l’hypothèse nulle, et décidons que le modèle
s’écrit uniquement sous la forme d’une droite affine. Nous pouvons donc, au vu de ces deux tests, décider de la linéarité des
données.
Le test de Rainbow
Le test de Rainbow permet également de tester la linéarité des données. L’idée de ce test est de comparer la pente de
régression restreintes aux observations ayant un faible levier (voir la partie sur les diagnostics pour une définition) et la
pente calculée à partir de l’ensemble des observations. Ce test s’écrit de la façon suivante :
H0 : La relation est linéaire
contre
21
H1 : La relation n’est pas linéaire
Il est fourni par le package lmtest :
require(lmtest)
raintest(lm(DEXfat˜waistcirc,data=donnees))
##
## Rainbow test
##
## data: lm(DEXfat ˜ waistcirc, data = donnees)
## Rain = 0.6452, df1 = 36, df2 = 33, p-value = 0.8998
La p-valeur étant supérieure à 0.05, nous décidons de ne pas rejeter l’hypothèse nulle, et donc, nous décidons de garder
l’hypothèse de linéarité de données. Nous pouvons donc poursuivre notre analyse.
2.3.2
Les variables sont mesurées sans erreur
Il n’existe pas de manière simple de tester si les variables sont mesurées sans erreur. Cependant, nous vérifierons dans la
partie concernant les diagnostics de la régression si certains points ne jouent pas un rôle trop important dans la régression. Ce
qu’il faut savoir, c’est que la présence d’erreurs de mesure conduit généralement à une sous-estimation du lien de linéarité.
Nous allons mesurer ce lien de linéarité grâce à la corrélation linéaire.
x_sans_bruit<-rnorm(100,0,2)
x_bruite_1<-x_sans_bruit+rnorm(100,0,0.5)
x_bruite_2<-x_sans_bruit+rnorm(100,0,1)
x_bruite_3<-x_sans_bruit+rnorm(100,0,1.5)
erreur<-rnorm(100,0,0.1)
y<-x_sans_bruit+erreur
cor(y, x_sans_bruit)
## [1] 0.9984656
cor(y, x_bruite_1)
## [1] 0.9630603
cor(y, x_bruite_2)
## [1] 0.8788355
cor(y, x_bruite_3)
## [1] 0.8211501
La corrélation diminue lorsque le niveau du bruit (ici, représenté par l’écart type de la loi normale qui augmente)
augmente.
2.3.3
Tester les hypothèses explicites
Les hypothèses implicites, comme nous l’avons vu, portent sur les termes d’erreur. Pour ce faire, nous devons d’abord
récupérer dans R le vecteur des résidus. Le vecteur des résidus n’est pas une réalisation directe du vecteur d’erreur. Cependant, il s’y rapporte, et faute de mieux, c’est sur lui que nous travaillerons.
22
droite<-lm(DEXfat˜waistcirc,data=donnees)
residus<-residuals(droite)
En R, lm est la fonction qui permet d’ajuster un modèle linéaire. La fonction residuals permet de récupérer les
valeurs résiduelles, c’est-à-dire :
res
ˆ i = yi − yˆi ,
où yˆi = β̂0 + β̂1 xwaist,i est la valeur ajustée de yi .
Indépendance
L’indépendance des résidus doit être, à ce stade, diagnostiquée en fonction des connaissances que nous avons sur le jeu
de données. Dans notre cas, nous la supposerons vérifiée. L’analyse des résidus dans la partie des diagnostics pourra nous
fournir quelques indications supplémentaires.
Cependant, si une forme de dépendance est soupçonnée dans les données, certains tests spécifiques peuvent être mis en
place. En particulier, si l’on soupçonne une auto-corrélation des erreurs (ce qui peut arriver si les données sont mesurées
temporellement), il existe le test de Breusch-Godfrey, qui peut être réalisé à partir de la commande bgtest du package
lmtest.
Normalité
Nous effectuons le test de Shapiro-Wilk, dont l’hypothèse nulle est la normalité des données et l’hypothèse alternative
la non-normalité des données :
shapiro.test(residus)
##
## Shapiro-Wilk normality test
##
## data: residus
## W = 0.9712, p-value = 0.1016
La p-valeur de ce test étant plus grande que 0.05, nous décidons de ne pas rejeter l’hypothèse nulle, et de fait, de décider
que les résidus suivent bien une loi normale. Ce choix est fait avec un risque de seconde espèce que nous ne calculerons pas
ici.
Homogénéité des variances
L’homogénéité des variances peut être testée grâce au test de Breusch-Pagan. Il a pour hypothèse nulle l’homoscédasticité
et pour hypothèse alternative l’hétéroscédasticité :
H0 : les résidus ont tous la même variance σ 2
contre
H1 : Les résidus n’ont pas tous la même variance σ 2
Nous utilisons la fonction bptest du package lmtest.
23
require(lmtest)
bptest(droite)
##
## studentized Breusch-Pagan test for homoscedasticity
##
## data: droite
## BP = 3.1948, df = 1, p-value = 0.07387
La p-valeur étant supérieure à 0.05, nous décidons de garder l’hypothèse nulle d’homoscédasticité. Un autre test
équivalent est le test de White, utilisable par la fonction white.test du package bstats ; les hypothèses nulle et
alternative sont les mêmes que pour le test de Breusch-Pagan :
#require(bstats)
white.test(droite)
##
## White test for constant variance
##
## data:
## White = 3.721, df = 2, p-value = 0.1556
La p-valeur étant supérieure à 0.05, nous parvenons à la même conclusion et gardons l’hypothèse d’homoscédasticité.
Cependant la partie des diagnostics nous permettra également de vérifier cette hypothèse.
2.4
Ajustement de la droite de régression et tests
Comme nous l’avons déjà vu, pour appliquer la régression linéaire nous devons faire :
droite<-lm(DEXfat˜waistcirc,data=donnees)
La fonction summary permet d’avoir toutes les informations essentielles sur la régression :
summary(droite)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Call:
lm(formula = DEXfat ˜ waistcirc, data = donnees)
Residuals:
Min
1Q
-12.5677 -3.6386
Median
-0.3711
3Q
2.8719
Max
17.7140
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -31.03158
3.67831 -8.436 3.18e-12 ***
waistcirc
0.70740
0.04157 17.017 < 2e-16 ***
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4.879 on 69 degrees of freedom
Multiple R-squared: 0.8076,Adjusted R-squared: 0.8048
F-statistic: 289.6 on 1 and 69 DF, p-value: < 2.2e-16
24
Analysons la sortie. Dans la partie cœfficient, nous trouvons deux lignes : l’intercept, qui correspond à notre β0 et
waistcirc qui correspond au cœfficient de la variable explicative βwaist . La première colonne, estimate, donne les
estimations ponctuelles pour les estimateurs β̂0 et β̂waist de β0 et βwaist . Nous pouvons les retrouver grâce à la fonction
coef :
coef(droite)
## (Intercept)
## -31.0315836
waistcirc
0.7073954
La colonne Std. Error donne l’écart-type pour chacun des estimateurs. Les colonnes suivantes correspondent alors
aux deux tests de Student (test t) suivant :
H 0 : β0 = 0
contre
H1 : β0 6= 0
et :
H0 : βwaist = 0
contre
H1 : βwaist 6= 0
La colonne t value donne la statistique de test, tandis que la colonne Pr(>|t|) donne la p-valeur associée. Nous
trouvons ensuite dans l’ordre :
– Une estimation de σ, obtenue par la formule suivante :
sqrt(sum(residusˆ2)/69)
## [1] 4.878985
– Le R2 (et sa version ajustée) qui représente la proportion de variabilité expliquée par le modèle,
– La statistique F de l’analyse de la variance de la régression, elle permet de tester la significativité globale du modèle.
Elle peut également être obtenue de la manière suivante :
xtable(anova(droite))
waistcirc
Residuals
Df
1
69
Sum Sq
6893.47
1642.51
Mean Sq
6893.47
23.80
F value
289.59
Pr(>F)
0.0000
Comme nous avons vérifié les conditions d’application de la régression linéaire, nous pouvons analyser les p-valeurs
retournées par l’appel de la fonction summary. Le test qui nous intéresse particulièrement est le test qui a pour hypothèse
nulle la nullité du paramètre βwaist . La p-valeur pour ce test étant inférieure à 0.05, nous rejetons l’hypothèse nulle et
acceptons l’hypothèse alternative βwaist 6= 0. La variable waistcirc a donc un effet linéaire significatif sur la variable
DEXfat.
Nous pouvons obtenir des intervalles de confiance pour les deux paramètres (une manière équivalente de faire un test
est de regarder si 0 appartient ou non à l’intervalle de confiance donné) :
25
confint(droite)
##
2.5 %
97.5 %
## (Intercept) -38.3696199 -23.6935473
## waistcirc
0.6244669
0.7903239
De la même manière, nous pouvons obtenir les valeurs ajustées yˆi ainsi que les intervalles de confiance correspondants :
pred<-predict(droite,interval="confidence")
xtable(head(pred))
fit
39.71
39.35
36.88
19.90
32.28
28.04
ind 1
ind 2
ind 3
ind 4
ind 5
ind 6
lwr
38.15
37.82
35.52
18.18
31.11
26.84
upr
41.27
40.89
38.24
21.62
33.45
29.24
Maintenant, nous pouvons mettre toutes ces informations sur un graphique (Figure 2.6) obtenu par la commande suivante :
qplot(donnees$waistcirc,donnees$DEXfat)+
geom_abline(intercept=coef(droite)[1],slope=coef(droite)[2],color="red")+
geom_point(aes(x=donnees$waistcirc,y=fitted(droite)),col="red",lwd=4)+
geom_ribbon(aes(ymin=pred[,2],ymax=pred[,3]),alpha=0.3,fill="green")
●
●
60
●
50
●●
●
●
donnees$DEXfat
●
●
●
●●
●
●●
●
●●●
●● ●
●●
●●
●
●
●●
40
●
●
●
●
●
●
30
●
●
●
●
●●
●
●
●
20
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
● ●
●
●●●
●
●
●●
●
●
●●
●●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
10
70
80
90
100
110
donnees$waistcirc
F IGURE 2.6 – La droite de régression, avec son intervalle de confiance, et les valeurs ajustées.
26
2.5
Prédiction en régression linéaire
Supposons maintenant que nous disposions de nouveaux individus pour lesquels nous aurions mesuré leur tour de taille.
Créons artificiellement un tel vecteur :
waist_nouv<-c(72.1,90.4,100,111.3)
Nous aimerions savoir, compte tenu de l’analyse de régression linéaire faite précédemment, quelles sont les valeurs
probables que peuvent prendre les mesures de graisse corporelle pour ces individus. Cela peut être fait grâce à la fonction
predict avec l’argument newdata. Par ailleurs, l’argument interval permet d’obtenir intervalle de prédiction :
predict(droite,newdata=data.frame(waistcirc=waist_nouv),
interval="prediction")
##
##
##
##
##
1
2
3
4
fit
19.97162
32.91696
39.70795
47.70152
lwr
10.08841
23.11215
29.85065
37.70125
upr
29.85484
42.72177
49.56526
57.70180
Pour fonctionner, l’argument newdata doit être un data.frame dont le nom de colonne est exactement le même
nom de colonne que la variable explicative.
2.6
Diagnostics de la régression linéaire
Vous avez sans doute noté que la plupart des tests servant à vérifier les conditions d’application du modèle ont conduit à
la non-réjection de l’hypothèse nulle. Les décisions que nous avons alors prises ont alors été faites avec un risque de seconde
espèce que nous ne connaissons pas. Par conséquent, il n’est pas inutile d’effectuer quelques vérifications supplémentaires.
De plus les diagnostics vont nous permettre de détecter des observations aberrantes, et ainsi, attirer notre attention sur
de possibles problèmes dans le jeu de données. C’est donc une étape indispensable.
2.6.1
Graphiques permettant de valider la normalité des résidus
Deux graphiques peuvent être utilisés afin d’attester de la normalité des résidus. Il s’agit de la droite de Henri et de
l’histogramme. Nous les avons tracés en Figure 2.7.
#Si vous ne voulez pas utiliser ggplot2, il suffit de faire :
#qqnorm(residus)
#qqplot(residus)
#Droite de Henri (qqplot en anglais)
qqres<-qqnorm(residus,plot.it=FALSE)
p1<-qplot(qqres[[1]],qqres[[2]])+geom_smooth(method="lm")+
xlab("Quantiles théoriques")+
ylab("Résidus")
#Pour trouver le point eloigne de la droite
which.max(qqres[[1]])
## [1] 41
27
#Histogramme
p2<-ggplot(data=NULL,aes(x=residus))+
geom_histogram(aes(y = ..density..,fill=..density..),binwidth=3)+
geom_density()+
scale_fill_gradient("density", low = "green", high = "red")+
ylab("Densité")
#On trace les deux graphiques ensemble
require(gridExtra)
grid.arrange(p1,p2,nrow=1,ncol=2)
La droite de Henri doit représenter, si les données suivent une loi normale, des points alignés le long d’une droite.
L’histogramme doit quant à lui présenter une loi symétrique sous forme de cloche. Nous avons rajouté dans la Figure
2.7 une estimation de la densité pour vous aider dans l’interprétation. En remplaçant le vecteur residus par un vecteur
contenant des valeurs simulées de différentes lois, vous pouvez voir des ”mauvais cas” (Figure 2.8). Nous donnons ici
l’exemple avec la loi exponentielle :
#vous pouvez remplacer la fonction rexp par
#n'importe quelle autre loi non gaussienne
vec_sim<-rexp(N)
#Diagramme quantile quantile
qqres<-qqnorm(vec_sim,plot.it=FALSE)
p1<-qplot(qqres[[1]],qqres[[2]])+geom_smooth(method="lm")+
xlab("Quantiles théoriques")+
ylab("vec_sim")
#Histogramme
p2<-ggplot(data=NULL,aes(x=vec_sim))+
geom_histogram(aes(y = ..density..,fill=..density..),binwidth=1)+
geom_density()+
scale_fill_gradient("density", low = "green", high = "red")+
ylab("Densité")
#On trace les deux graphiques ensemble
grid.arrange(p1,p2,nrow=1,ncol=2)
2.6.2
Graphe des résidus studentisés
Nous allons dans ce paragraphe étudier le graphique des résidus studentisés. Les résidus, même sous l’hypothèse d’homoscédasticité des erreurs, n’ont pas la même variance ; ils ne sont donc pas directement comparables. Les résidus studentisés permettent de répondre à cette problématique. Ils sont obtenus de la manière suivante :
require(MASS)
residus_stud<-studres(droite)
Nous traçons alors le graphique des résidus studentisés en fonction des valeurs ajustées (Figure 2.9) :
28
●
0.6
●
●●
4
0.075
●
●
0.4
●
10
●●
●
density
0.6
0.5
0.4
0.3
0.2
0.1
0.0
●
●
●
●
Densité
Résidus
●●
●
●
●●●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●●
0.06
0.04
0.02
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●●●●
●
●●●
●
0
density
0.08
0.050
2
0.00
0
Densité
vec_sim
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●●●●
●●●
● ●●●
0.2
0.025
●
0.0
−10
−2
−1
0
1
Quantiles théoriques
2
0.0
2.5
5.0
vec_sim
0.000
●
−2
−1
0
1
Quantiles théoriques
2
−10
0
10
20
residus
F IGURE 2.8 – Droite de henri et histogramme pour un
vecteur dont les éléments ont été simulés suivant une
loi exponentielle. La droite de Henri ne présente pas de
points alignés tandis que l’histogramme ne présente pas
une distribution symétrique.
F IGURE 2.7 – Droite de henri et histogramme sur notre
jeu de données.
qplot(fitted(droite),residus_stud)+
geom_abline(intercept=2,slope=0,color="red",lwd=1.5)+
geom_abline(intercept=-2,slope=0,color="red",lwd=1.5)+
geom_text(aes(label=ifelse((abs(residus_stud)>2),
paste(names(residus_stud), "\n", round(residus_stud,1)),"")), hjust=1.1)
D’abord, nous pouvons considérer que les observations dont les résidus studentisés sont supérieurs à 2 en valeur absolue
sont suspectes. Dans notre cas nous en avons trois. Nous y reviendrons plus tard.
Une chose importante est d’étudier la forme du nuage de points, afin de détecter des problèmes de non-linéarité ou
d’hétérogénéité des variances. Par ailleurs, il est conseillé de faire le même graphique en prenant pour abscisse les valeurs
de la variable explicative (Firgure 2.10) :
qplot(donnees$waistcirc,residus_stud)+
geom_abline(intercept=2,slope=0,color="red",lwd=1.5)+
geom_abline(intercept=-2,slope=0,color="red",lwd=1.5)+
geom_text(aes(label=ifelse((abs(residus_stud)>2),
paste(names(residus_stud), "\n", round(residus_stud,1)),"")), hjust=1.1)
Pour comparaison, nous produisons les cas les plus classiques dans la Figure 2.11, et dont le code est ci-dessous :
require(gridExtra)
gr1<-qplot(1:50,rnorm(50))
gr2<-qplot(1:50,(1:50)*rnorm(50))
gr3<-qplot(1:50,sqrt((1:50))*rnorm(50))
gr4<-qplot(1:50,cos((1:50)*pi/25)+rnorm(50))
grid.arrange(gr1,gr2,gr3,gr4,ncol=2)
Dans notre cas, nous pouvons suspecter un léger problème d’hététoscédascité.
29
ind 41
●
4.1
4
ind 48
●
2.3
2
ind 41
●
4.1
4
ind 48
●
2.3
2
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●●
●
0
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
0
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
−2
●
●
−2
ind 55
●
−2.7
20
30
ind 55
●
−2.7
40
50
70
80
fitted(droite)
90
100
110
donnees$waistcirc
F IGURE 2.9 – Résidus studentisés contre valeurs
ajustées.
2.6.3
●
●●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
residus_stud
residus_stud
●
●
●
●
F IGURE 2.10 – Résidus studentisés contre variable explicative.
Leviers
Nous allons calculer ce que nous appelons les leviers. Ces valeurs sont liées à la distance qui sépare l’observation
de la variable explicative avec la moyenne des observations. Plus une observation a un levier important, et plus elle est
susceptible de modifier significativement la droite de régression. Il faut les comparer avec la valeur 4/N , avec N le nombre
d’observations. Dans notre cas la valeur de référence est : 4/71.
hv<-hatvalues(droite)
indice<-1:71
qplot(indice,hv)+
geom_abline(intercept=0.057,slope=0,col="red",lwd=1.4)+
geom_text(aes(label=ifelse((hv>0.057 &indice!=48),
paste(names(hv), "\n", round(hv,2)),"")), hjust=+1.1)+
geom_text(aes(label=ifelse((hv>0.057 &indice==48),
paste(names(hv), "\n", round(hv,2)),"")), hjust=-0.1)
La Figure 2.12 indique la présence de cinq individus qui dépassent le seuil et qui sont donc potentiellement influentes
du fait de leur éloignement de la moyenne des variables explicatives.
2.6.4
Distance de Cook
La distance de Cook permet de prendre en compte l’éloignement par rapport à la moyenne des variables explicatives
et l’éloignement par rapport à la droite de régression. Cette distance permet donc de mesurer l’influence d’une observation
sur la droite de régression. Les observations dont la distance de Cook est supérieure à 4/N doivent retenir notre attention.
Avant de calculer la distance de Cook, voici un exemple de ce que nous cherchons à éviter (Figure 2.13) :
x<-rnorm(20)
y<-x+rnorm(20,0,0.1)
x[20]<-4
y[20]<-1
30
●
2
●
100
●
●
●
●
●
●
●
●
● ●
rnorm(50)
●
●
●
0
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
−1
●
●
●
●●
●
●
●
●
●
50
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
● ● ● ● ●
●●
●●●
●
●
● ●
●
●
0
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
−2
(1:50) * rnorm(50)
1
●
−50
●
●
0
10
20
●
●
30
40
50
0
10
20
1:50
30
40
50
1:50
4
●
cos((1:50) * pi/25) + rnorm(50)
●
●
sqrt((1:50)) * rnorm(50)
●
●
●
10
●
●
●
0
●
●
● ●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
−10
●
●
2
●
●
10
20
30
40
50
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●
10
●
●
●
●
●
−2
0
1:50
●
●
●
●●
0
●
●
●
●
●
● ●
●
●
0
●
●
●
●
●
●
20
30
40
50
1:50
F IGURE 2.11 – Différents cas pour le graphique des résidus. En haut à droite, c’est la situation ”normale”. Les deux graphiques suivants présentent un cas d’hétéroscédasticité, plus marqué en haut à droite qu’en bas à gauche. Cela se caractérise
par des formes d’entonnoir ou de diabolo, par exemple. Le dernier graphique présente un cas de non linéarité.
qplot(x,y)+geom_smooth(method="lm",aes(fill="avec"))+
geom_smooth(method="lm",aes(x=x[-20],y=y[-20],fill="sans"))+
scale_fill_discrete(name ="")
Nous pouvons maintenant calculer la distance de Cook pour notre exemple et représenter les valeurs sur un graphique
(Figure 2.14) :
cd<-cooks.distance(droite)
qplot(indice,cd)+
geom_abline(intercept=0.057,slope=0,col="red",lwd=1.4)+
geom_text(aes(label=ifelse((cd>0.057 ),
paste(names(cd), "\n", round(cd,2)),"")), hjust=+1.1)
31
3
0.08
ind 18
●
0.08
ind 45
●
0.08
ind 47 ind 48
●●
0.07 0.07
2
0.06
ind 46
●
0.06
●
●
●
●
●
1
●
hv
y
avec
●●
●
0.04
sans
●
●●
●
●
●
●
●
●
●
●●
●
●
0
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
0.02
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
−1
●
●
●
●
● ●●
●
●
●●
−1
0
20
40
0
1
2
3
4
x
60
indice
F IGURE 2.13 – Une situation qu’il faut éviter. Sur le graphique, les deux droites de régression, avec et sans le
point aberrant.
F IGURE 2.12 – Détection des observations avec un fort
levier.
0.3
ind 41
●
0.29
●
●
60
50
0.2
ind 48
●
0.18
cd
DEXfat
40
30
0.1
ind 45
●
0.06● ●
ind 14
●
0.06
20
●
●
●
●
0.0
●
●●●●●
●
●
●
●
●
●
●●●
●●
●
●
●●
●
●
●●
●●
●
●
●
●
●●●●
●
●
●●
●
●●
●
●
●
●●●●
●
●
●
●●●
●
●
●
●
●
●
10
0
20
40
60
●●
●
●
●
●
●●
●
●
●●
●
●
●
●
● ●
●●
● ●●
●
●
●
●
●
● ●
●●
●● ●
●
●● ●
●●
●● ●●
● ●●
● ● ● ●●
●
●
●
●
●●
● ●
●
●
●
●●
●
70
indice
80
90
100
● Cook ou stud.res
● Cook ou stud.res et hi
● normal
● hi
110
waistcirc
F IGURE 2.14 – Distance de Cook.
F IGURE 2.15 – Diagnostic final.
32
2.6.5
Diagnostic final
Nous construisons un graphique permettant de visualiser tous les points repérés lors de l’étape de diagnostic (Figure
2.15).
type<-matrix("normal",71,2)
type[c(14,41,45,48,55),1]<- "Cook or stud.res"
type[,2]<-rep("",71)
type[c(18,45,46,47,48),2]<- "hi"
qplot(data=donnees,waistcirc,DEXfat,geom="line")+
geom_point(aes(color=paste(type[,1],type[,2],sep=" ")),lwd=6)+
geom_smooth(method="lm")+
scale_colour_discrete(name ="",
labels=c("Cook ou stud.res", "Cook ou stud.res et hi","normal","hi"))
33
34
Chapitre 3
La régression linéaire multiple
La régression linéaire multiple est une généralisation de la régression linéaire simple dans laquelle plusieurs variables explicatives entrent dans le modèle. Pour résumer cette partie, nous pouvons dire que les concepts vus dans la partie précédente
ne changent pas, exceptés pour les deux points suivants :
– aux hypothèses du modèle linéaire simple, il faudra ajouter l’hypothèse implicite suivante : la collinéarité entre les
variables explicatives n’est pas ”trop” importante,
– les possibilités de tests sont plus importantes : ainsi nous pourrons tester la nullité d’un cœfficient, de l’ensemble des
cœfficients, ou d’une combinaison linéaire de ces derniers.
Poursuivant notre exemple, nous allons inclure dans un modèle de régression linéaire multiple l’ensemble des variables
contenues dans notre jeu de données. Pour rappel :
xtable(head(donnees))
ind 1
ind 2
ind 3
ind 4
ind 5
ind 6
age
57.00
65.00
59.00
58.00
60.00
61.00
DEXfat
41.68
43.29
35.41
22.79
36.42
24.13
waistcirc
100.00
99.50
96.00
72.00
89.50
83.50
hipcirc
112.00
116.50
108.50
96.50
100.50
97.00
elbowbreadth
7.10
6.50
6.20
6.10
7.10
6.50
kneebreadth
9.40
8.90
8.90
9.20
10.00
8.80
Nous définissons les variables suivantes :
– soit y = (y1 , ..., yN )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable DEXfat pour chacun des
individus : c’est la variable réponse, également nommée variable endogène ou variable à expliquer,
– soit xwaist = (xwaist,1 , ..., xwaist,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable waistcirc
pour chacun des individus : c’est une variable explicative ou variable exogène,
– soit xage = (xage,1 , ..., xage,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable age pour
chacun des individus : c’est une variable explicative ou variable exogène,
– soit xhip = (xhip,1 , ..., xhip,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable hipcirc pour
chacun des individus : c’est une variable explicative ou variable exogène,
– soit xelbow = (xelbow,1 , ..., xelbow,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable elbowbreadth
pour chacun des individus : c’est une variable explicative ou variable exogène,
– soit xknee = (xknee,1 , ..., xknee,N )0 le vecteur de longueur N = 71 qui contient les valeurs de la variable kneebreadth
pour chacun des individus : c’est une variable explicative ou variable exogène,
– soient β0 et βwaist , βage , βhip , βelbow , βknee six paramètres réels inconnus.
35
Notons alors ε = (ε1 , ..., εN )0 le vecteur de longueur N = 71 qui contient les erreurs aléatoires de moyenne nulle (ou
écarts à la droite de régression), et posons le modèle classique de régression linéaire multiple :
y = β0 + βwaist xwaist + βage xage + βhip xhip + βelbow xelbow + βknee xknee + ε.
3.1
(3.1)
Hypothèses relatives au modèle linéaire multiple
Plusieurs hypothèses sont nécessaires afin d’obtenir de bonnes propriétés des estimateurs des paramètres du modèle
(estimateurs des paramètres sans biais et de variance minimale, par exemple). Comme pour le modèle linéaire simple, nous
distinguons deux types d’hypothèses : celles que nous appellerons explicites portent sur les termes d’erreur, et celles que
nous appellerons implicites sont directement liées à l’équation du modèle.
Les hypothèses explicites, c’est-à-dire celles qui portent sur les termes d’erreur εi , sont au nombre de trois :
– Ils sont de variance constante, notée σ 2 , c’est l’hypothèse d’homoscédasticité : en particulier, les erreurs ne sont pas
dépendantes des variables exogènes.
– Ils suivent une loi normale de moyenne nulle et de variance σ 2 .
– Ils sont indépendants.
À ces hypothèses sur le terme d’erreur, nous devons ajouter trois hypothèses supplémentaires, qui sont implicites au
modèle :
– La relation entre les variables exogènes et la variable endogène y est linéaire ; de plus, les effets des variables
exogènes sont additifs.
– Les variables exogènes sont mesurées sans erreur. Dans la conception originelle du modèle linéaire, la variable y
est également supposée être mesurée sans erreur car le terme aléatoire ne représente que le défaut d’ajustement.
– Les variables exogènes ne présente pas de forte colinéarité entre elles.
La première étape de notre travail consiste maintenant à tester ces hypothèses. Comme nous ne souhaitons pas répéter
ce qui a été vu dans la partie sur la régression linéaire simple, nous nous contenterons d’évoquer les points suivants : la
linéarité et la liaison entre les variables exogènes.
3.1.1
L’hypothèse de relation linéaire
Nous voulons d’abord rendre attentif le lecteur au fait suivant : le modèle linéaire multiple que nous avons spécifié
n’implique pas la linéarité de la variable réponse en fonction de chaque variable. Un simple petit exemple suffit à s’en
convaincre (Figure 3.1) :
set.seed(1234)
x1<-rnorm(50)
x2<-rexp(50)
y<-x1+2*x2+rnorm(50,0,0.5)
p1<-qplot(x1,y)
p2<-qplot(x2,y)
p3<-qplot(x1+2*x2,y)
grid.arrange(p1,p2,p3)
En réalité, quand nous avons P variables, nous nous trouvons dans un espace de dimension P + 1. Les observations
s’allongent selon un sous-espace de dimension P , également appelé hyperplan. Prenons, pour commencer, l’exemple de la
régression linéaire simple. Nous avons alors une variable explicative, et par conséquent, nous sommes dans un espace de
dimension 2, c’est-à-dire le plan. Les observations s’alignent selon un sous-espace de dimension 2-1=1, c’est-à-dire une
36
●
5.0
●
●
●
●
●●●
●
●
y
●
●
●
2.5
●
●
●●
●
0.0
●
●●
●
●
● ●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
● ●
●
●
●
●●
●
●
−2.5
●
−2
−1
0
1
y
2
x1
8
●
5.0
●
●
y
2.5
0.0
●●
●
●
●
● ●
●
● ●
●●
●
● ●
●
●
●
●
● ●
●
−2.5
●
●
●
●
●
●
●
●
●
●
●
●●●
●● ●
● ●
●
●
●
●
●
●
0
1
2
3
x2
x1
2
●
5.0
●
●
●
●
y
●
0.0
●
● ●●
●
● ●
●● ●
●
●
●●●
●
●
●
● ● ● ●●
●● ●
●
● ●
● ●
●
x2
-2
●●
2.5
−2.5
●
●
-2
●
0.005
●
●●●
4
●
0.0
2.5
F IGURE 3.2 – Dans la régression linéaire à deux variables, les observations s’allongent selon un plan.
x1 + 2 * x2
F IGURE 3.1 – La linéarité dans la régression multiple ne
peut pas se regarder variable par variable.
droite. C’est bien ce que nous connaissions. Dans le cas où nous avons deux variables explicatives, nous sommes globalement dans un espace de dimension 3, et les observations s’allongent selon un espace de dimension 3-1=2, c’est-à-dire un
plan (Figure 3.2).
Comme dans la régression linéaire simple, il est possible d’effectuer le test de Rainbow :
#Voir section suivante pour une explication de la spécification
#du modèle. Le "." signifie : toutes les variables.
raintest(lm(DEXfat˜.,data=donnees))
##
## Rainbow test
##
## data: lm(DEXfat ˜ ., data = donnees)
## Rain = 0.5848, df1 = 36, df2 = 29, p-value = 0.9366
La p-valeur de ce test étant au-dessus de 0.05, nous ne pouvons pas rejeter l’hypothèse nulle de linéarité. Nous supposons
donc que cette dernière est satisfaite. De plus, l’étape de diagnostic permettra de vérifier plus en détail que cette condition
n’est pas violée.
3.1.2
L’hypothèse de non corrélation des variables explicatives
Ce qu’il faut savoir, c’est que plus les variables explicatives sont corrélées, et plus les résultats de la régression seront
difficilement interprétables. En particulier, il faut être attentif aux deux phénomènes suivants :
– l’intervalle de confiance pour les cœfficients de la régression augmente avec la corrélation. Il est donc de plus en plus
difficile de mettre en évidence un effet des variables explicatives.
– le signe des variables explicatives peut être inversé. Ainsi, deux variables corrélées positivement peuvent produire
deux cœfficients de régression de signe opposé.
37
Pour mettre en évidence ces deux points, il peut être utile d’observer ce qu’il se passe sur un petit exemple. Dans ce
dernier, nous allons générer des données issues d’une loi normale bivariée, dans laquelle nous ferons évoluer la matrice de
variance covariance. Cette dernière sera de la forme :
1 a
a 1
Plus le cœfficient a sera proche de 1, et plus nos données simulées seront corrélées (en moyenne).
#Permet d'obtenir des résultats reproductibles
set.seed(12345)
#Le vecteur val contient les valeurs de a utilisées pour la
#matrice de variance-covariance
val<-c(0.99,0.97,0.9,0.5,0)
#Resultat : contient les étendues des intervalles de confiance
#Resultat : 0 si signes opposés, 1 sinon
resultat<-matrix(500,100,5)
resultat2<-matrix(500,100,5)
for(i in 1:5){
a<-val[i]
for(j in 1:100){
#Ceci est une manière simple de généré des données corrélées
#selon une loi normale bivariée
C1<-chol(matrix(c(1,a,a,1),2,2))
x<-t(C1%*%matrix(rnorm(10,0,1),2,5))
#x contient les deux variables x1 et x2
#y=x1+x2+bruit
y<- apply(x,1,sum)+rnorm(5,0,0.5)
#calcul de l'étendue moyenne pour les deux paramètres beta_1 et beta_2
resultat[j,i]<-mean(abs(confint((lm(y˜x)))[2:3,2]-confint((lm(y˜x)))[2:3,1]))
#signe égaux ?
resultat2[j,i]<-sum(coef(lm(y˜x))[2]*coef(lm(y˜x))[3]>0)
}
}
p1<-qplot(as.factor(rep(val,each=100)),c(resultat))+
geom_boxplot(outlier.colour = "green",notch=TRUE,
fill = "purple", colour = "#3366FF")+
xlab("correlation")+
ylab("amplitude de l'intervalle de confiance")
p2<-qplot(val,apply(resultat2,2,mean),geom=c("line","point"))+
xlab("correlation")+
ylab("proportion de signes cohérents")
grid.arrange(p1,p2,ncol=2)
Nous ne saurons trop conseiller de faire une figure similaire à celle de notre Figure 1.4 afin de détecter par avance
d’éventuels problèmes de corrélation et de regarder la matrice de corrélation :
38
100
●
●
●
●
0.9
●
●
50
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
0
0.5
0.9
0.97
●
25
●
●
●
0
proportion de signes cohérents
amplitude de l'intervalle de confiance
75
●
0.8
0.7
●
●
0.99
0.00
0.25
correlation
0.50
0.75
1.00
correlation
F IGURE 3.3 – À gauche : l’étendue augmente avec la corrélation des deux variables explicatives. À droite : la proportion de
signe cohérent diminue avec l’augmentation de la corrélation.
xtable(cor(donnees[,-2]))
age
waistcirc
hipcirc
elbowbreadth
kneebreadth
age
1.00
0.24
0.18
-0.07
0.13
waistcirc
0.24
1.00
0.87
0.40
0.73
hipcirc
0.18
0.87
1.00
0.33
0.76
elbowbreadth
-0.07
0.40
0.33
1.00
0.46
kneebreadth
0.13
0.73
0.76
0.46
1.00
Attention cependant : cela ne saurait être suffisant ! En effet, quand nous construisons la matrice de corrélation, nous
regardons les dépendances linéaires deux par deux. Cependant, la structure de corrélation peut être plus complexe et prendre
en compte plus de deux variables dans le même temps. L’étape de diagnostics nous permettra de vérifier si la corrélation
des variables explicatives ne pose pas un problème trop important.
3.1.3
Vérification des autres hypothèses
Pour la vérification des autres modèles, nous invitons le lecteur à se référer à la partie de vérification des hypothèses de
la régression linéaire simple
3.2
Estimation des cœfficients
Comme pour le modèle linéaire simple, la fonction R nous permettant d’ajuster un modèle de régression linéaire multiple
est la fonction lm. De manière idéale, toutes les variables - réponse et variables explicatives - sont contenues dans un
data.frame, comme dans notre exemple. Nous voyons ici toutes les façons de procéder :
#Nous conseillons au lecteur de regarder le résultat pour
#chacun de ces modèles à l'aide de la fonction summary
39
#Le "." signifie : toutes les variables exceptée la variable réponse
modele1<-lm(DEXfat˜.,data=donnees)
#Le signe "-" avant une variable permet de la retirer du modèle
modele1<-lm(DEXfat˜.-waistcirc,data=donnees)
#Le signe ":" permet de rajouter une interaction
modele1<-lm(DEXfat˜.+waistcirc:age,data=donnees)
#La formule "a*b" est un raccourci pour "a+b+a*b"
modele1<-lm(DEXfat˜waistcirc*age,data=donnees)
#Pour retirer l'intercept du modèle retirer la variable "1"
#Note : ne pas faire cette opération sans raison
modele1<-lm(DEXfat˜waistcirc*age-1,data=donnees)
#La fonction I() indique qu'il faut considérer les symboles
#arithmétique comme tels. Ainsi : I(x*x) signifie x au carré
modele1<-lm(DEXfat˜I(waistcircˆ2)+age,data=donnees)
#La fonction offset() permet d'imposer la valeur d'un
#coefficient de la régression
#N.B.: dans ce cas, la variable n'est logiquement plus dans
#le tableau des résultats.
modele1<-lm(DEXfat˜offset(5*waistcirc)+age,data=donnees)
Dans notre cas, nous commençons par ajuster un modèle sur l’ensemble des variables explicatives de notre modèle :
modele1<-lm(DEXfat˜.,data=donnees)
coef(modele1)
## (Intercept)
## -59.57319910
## kneebreadth
##
1.65380650
3.3
age
0.06381438
waistcirc
0.32043969
hipcirc elbowbreadth
0.43395490 -0.30117257
Test dans la régression linéaire multiple
La régression linéaire multiple - en comparaison avec la régression linéaire simple - offre un éventail beaucoup plus
important. La difficulté est alors de bien comprendre les différences entre ces tests. D’avance, nous souhaitons préciser qu’il
existe deux familles de tests, chacune possédant ses propres spécificités : les tests t (pour Student) et les tests F (pour Fisher).
L’idée générale est la suivante : les tests t testent la nullité d’un paramètre ou d’une combinaison de paramètres tandis que
les tests F testent la prévalence d’un modèle sur un autre. Dans un certain sens, nous pourrions être enclins à dire que les
tests F sont plus précis que les test t. Dans la suite, nous prendrons soin de préciser le type de test qui est utilisé.
3.3.1
Les tests t pour chaque paramètre
Les tests t pour chaque paramètre ont pour hypothèse nulle la nullité du paramètre considéré et pour hypothèse alternative
la non-nullité de ce paramètre. La fonction summary permet d’obtenir les p-valeurs de ces tests :
modele1<-lm(DEXfat˜.,data=donnees)
xtable(summary(modele1))
Dans notre cas, nous décidons de la non-nullité des paramètres waistcirc et hipcirc.
40
(Intercept)
age
waistcirc
hipcirc
elbowbreadth
kneebreadth
3.3.2
Estimate
-59.5732
0.0638
0.3204
0.4340
-0.3012
1.6538
Std. Error
8.4536
0.0374
0.0737
0.0957
1.2173
0.8623
t value
-7.05
1.71
4.35
4.54
-0.25
1.92
Pr(>|t|)
0.0000
0.0928
0.0000
0.0000
0.8054
0.0595
La fonction anova appliquée à un objet de type lm
La fonction anova permet d’effectuer des tests F, par comparaison de deux modèles emboı̂tés. Le terme ”emboı̂té”
signifie que toutes les variables du plus petit des modèles sont contenues dans le plus grand des modèles. La façon de
comparer deux modèles emboı̂tés est la suivante : anova(modele1,modele2). Supposons que le modèle 1 soit emboı̂té
dans le modèle 2. De manière général, le test qui est alors fait peut s’interpréter de la façon suivante :
H0 : Le pouvoir explicatif du modèle 2 est égal au pouvoir explicatif du modèle 1
contre
H1 : Le pouvoir explicatif du modèle 2 est différent du pouvoir explicatif du modèle 1
ce qui peut aussi s’écrire en terme de résidus :
H0 : Les résidus des deux modèles sont égaux
contre
H1 : les résidus des deux modèles sont différents.
Si nous voulons effectuer le test suivant :
H0 : tous les β sont nuls
contre
H1 : il existe un β qui n’est pas nul
nous voulons comparer le modèle complet avec le modèle contenant simplement l’intercept. Ce test permet de valider
la significativité globale du modèle (test qui est également fourni dans les informations retournées par summary) :
modele0<-lm(DEXfat˜1,data=donnees)
xtable(anova(modele0,modele1))
1
2
Res.Df
70
65
RSS
8535.98
1033.79
Df
Sum of Sq
F
Pr(>F)
5
7502.20
94.34
0.0000
La p-valeur étant proche de zéro, nous rejetons l’hypothèse nulle de nullité de tous les paramètres et décidons qu’e notre
modèle, globalement, explique les variations de la variable réponse’il existe au moins un paramètre de notre modèle qui
41
n’est pas nul. Cette décision est faite avec un risque α = 5%.
Une telle comparaison entre deux modèles permet d’effectuer bon nombre de tests supplémentaires. Commençons par
tester la nullité d’un ensemble de paramètres. Le test que nous allons faire est le suivant : est-ce que l’ajout des variables
age, elbowbreadth et kneebreadth permet significativement de mieux expliquer la variable réponse que le modèle
contenant simplement les variables waistcirc et hipcirc ? Autrement dit, nous testons, conditionnellement au fait que
les variables waistcirc et hipcirc sont déjà dans le modèle :
H0 : βage = βelbow = βknee = 0
contre
H1 : Au moins un des cœfficient est non-nul.
modele2<-lm(DEXfat˜waistcirc+hipcirc,data=donnees)
xtable(anova(modele2,modele1))
1
2
Res.Df
68
65
RSS
1138.98
1033.79
Df
Sum of Sq
F
Pr(>F)
3
105.19
2.20
0.0959
La p-valeur étant supérieure à zéro, nous sommes contraints (avec un risque de seconde espèce) de décider que le modèle
réduit est suffisant pour expliquer la variable réponse, autrement dit : βage = βelbow = βknee = 0.
Nous pourrions maintenant nous demander si βwaist = βhip , dans le modèle ne contenant que les deux variables xwaist
et xhip . Pour cela, il suffit de faire :
modele2bis<-lm(DEXfat˜I(waistcirc+hipcirc),data=donnees)
xtable(anova(modele2bis,modele2))
1
2
Res.Df
69
68
RSS
1150.07
1138.98
Df
Sum of Sq
F
Pr(>F)
1
11.09
0.66
0.4186
Nous rappelons que la fonction I() permet de considérer le signe + comme un signe arithmétique et non comme
le symbole permettant d’rajouter une variable dans le modèle. Dans le modèle modele2, chacune des variables a son
cœfficient de régression tandis que dans le modèle modele2bis nous forçons les deux variables à avoir le même cœfficient
de régression. Le test nous permet de montrer que le modèle sans contrainte n’explique pas significativement mieux la
variable réponse que le modèle où la contrainte d’égalité des cœfficients est appliquée. Nous décidons donc que βwaistcirc =
βhipcirc (avec un risque inconnu de seconde espèce). Notre modèle s’écrit donc maintenant :
y = β0 + βwaist−hip (xwaist + xhip ) + ε
Autrement dit, nous sommes en présence d’un modèle linéaire simple.
Supposons maintenant qu’il est admis dans la littérature que ce modèle est le bon, et que βwaist−hip = 0.4. Comment
pouvons-nous tester ce modèle ?
42
modele2tri<-lm(DEXfat˜offset(0.4*I(waistcirc+hipcirc)),data=donnees)
xtable(anova(modele2tri,modele2bis))
1
2
Res.Df
70
69
RSS
1172.63
1150.07
Df
Sum of Sq
F
Pr(>F)
1
22.56
1.35
0.2487
Nous rappelons que la fonction offset() permet d’imposer la valeur d’un cœfficient de régression. La p-valeur étant
au-dessus de 0.05, nous ne pouvons pas rejeter l’hypothèse nulle d’équivalence entre les deux modèles et décidons que nos
résultats sont cohérents avec la littérature dans laquelle βwaist−hip = 0.4.
3.4
Utilisation de la fonction anova sans utiliser de deuxième modèle
Appliquons la fonction anova à notre modèle complet, écrit de deux façons différentes, en inversant la variable age et
la variable kneebreadth :
modele1<-lm(DEXfat˜age+waistcirc+hipcirc+elbowbreadth+kneebreadth,data=donnees)
modele1bis<-lm(DEXfat˜kneebreadth+waistcirc+hipcirc+elbowbreadth+age,data=donnees)
Nous laissons le lecteur vérifier que la fonction summary, appliquée à chacun de ces deux modèles, retourne le même
résultat à l’ordre des lignes près. En revanche, regardons si cette propriété est conservée par la fonction anova :
xtable(anova(modele1))
age
waistcirc
hipcirc
elbowbreadth
kneebreadth
Residuals
Df
1
1
1
1
1
65
Sum Sq
627.15
6295.45
519.21
1.89
58.50
1033.79
Mean Sq
627.15
6295.45
519.21
1.89
58.50
15.90
F value
39.43
395.83
32.65
0.12
3.68
Pr(>F)
0.0000
0.0000
0.0000
0.7312
0.0595
Df
1
1
1
1
1
65
Sum Sq
5035.41
2082.68
332.85
4.97
46.30
1033.79
Mean Sq
5035.41
2082.68
332.85
4.97
46.30
15.90
F value
316.60
130.95
20.93
0.31
2.91
Pr(>F)
0.0000
0.0000
0.0000
0.5780
0.0928
xtable(anova(modele1bis))
kneebreadth
waistcirc
hipcirc
elbowbreadth
age
Residuals
Les résultats, sont, comme vous pouvez le constater, totalement différents. La significativité des variables age et
kneebreadth change selon la position dans le modèle (ici, première ou dernière). En réalité, la fonction anova appliquée à un seul modèle ajoute les variables les unes après les autres. Elle compare alors à chaque fois deux modèles : si
nous sommes à la ligne i, la fonction compare le modèle contenant les variables 1 à i − 1 avec le modèle contenant les
variables 1 à i (de la même manière que dans le paragraphe précédent). L’ordre dans lequel nous plaçons les variables dans
le modèle est donc primordial.
43
3.5
Intervalles de confiance
Comme dans la régression linéaire simple, les intervalles de confiance univariés s’obtiennent de la manière suivante :
xtable(confint(modele1))
(Intercept)
age
waistcirc
hipcirc
elbowbreadth
kneebreadth
2.5 %
-76.46
-0.01
0.17
0.24
-2.73
-0.07
97.5 %
-42.69
0.14
0.47
0.62
2.13
3.38
En général, les variables explicatives ne sont pas indépendantes les unes des autres, et la variation d’un cœfficient donne
une indication sur la variation des autres cœfficients. Il est possible de créer une ellipse de confiance pour un couple de deux
paramètres (Figure 3.4) :
#Le deuxième argument est le choix des variables
#les variables sont données dans l'ordre donné par summary
#Attention : la premiere variable est toujours l'intercept !
require(ellipse)
E<-ellipse(modele1,c(3,4))
qplot(E[,1],E[,2],geom="path")+
geom_point(aes(x=0,y=0),lwd=5,colour="red")+
geom_point(aes(x=coef(modele1)[3],y=coef(modele1)[4]),lwd=5,colour="green")+
geom_vline(aes(xintercept=c(0.17321558,0.4676638)))+
geom_hline(aes(yintercept=c(0.24291126, 0.6249985)))+
xlab("waistcirc")+
ylab("hipcirc")
3.6
Valeurs ajustées
La syntaxe est identique à la régression linéaire simple :
#Pour avoir les valeurs ajustées :
Fit<-fitted(modele1)
#Avec les intervalles de confiance :
Pred<-predict(modele1,interval="confidence")
xtable(Pred[1:4,])
ind 1
ind 2
ind 3
ind 4
fit
38.12
39.78
34.89
22.45
lwr
36.14
37.37
33.08
20.44
44
upr
40.09
42.18
36.70
24.47
0.6
●
hipcirc
0.4
0.2
0.0
●
0.0
0.1
0.2
0.3
0.4
0.5
waistcirc
F IGURE 3.4 – Les barres verticales représentent l’intervalle de confiance uni-varié pour la variable waistcirc. Les barres
horizontales représentent l’intervalle de confiance uni-varié pour la variable hipcirc. L’ellipse représente l’intervalle de
confiance bi-varié pour les deux variables. Le point vert représente l’estimation ponctuelle. Le point rouge est l’origine du
repère ; comme il n’est pas inclus dans l’ellipse, les deux cœfficients ne sont pas simultanément nuls.
3.7
Prédiction
Pour faire une prédiction à partir d’une ou plusieurs nouvelles observations, il suffit de créer un data.frame contenant
exactement les mêmes noms de colonnes que le jeu de données initial, excepté cependant la variable qui a été choisie pour
variable explicative. Il suffit alors de procéder de la même manière que dans le cas de la régression linéaire simple :
#Création d'un nouveau jeu de données
age<-c(50,60)
waistcirc<-c(82,80)
hipcirc<-c(101,100)
elbowbreadth<-c(6.6,7.1)
kneebreadth<-c(8.8,7.8)
new<-data.frame(age,waistcirc,hipcirc,elbowbreadth,kneebreadth)
print(new)
##
age waistcirc hipcirc elbowbreadth kneebreadth
## 1 50
82
101
6.6
8.8
## 2 60
80
100
7.1
7.8
predict(modele1,new,interval="prediction")
##
fit
lwr
upr
## 1 26.28878 18.23514 34.34242
## 2 24.04769 15.42540 32.66999
45
3.8
Diagnostics
Dans cette partie, nous verrons les diagnostics pour la régression linéaire multiple. Ce que nous avons vu dans la partie
sur la régression linéaire simple reste valide, même si les bornes auxquelles nous comparerons les différentes statistiques
de diagnostic dépendent souvent du nombre de paramètres. Ces bornes vous seront données dans la suite, sous la forme
d’un tableau récapitulatif. Nous insisterons cependant sur la nouveauté de cette partie, à savoir les diagnostics concernant
la corrélation linéaire des variables.
3.8.1
Diagnostic de colinéarité
La colinéarité laisse nos estimateurs de régression linéaire sans biais (pourvu que les autres conditions du modèle soient
vérifiées) mais impacte largement la variance des estimateurs, et donc, l’intervalle de confiance. Pour diagnostiquer ce genre
de problème, trois considérations sont à prendre en compte :
– la corrélation deux à deux (ce que nous avions déjà indiqué),
– le conditionnement de la matrice. Le conditionnement de la matrice est une notion d’analyse numérique. Plus la
matrice des prédicteurs contient de la corrélation linéaire, et plus les calculs numériques deviennent instables, et de
petites variations peuvent entraı̂ner d’importants changements dans le résultat. Nous verrons comment le calculer.
– nous regarderons également le critère VIF, pour variance inflation factor. Nous verrons comment l’interpréter.
La corrélation linéaire deux par deux a déjà été traitée et nous ne reviendrons pas dessus.
Le conditionnement se définit comme la racine carrée de la valeur absolue du rapport entre la plus grande et la plus
petite valeur propre de la transposée de la matrice d’expérience multipliée par elle-même.
mat_exp<-model.matrix(modele1)[,-1]
valeur_propre<-eigen(t(mat_exp)%*%mat_exp)$values
sqrt(max(valeur_propre)/min(valeur_propre))
## [1] 328.3236
Généralement, cette valeur doit être comparée à 30. Dans notre cas, le conditionnement indique des problèmes importants de corrélation linéaire.
La racine carrée des critères VIF peut être considérée comme suit : si une variable a pour racine carrée de son VIF
a, alors l’estimateur correspondant a un écart-type a fois plus élevé que dans le cas où le modèle ne contiendrait aucune
corrélation. Une variable dont la racine carrée du VIF est supérieure à 2 indique un problème de colinéarité.
sqrt(vif.lm(modele1)[[1]][1])
##
##
##
##
##
##
age
waistcirc
hipcirc
elbowbreadth
kneebreadth
3.8.2
VIF
1.049524
2.169547
2.215661
1.165325
1.652883
Tableau récapitulatif
Dans ce tableau, nous notons N le nombre d’observations, et P le nombre de variables.
46
explication
fonction
package
critère
résidus studentisés
les résidus studentisés doivent être tracés
contre la variable réponse et contre chacune des variables explicatives du modèle
pour détecter d’éventuels problèmes de
non linéarité ou d’hétéroscédasticité. La
valeur seuil permet de distinguer des observations anormales.
studres
MASS
2
normalité des résidus
la décision de la normalité par un test
de Shapiro-Wilk se fait avec une erreur de seconde espèce inconnue. Il peut
alors être utile de vérifier graphiquement
cette hypothèse par le diagramme quantilequantile et un histogramme
qqnorm qqplot
aucun
aucun
leviers
les leviers permettent de détecter les observations qui vont potentiellement influer
sur la régression. Elle est déterminée par la
distance entre l’observation concernée et le
barycentre de toutes les observations.
hatvalues
aucun
2P/N
distance de Cook
La distance de Cook permet de quantifier
l’impact sur la régression d’une observation
cooks.distance
aucun
4/N
VIF
le critère VIF permet de mesurer l’impact
de la corrélation linéaire sur la régression
vif
car
4
conditionnement
Le conditionnement permet de savoir si le
système linéaire est stable
voir par. prec.
aucun
30
47
48
Chapitre 4
Sélection de modèle
Nous avons vu dans le chapitre précédent que nous pouvions comparer deux modèles emboı̂tés. Cela n’est pourtant pas
toujours suffisant. Par exemple, si nous voulons répondre à la question : quel est le meilleur modèle contenant une seule
variable ? nous ne pouvons pas utiliser ce genre de test. Les statisticiens, voulant lever cette limitation, ont cherché une
nouvelle manière de précéder. Dans ce que nous allons présenter dans ce chapitre, nous allons introduire différents critères
qui vont permettre de choisir le (ou un des) meilleur modèle.
Moralement, tous ces critères tendent à trouver le modèle comprenant le moins de variables possibles tout en expliquant
suffisament la variable explicative.
4.1
Les critères
description
meilleur modèle
R2 ajusté
C’est une variante du R2 . Ce dernier a le défaut majeur d’augmenter
méchaniquement avec le nombre de variables.
Le plus proche de 1.
AIC
Crtière général s’appliquant à tout modèle estimé par maximum de vraisemblance (ce qui est notre cas).
Le plus faible.
Préférez la version corrigée quand le nombre de variable excède 30.
Le le plus faible.
Retient moins de variables que l’AIC.
Le le plus faible.
Équivalent à l’AIC
Le plus proche de P +1 (nombre de
variables dont l’intercept), en restant inférieur.
AIC corrigé
BIC
CP de Mallow
49
4.2
Procédure de sélection de modèle
Quand nous disposons de P variables dans un jeu de données, nous avons 2P modèles possibles. En effet, la première
variable peut être présente ou absente du modèle, pareil pour la suivante... Quand P = 10, nous parvenons déjà à 1024
modèles possibles, et l’augmentation du nombre de modèles en fonction du nombre de variables est exponentiellement.
Une recherche exhaustive parmi tous les modèles n’est alors plus possible. Cependant, dans notre cas, nous avons 25 = 32
modèles possibles. Ce nombre est suffisament faible pour envisager une recherche exhaustive.
4.2.1
Recherche exhaustive
La recherche exhaustive se fait grâce à au package leaps.
require(leaps)
rech<-regsubsets(DEXfat˜.,data=donnees)
summary(rech)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Subset selection object
Call: regsubsets.formula(DEXfat ˜ ., data =
5 Variables (and intercept)
Forced in Forced out
age
FALSE
FALSE
waistcirc
FALSE
FALSE
hipcirc
FALSE
FALSE
elbowbreadth
FALSE
FALSE
kneebreadth
FALSE
FALSE
1 subsets of each size up to 5
Selection Algorithm: exhaustive
age waistcirc hipcirc elbowbreadth
1 ( 1 ) " " " "
"*"
" "
2 ( 1 ) " " "*"
"*"
" "
3 ( 1 ) " " "*"
"*"
" "
4 ( 1 ) "*" "*"
"*"
" "
5 ( 1 ) "*" "*"
"*"
"* "
donnees)
kneebreadth
" "
" "
" *"
" *"
"* "
qplot(1:5+1,summary(rech)$cp)+
geom_line()+
geom_abline(aes(intercept=0,slope=1),col="red")+
xlab("Nombre de paramètres")+
ylab("Cp de Mallow")
50
●
Cp de Mallow
30
20
10
●
●
●
●
2
3
4
5
6
Nombre de paramètres
La première partie du retour de summary donne les variables que nous avons décider systématiquement d’exclure ou
d’inclure dans le modèle. Nous n’avons pas fait de tel choix. Le tableau du bas donne le meilleur modèle avec une variable,
puis le meilleur modèle avec deux variables(plus l’intercept)... Les variables sélectionnées pour chaque modèle sot accompagnées d’une étoile.
Comment choisir le nombre de modèle optimal ? Nous allons utiliser le critère du CP de Mallow. Nous représentons
dans la Figure 4.1 l’évolution de ce crtière en fonction du nombre de paramètres dans le modèle (=nombre de variables retenues + l’intercept). Nous traçons également la première bissectrice. Le meilleur modèle est le modèle à 4 variables (5-1),
puisque le point correspondant est proche de la première bissectrice tout en étant en-dessous.
51
●
Cp de Mallow
30
20
10
●
●
●
●
2
3
4
5
6
Nombre de paramètres
F IGURE 4.1 – Choix du nombre de variables dans le modèle grâce au critère CP de Mallow
4.3
Procédure forward, backward et stepwise
Dans tous les cas, il faut se choisir un critère de sélection. Par convenance, nous choisissons d’expliquer chacune de ces
procédures grâce au critère AIC.
Procédure forward : Nous commençons avec le modèle qui contient uniquement l’intercept. Á l’étape suivante, nous
construisons P nouveaux modèles, chacun contenant l’intercept plus une variable. Nous disposons alors de P + 1 modèles
(celui avec l’intercept seul, et les P autres). Si le modèle avec le plus faible AIC est le modèle contenant juste l’intercept,
nous gardons ce dernier modèle et la procédure s’arrête. Sinon, la variable permettant d’obtenir l’AIC le plus faible est
introduite. Nous construisons P − 1 modèles, contenant chacun l’intercept, la variable précédemment sélectionnée et une
des P − 1 variables restantes. Nous disposons donc de P modèles (un modèle à une variable et P − 1 modèles à deux
variables). Si le modèle à une variable donne l’AIC le plus faible, la procédure s’arrête et nous gardons le modèle à une
variable. Sinon, nous choisissons le meilleur modèle à deux variables et tentons d’inclure une troisième variable... L’arrêt
de la procédure se fait soit parce que l’ajout d’une nouvelle variable ne permet plus de faire diminuer le critère AIC, soit
parce que toutes les variables ont été incluses dans le modèle.
Nous effectuons cette procédure sur notre jeu de données :
modele0<-lm(DEXfat˜1,data=donnees)
sm1<-step(modele0,direction="forward",scope=˜.+hipcirc+age+elbowbreadth+kneebreadth+waistci
##
##
##
##
##
##
##
##
##
##
##
Start: AIC=342.04
DEXfat ˜ 1
+ hipcirc
+ waistcirc
+ kneebreadth
+ elbowbreadth
+ age
<none>
Df Sum of Sq
1
6947.8
1
6893.5
1
5035.4
1
1067.1
1
627.1
RSS
1588.2
1642.5
3500.6
7468.9
7908.8
8536.0
AIC
224.64
227.03
280.76
334.56
338.63
342.04
52
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Step: AIC=224.64
DEXfat ˜ hipcirc
+ waistcirc
+ kneebreadth
+ age
<none>
+ elbowbreadth
Df Sum of Sq
RSS
AIC
1
449.20 1139.0 203.04
1
139.99 1448.2 220.09
1
103.33 1484.8 221.87
1588.2 224.64
1
26.71 1561.5 225.44
Step: AIC=203.04
DEXfat ˜ hipcirc + waistcirc
+ kneebreadth
+ age
<none>
+ elbowbreadth
Df Sum of Sq
RSS
AIC
1
53.924 1085.0 201.60
1
44.804 1094.2 202.19
1139.0 203.04
1
0.013 1139.0 205.04
Step: AIC=201.6
DEXfat ˜ hipcirc + waistcirc + kneebreadth
+ age
<none>
+ elbowbreadth
Df Sum of Sq
RSS
AIC
1
50.295 1034.8 200.23
1085.0 201.60
1
4.972 1080.1 203.27
Step: AIC=200.23
DEXfat ˜ hipcirc + waistcirc + kneebreadth + age
Df Sum of Sq
<none>
+ elbowbreadth
1
RSS
AIC
1034.8 200.23
0.97352 1033.8 202.16
La sortie présente à chaque étape l’ensemble des modèles possibles. Nous partons du modèle contenant simplement
l’intercept. L’AIC étant minimum par l’ajout de la variable hipcirc celle-ci est ajoutée au modèle. Á la dernière étape,
la variable elbowbreadth, dernière à ne pas être dans le modèle, ne permet pas d’améliorer le critère AIC. Toutes les
variables, mise à part la variable elbowbreadth sont donc retenues dans le modèle.
Procédure backward : Cette procédure est dans le même esprit que la procédure forward, sauf que nous partons du
modèle complet et qu’à chaque étape nous essayons de retirer une variable du modèle.
Nous effectuons cette procédure sur notre jeu de données :
modele1<-lm(DEXfat˜.,data=donnees)
sm1<-step(modele1,direction="backward")
##
##
##
##
##
##
Start: AIC=202.16
DEXfat ˜ age + waistcirc + hipcirc + elbowbreadth + kneebreadth
- elbowbreadth
<none>
Df Sum of Sq
RSS
AIC
1
0.97 1034.8 200.23
1033.8 202.16
53
##
##
##
##
##
##
##
##
##
##
##
##
##
##
-
age
kneebreadth
waistcirc
hipcirc
1
1
1
1
46.30
58.50
300.52
327.31
1080.1
1092.3
1334.3
1361.1
203.27
204.07
218.28
219.69
Step: AIC=200.23
DEXfat ˜ age + waistcirc + hipcirc + kneebreadth
Df Sum of Sq
<none>
- age
- kneebreadth
- waistcirc
- hipcirc
1
1
1
1
50.30
59.42
306.73
341.39
RSS
1034.8
1085.0
1094.2
1341.5
1376.2
AIC
200.23
201.60
202.19
216.66
218.47
La première variable retirée est elbowbreadth puis la précédure s’arrête. Cela nous conduit donc au même modèle
qu’avec la précédure forward.
Procédure stepwise : Cette procédure est dans le même esprit que la procédure backward et forward, sauf que nous
partons du modèle complet et qu’à chaque étape nous essayons soit de retirer une variable qui est dans le modèle, soit
d’insérer une variable qui n’est plus dans le modèle.
Nous effectuons cette procédure sur notre jeu de données :
modele1<-lm(DEXfat˜.,data=donnees)
sm1<-step(modele1,direction="both")
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Start: AIC=202.16
DEXfat ˜ age + waistcirc + hipcirc + elbowbreadth + kneebreadth
- elbowbreadth
<none>
- age
- kneebreadth
- waistcirc
- hipcirc
Df Sum of Sq
RSS
1
0.97 1034.8
1033.8
1
46.30 1080.1
1
58.50 1092.3
1
300.52 1334.3
1
327.31 1361.1
AIC
200.23
202.16
203.27
204.07
218.28
219.69
Step: AIC=200.23
DEXfat ˜ age + waistcirc + hipcirc + kneebreadth
Df Sum of Sq
<none>
- age
+ elbowbreadth
- kneebreadth
- waistcirc
- hipcirc
1
1
1
1
1
50.30
0.97
59.42
306.73
341.39
RSS
1034.8
1085.0
1033.8
1094.2
1341.5
1376.2
AIC
200.23
201.60
202.16
202.19
216.66
218.47
La première variable retirée est elbowbreadth puis la précédure s’arrête. Cela nous conduit donc au même modèle
qu’avec la précédure forward et backward.
54
Chapitre 5
Quand les hypothèses ne sont pas respectées...
Nous l’avons écrit à maintes reprises : impossible d’interpréter les tests d’une régression linéaire quand les hypothèses qu’elles soient implicites ou explicites - sont violées. Cependant, si la violation d’une ou plusieurs hypothèses demande un
travail statistique plus conséquent, il n’y a rien d’insurmontable ! Nous allons voir point par point quelles sont les solutions
les plus couramment utilisées pour pallier la non-véracité de chacune des hypothèses.
5.1
Quand la variable explicative est mesurée avec une erreur
Nous l’avons dit dans le paragraphe concerné, si la variable explicative est mesurée avec une erreur, nous allons sousestimer l’effet de la relation linéaire. Nous supposerons dans ce paragraphe que nous connaissons la variance σδ2 des erreurs
de mesure. Celle-ci peut être estimée par une étude pilote, où plusieurs mesures de la même observations seraient faites.
Dans notre cas, cela consisterait à faire mesurer le tour de taille d’un de nos sujets par différentes personnes.
Dans le cas où nous pouvons supposer que l’erreur de mesure est indépendante de la mesure (dans notre cas, il s’agit
par exemple de vérifier que nous ne commettons pas d’erreur plus importante sur la mesure du tour de taille en fonction des
personnes pour lesquelles nous mesurons cette variable), deux cas se présentent :
– la variance de la variable explicative est très supérieure à la variance des erreurs de mesure : nous pouvons ne pas
prendre en compte les erreurs de mesure,
– dans le cas contraire, nous allons utiliser l’algorithme SIMEX qui permet de corriger la valeur de βwaist .
Dans notre cas, la variance du vecteur de la variable explicative est de 197. Nous allons supposer, pour l’exemple,
supposer que la variance des erreurs est de 20. L’idée de l’algorithme SIMEX est de rajouter du bruit à la variable explicative
et de mesurer son influence sur le coefficient de régression. Il suffit ensuite de modéliser l’évolution du coefficient de
régression en fonction de la variance du bruit par une fonction linéaire et prédire la valeur qu’aurait ce coefficient si la
variance du bruit était nulle (voir Figure 5.1). Voici l’algorithme, détaillé, et annoté :
set.seed(123)
#Etape 1 : décision
de la variance du bruit qui va être ajoutée
variance_seq<-seq(5,30,5)
#Etape 2 : pour chaque variance, le coefficient beta va etre estimé mille fois
variance<- rep(variance_seq,each=1000)
nn<-length(variance)
pentes<- rep(0,nn)
for(i in 1:nn){
pentes[i]<-lm(DEXfat˜I(waistcirc+rnorm(N,0,sqrt(variance[i]))),data=donnees)$coef[2]
}
55
#Etape 3 : le vecteur des betas est composé du beta originel, et de la moyenne
#pour chacune des mille observations de beta pour chaque niveau de variance
betas<-c(droite$coef[2],colMeans(matrix(pentes,nrow=1000)))
#Etape 4 : ne pas oublier d'ajouter la variance des erreurs
variance<-c(0,seq(5,30,5))+20
#Etape 5 : Nous estimons la liaison entre variance des erreurs
#et betas par un modèle linéaire :
droite2<-lm(betas˜variance)
qplot(variance,betas,xlim=c(0,50), ylim=c(0.60,0.8))+
geom_abline(aes(intercept=coef(droite2)[1],slope=coef(droite2)[2]))+
geom_point(aes(x=0,y=coef(droite2)[1],colour="red"),lwd=6)+
scale_colour_discrete(name ="",labels="prediction")
0.80
●
betas
0.75
●
0.70
● prediction
●
●
●
0.65
●
●
●
0.60
0
10
20
30
40
50
variance
F IGURE 5.1 – Evolution du coefficient de régression en fonction de la variance du bruit..
56
Bibliographie
[1] Frédéric Bertrand and Myriam Maumy-Bertrand. Initiation à la statistique avec R. Dunod, 2010.
[2] Samprit Chatterjee and Ali S Hadi. Regression analysis by example. John Wiley & Sons, 2013.
[3] Pierre Dagnelie. Statistique théorique et appliquée, volume 2. De Boeck Université, 1998.
[4] Julian J Faraway. Extending the linear model with R : generalized linear, mixed effects and nonparametric regression
models. CRC press, 2004.
[5] Julian J Faraway. Linear models with R. CRC press, 2004.
57