Régression linéaire avec R

R´egression lin´eaire avec R
12 mars 2014
1
Introduction
Nous allons travailler sur le jeu de donn´ees bodyfat issu du package mboost. Pour ce faire, nous entrons les lignes
de commandes suivantes :
> library(mboost)
> data(bodyfat)
Attention : si la commande library retourne une erreur stipulant : “Erreur dans library(”nom”) : aucun package
nomm´e ‘nom’ n’est trouv´e” c’est que le package en question n’est pas encore installer. Ceci peut eˆ tre fait en utilisant la
fonction install.packages("nom du package") (ne pas oublier les guillemets dans cette commande !).
Notez bien que la commande data permet simplement de charger le jeu de donn´ees dans la m´emoire de R. En r´ealit´e,
de la mˆeme mani`ere 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´ees contenus dans le package.
Face a` un nouveau jeu de donn´ees, il est utile d’obtenir quelques informations e´ l´ementaires 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´epondre a` 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
kneebreadth
Min.
: 7.200
1st Qu.: 8.600
Median : 9.200
DEXfat
Min.
:11.21
1st Qu.:22.32
Median :29.63
Mean
:30.78
3rd Qu.:39.33
Max.
:62.02
anthro3a
Min.
:2.400
1st Qu.:3.540
Median :3.970
waistcirc
Min.
: 65.00
1st Qu.: 78.50
Median : 85.00
Mean
: 87.38
3rd Qu.: 99.75
Max.
:117.00
anthro3b
Min.
:2.580
1st Qu.:4.060
Median :4.390
1
hipcirc
Min.
: 88.00
1st Qu.: 96.75
Median :103.00
Mean
:105.28
3rd Qu.:111.15
Max.
:132.00
anthro3c
Min.
:2.050
1st Qu.:3.480
Median :3.990
elbowbreadth
Min.
:5.200
1st Qu.:6.200
Median :6.500
Mean
:6.508
3rd Qu.:6.900
Max.
:7.400
anthro4
Min.
:3.180
1st Qu.:5.040
Median :5.530
Mean
: 9.301
3rd Qu.: 9.800
Max.
:11.800
Mean
:3.869
3rd Qu.:4.155
Max.
:4.680
Mean
:4.291
3rd Qu.:4.660
Max.
:5.010
Mean
:3.886
3rd Qu.:4.345
Max.
:4.620
Mean
:5.398
3rd Qu.:5.840
Max.
:6.370
Dans le cadre de cette introduction aux mod`eles lin´eaires avec R, nous ne retiendrons que les 6 premi`eres variables de
ce jeu de donn´ees :
> donnees<-bodyfat[,1:6]
> rownames(donnees)<-paste("ind",1:71)
Notons que la s´election d’une sous-s´election de variables dans un data frame peut aussi se faire en s´electionnant les
variables par leur nom. Ainsi, bodyfat[,c("age","DEXfat")] permet de s´electionner les deux premi`eres variables.
Afin de visualiser graphiquement le jeu de donn´ees, nous utiliserons la fonction ggpairs du package GGally. La
figure obtenue (Figure 1) repr´esente un diagramme de double projection (biplot graphic, en anglais) pour chaque couple de
variable. Des informations suppl´ementaires, comme la distribution de chaque variable et la distribution bivari´ee de chaque
couple de variables peuvent eˆ tre rajout´ees sur le graphique. Notons que la fonction basique de R, pairs permet d’obtenir
un r´esultat e´ quivalent.
> library(GGally)
> ggpairs(donnees, diag=list(continuous="density"),
upper=list(continuous="density"),
lower=list(continuous="smooth"),
axisLabels='show')
` ce stade, plusieurs remarques peuvent eˆ tre formul´ees :
A
— Le jeu de donn´ees contient majoritairement des individus plutˆot aˆ g´es. En effet, la m´ediane est de 56 ans (voir r´esultat
de fonction summary) et la distribution des aˆ ges est tr`es asym´etrique avec un mode au alentour de 60 ans.
— Certaines variables de ce jeu de donn´ees semblent pr´esenter une corr´elation lin´eaire tr`es forte (par exemple la variable DEXfat et la variable waistcirc).
Dans la prochaine partie, nous allons e´ tudier l’influence du tour de taille (variable waistcirc) sur la mesure de la
graisse corporelle (variable DEXfat). Ce choix est naturel au vue de la remarque pr´ec´edente.
2
R´egression lin´eaire simple
Tout d’abord, formalisons notre probl`eme dans un cadre statistique. Nous d´efinissons 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´eponse, e´ galement nomm´ee variable endog`ene ou variable a` expliquer,
— soit x1 = (x11 , ..., x1N )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`ene,
— soient β0 et β1 deux param`etres r´eels inconnus.
Dans l’id´eal, nous voudrions trouver une relation strictement lin´eaire de la forme :
y = β0 + β1 x 1 .
(1)
Si la relation d´ecrite par l’´equation (1) e´ tait v´erifi´ee, elle impliquerait que le diagramme de double projection entre les
variables r´eponse et explicative consiste en une droite parfaite. Nous repr´esentons ces deux variables sur un tel graphique
(Figure 2).
2
age
DEXfat
60
50
40
30
20
10
waistcirc
110
100
90
80
70
kneebreadthelbowbreadth hipcirc
60
50
40
30
●
130
120
110
100
90
7.5
7.0
6.5
6.0
5.5
12
11
10
9
8
7
●
● ●●
●● ●● ●●
●
●
●
●
●
●●●
●
●●
●
●●●●
●
●
●
● ● ●●●●●●
●
●
●●
●
●
●
●
●
●●●● ● ● ●
●
●
●
● ●●●● ●
●
● ●●
●
●
● ● ●●
●●
●
●
●●
●
●
●
●●
●
●
●
● ●
●
●●
● ●
●
● ● ●●
●
●
● ●● ●●
●
●
●
●
● ●●
●● ● ● ●
●
●●
●●
● ●●
●● ●
●
●
●
●●
●
●
●●
●●●
●
●
●
●
●
●
●
●●
●●●
●●
● ●
●● ●
●●●
●
●
●
●●
●
●
●●
●
●●●●●
●
●
●●
●●
●●
●
●
●
●●
●●
● ●
●
●●
●●●
●●
●● ●●
●
●
●●
●● ●
●
●●
●
●
●
●
●●
●●● ●● ●
●
●●
●
●
●
●
●
●
●●
●
●● ●●
●
●
●
●
●
●
●
●
●●●
●●
●●●
●●
●●
●
●
●
●
●
●
●●
●
●●
●
● ●●
●●●
●
●
●
●●●
●
●
●
●●
●
●
●
●
●
●
●
●
● ●●
●●
●
●
● ●
● ●
● ● ● ●●
●●
●
●
●●
●
●●
●●
●
●
●● ●●●
●
●
●
●
●
●
●●
●
●
●
●
●●
● ● ● ●●
●
●
● ● ●
●●
●●
●
●●
●
●●
● ●
●
●●
●
●
●
●
●
●● ●●
●
●
● ●●●●
●
●●
●
●●
●●
●●● ●●
●
●●
●
●
●
●●
●●● ●●●
●●
●
●●
●●
●●
●●●
●● ●●
●
●
●
●●
● ●
●
●
●
●
●
●
●
●
● ●●
●●
●
●
●●
●●
●
●
● ●●●● ●
● ● ●●●
●
●
●
●
●
●
●
●
●
●●
● ●●
● ●
●
●
●
●● ●
●
●●●
●
● ●
●
●
●
●
●
●
●●
●
●
● ●
● ● ●
● ●● ●●
●
●
● ● ●●
●●
● ●
● ●
●● ● ●
●
●
●
●●●●
●●
●
●●●●
●
● ●●
●
●●●
●
●
●●●●●
●
●
●
●●● ●
●
●
●
●●●
● ● ●●
●
● ●●●●
●●
●●●
●●
●
●
●●● ●●
● ●● ●
● ●●
●
●●●
●●
●
●
●
●
●●
●●● ●● ●
●●●
●
● ● ●
●●●
●
●
●
●●
● ●
●
●●
●●
●
●●●
●●
●
●●
●
●●●●
●
●
●
●
●● ●
● ●●
●●●
●
●
● ●● ●
● ●●●●●● ●●
● ●●●
●
●
● ● ●●● ●●
●● ●
●
●● ●
●
● ●
● ● ●●
● ●●●● ●
●
●●
●●● ●
● ●
●
●●
●●
●●●
●● ●●
●●●●●
●
●
●
●
●●●● ●●
●
●
●
●
●
●
●
● ●
●
●
●
●
● ●●● ●●●
●●●
●●●●●
●
●
●
●
●●●
●
●●
●
●●● ●●
●●
●
●
●●●
●
●●
●●
● ●
●●● ● ● ●●
●
●
●
●
●●
●
●
●●●
● ●●
●
●
● ●●
●
● ●
●
●●●
●
●● ●
●● ●
●
●●●
● ●
●● ● ●
●●●●
●●●
●●●● ●
●●●
●
●
●
●●
●
● ●●●●●
●●●●●●
●●
●
●● ●●●●
●●●●● ● ●
●● ●●
● ●●
●●●●●●
●●● ●●
● ●●●●
●
2030405060 102030405060 708090100
110 90100110120130 5.56.06.57.07.57 8 9 101112
age
DEXfat
waistcirc
hipcirc elbowbreadthkneebreadth
F IGURE 1 – Pr´esentation graphique du jeu de donn´ees
> qplot(donnees$waistcirc,donnees$DEXfat,
xlab="Tour de taille",
ylab="Mesure de graisse corporelle",
geom = c("point", "smooth","line"))
Notez que la fonction qplot permet de rajouter sur le graphique des informations suppl´ementaires comme une courbe
liss´ee. Nous constatons que les points semblent s’allonger grossi`erement autour d’une droite. En revanche, il n’existe aucune
droite (ou, autrement dit, aucun couple (β0 , β)) telle que tous les points appartiennent a` cette droite. Le mod`ele propos´e
dans l’´equation (1) n’est donc pas le bon. Pour corriger le mod`ele pr´ec´edent, nous allons eˆ tre oblig´e de consid´erer que les
donn´ees 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´eatoires de moyenne nulle (ou e´ carts a` la droite de r´egression), et posons le
mod`ele classique de r´egression lin´eaire a` une variable :
y = β0 + β1 x1 + ε.
3
(2)
●
●
Mesure de graisse corporelle
60
●
●
●
●
●● ●
●
●●
40
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
● ●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
20
●
●
●
●
●
●
●
●
●
●
●
70
80
90
100
110
Tour de taille
F IGURE 2 – Mesure de masse corporelle en fonction du tour de taille
2.1
Hypoth`eses relatives au mod`ele lin´eaire
Plusieurs hypoth`eses sont n´ecessaires afin d’obtenir de bonnes propri´et´es des estimateurs (βˆ0 , βˆ1 ) des param`etres du
mod`ele (estimateurs des param`etres sans biais et de variance minimale, par exemple). Nous distinguons deux types d’hypoth`eses : celles que nous appellerons explicites portent sur les termes d’erreur, et celles que nous appellerons implicites
sont directement li´ees a` l’´equation du mod`ele (´equation (??).
Les hypoth`eses explicites, c’est-`a-dire celles qui portent sur les termes d’erreur εi , sont au nombre de trois :
— Ils sont de variance constante, not´ee σ 2 , c’est l’hypoth`ese d’homosc´edasticit´e : en particulier, les erreurs ne sont
pas d´ependantes de la variable exog`ene x1 .
— Ils suivent une loi normale de moyenne nulle et de variance σ 2 .
— Ils sont ind´ependants.
` ces hypoth`eses sur le terme d’erreur, nous devons ajouter deux hypoth`eses suppl´ementaires, qui sont implicites au
A
mod`ele :
— La relation entre la variable exog`ene x1 et la variable endog`ene y est lin´eaire. En particulier, il faudra se m´efier des
relations non-lin´eaires (relation quadratique, exponentielle ou logarithmique par exemple) et des ruptures de pentes.
Nous pr´eciserons ce dernier point dans le paragraphe concern´e.
— La variable exog`ene x1 est mesur´ee sans erreur. En effet, le mod`ele d´ecrit dans l’´equation (2) suppose que la variable
x1 est fixe. Dans la conception originelle du mod`ele lin´eaire, la variable y est e´ galement suppos´ee eˆ tre mesur´ee sans
erreur car le terme al´eatoire ne repr´esente que le d´efaut d’ajustement.
La premi`ere e´ tape de notre travail consiste maintenat a` tester ces hypoth`eses.
2.1.1
V´erification de la condition de lin´earit´e
Le test de corr´elation lin´eaire
4
La premi`ere chose a` faire ici est de tracer la variable r´eponse en fonction de la variable explicative, si cela n’a pas encore
e´ t´e fait (Figure 2). La corr´elation lin´eaire peut eˆ tre calcul´ee grˆace a` la fonction cor :
> cor(donnees$waistcirc,donnees$DEXfat)
[1] 0.8986535
Nous rappelons que la corr´elation lin´eaire varie entre -1 et 1. Lorsque la corr´elation vaut 1, elle indique une corr´elation
positive parfaite entre les donn´ees ; les donn´ees sont parfaitement align´ees le long d’une droite dont le cœfficient directeur
est positif. Lorsqu’elle vaut -1, elle indique une corr´elation n´egative parfaite entre les donn´ees ; ces derni`eres sont alors
parfaitement align´ees le long d’une droite dont le cœfficient directeur est n´egatif.
Attention : si les variables dont nous calculons la corr´elation sont ind´ependantes les unes par apport aux autres, alors le
cœfficient de corr´elation lin´eaire vaudra 0. En revanche, la r´eciproque n’est pas vraie. Regardons l’exemple suivant :
>
>
>
>
#cette commande vous permettra d'obtenir exactement les mˆ
emes r´
esultats
set.seed(1)
exemple<-rnorm(1000,0,1)
cor(exemple,exempleˆ2)
[1] -0.02948134
La corr´elation quadratique entre le vecteur exemple et son carr´e est parfaite ; cependant, la corr´elation lin´eaire entre
les deux vecteurs est proche de z´ero. Dans la Figure 3, nous avons repr´esent´e le vecteur exemple2 en fonction du vecteur
exemple et nous avons ajout´e la droite de r´egression lin´eaire. Le d´efaut de lin´earit´e peut conduire a` une interpr´etation
erronn´ee des r´esultats obtenus. Dans le cas de cet exemple, la Figure 3 montre clairement le d´efaut de lin´earit´e. Voil`a la
commande pour tracer la Figure 3 :
> qplot(exemple,exempleˆ2,xlab="exemple",ylab="exempleˆ2",geom=("point"))+
geom_smooth(method='lm')
Il est possible de tester si la corr´elation observ´ee est significativement diff´erente de 0 ou non. Plus pr´ecis´ement, voici les
hypoth`eses du test :
H0 : la corr´elation lin´eaire entre les deux variables est nulle,
contre
H1 : la corr´elation lin´eaire entre les deux variables est diff´erente de z´ero.
Ce test repose sur la bi-normalit´e des donn´ees. Attention : la bi-normalit´e est une condition plus forte que la normalit´e
de la premi`ere variable combin´ee a` la normalit´e de la deuxi`eme variable. Pour tester la bi-normalit´e, nous allons faire
appel a` la fonction mshapiro.test du package mvnormtest qui effectue le test de Shapiro-Wilk multidimensionnel.
Comme pour le test unidimensionnel, l’hypoth`ese nulle de ce test est la multinormalit´e des donn´ees tandis que l’hypoth`ese
alternative est la non-multinormalit´e. Avec R, nous pouvons donc effectuer ce test :
>
>
>
>
#Si le package n'est pas encore install´
e
#install.packages("mvnormtest")
library(mvnormtest)
mshapiro.test(rbind(donnees$waistcirc,donnees$DEXfat))
Shapiro-Wilk normality test
data: Z
W = 0.9527, p-value = 0.009369
5
15
●
●
●
0.3
●
●
●
●
10
●
●
●
exemple^2
●
●
●
●
●
● ●
●
0.2
●
●●
●● ●
●
y
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
5
0
−2
0
2
●
●
●
●
● ●●
● ●●
●
0.1
0.0
4
●●
● ●
●●
●
●
● ●
●●
●
●●
●●
●●
● ●
● ●●
●
●
●
●
●
● ● ●
●
●
●
●
● ●
●
●● ● ●
●●
●
●
●●
●
● ●
●● ●
●
●●● ●
●●●
●●
● ●
●
0.0
exemple
0.1
0.2
0.3
x
F IGURE 3 – Une corr´elation nulle n’implique pas qu’il
n’y ait aucun lien entre les variables.
F IGURE 4 – Les donn´ees ne suivent pas une loi binormale
mais l’hypoth`ese de lin´earit´e est v´erifi´ee !
La p-valeur e´ tant inf´erieure au seuil α = 0.05, nous rejetons l’hypoth`ese nulle et acceptons l’hypoth`ese alternative de
non-binormalit´e. En cons´equence, nous ne pouvons pas faire le test sur le cœfficient de corr´elation. Si la p-valeur avait e´ t´e
sup´erieure au seuil α = 0.05 nous aurions pu analyser la p-valeur retourn´ee par la fonction cor.test de R.
Test de lin´earit´e bas´e sur l’anova
Le fait que les donn´ees ne suivent pas une loi bi-normale ne pr´esume en rien de la lin´earit´e des donn´ees, comme le
montre l’exemple suivant, dans lequel nous simulons un mod`ele lin´eaire dont la variable explicative est g´en´er´e grˆace a` une
distribution exponentielle :
>
>
>
>
>
>
set.seed(10)
x<-rexp(100,10)
erreur<-rnorm(100,0,10ˆ-2)
y<-x+erreur
qplot(x,y)
mshapiro.test(rbind(exemple,exemple+erreur))
Shapiro-Wilk normality test
data: Z
W = 0.9985, p-value = 0.5718
Le test de binormalit´e nous ayant conduit a` une impasse, et les donn´ees e´ tant visiblement align´ees, nous allons employer une autre strat´egie. Pour la mettre en œuvre, nous devons d’abord discr´etiser la variable r´eponse waistcirc. Nous
choisissons de faire 5 cat´egories comme suit :
>
>
>
>
>
library(arules)
waist_fact<- discretize(donnees$waistcirc,method="frequency",5)
waist_fact<-as.numeric(waist_fact)
nb_levels<-length(unique(waist_fact))
for(i in 1:nb_levels){
6
indice<-which(i==waist_fact)
waist_fact[indice]<-round(mean(donnees$waistcirc[indice]))
}
> qplot(as.factor(waist_fact),donnees$DEXfat)+
geom_boxplot(outlier.colour = "green",notch=TRUE,
fill = "purple", colour = "#3366FF")
●
●
60
50
donnees$DEXfat
●
●
40
30
●
20
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
10
70
79
86
98
110
as.factor(waist_fact)
F IGURE 5 – Discr´etisation de la variable explicative.
Nous avons cr´ee´ une nouvelle variable, waist fact qui comporte 5 classes. Chaque classe est repr´esent´ee par la valeur moyenne des individus qui la compose. En consid´erant la nouvelle variable tantˆot comme un facteur, tantˆot comme un
vecteur quantitatif, nous allons pouvoir tester la lin´earit´e.
Dans ce cas (c’est-`a-dire quand nous avons plusieurs observations pour chaque niveau de la variable r´eponse), la
r´egression lin´eaire peut eˆ tre vue comme une simplification de l’analyse de la variance. En effet, dans l’analyse de la variance, chaque niveau poss`ede son propre param`etre. Dans la r´egression, les niveaux sont param´etr´es par une droite ; ils ont
donc moins de libert´e. Proc´edons maintenant l’analyse de variance et l’analyse de la variance de la r´egression lin´eaire :
> anov<-aov(donnees$DEXfat˜as.factor(waist_fact))
> anova(anov)
Analysis of Variance Table
Response: donnees$DEXfat
Df Sum Sq Mean Sq F value
Pr(>F)
as.factor(waist_fact) 4
6616 1654.00 56.857 < 2.2e-16 ***
Residuals
66
1920
29.09
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> droite<-lm(donnees$DEXfat˜waist_fact)
> anova(droite)
Analysis of Variance Table
7
Response: donnees$DEXfat
Df Sum Sq Mean Sq F value
Pr(>F)
waist_fact 1 6613.8 6613.8 237.41 < 2.2e-16 ***
Residuals 69 1922.2
27.9
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Les deux tableaux obtenus se ressemblent beaucoup, mais refl`etent deux analyses bien diff´erentes.
La premi`ere analyse est l’analyse de la variance classique, o`u la variable waist fact est consid´er´e comme un facteur
comprenant 5 niveaux. Le nombre de degr´e de libert´e associ´e au facteur est 5 − 1 = 4.
La deuxi`eme analyse o`u waist fact est consid´er´e comme quantitatif. C’est l’analyse de la variance de la r´egression.
Le nombre de degr´e de libert´e correspondant a` la variable explicative est 1.
Les deux tableaux montre que l’anova a un meilleur pouvoir explicatif que la r´egression. La somme des carr´es li´ee au
facteur est plus grande dans le cas de l’anova que de la r´egression. La Figure 6 vous aidera a` comprendre ce que nous venons
d’´ecrire :
> 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"))
●
●
60
50
●
●
●
donnees$DEXfat
●
●
40
●
●
●
●
●
●
30
●
20
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
Regression
ANOVA
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
10
70
80
90
100
110
waist_fact
F IGURE 6 – Anova contre r´egression.
´
Ecrivons
maintenant l’´egalit´e de la somme des carr´es pour l’analyse de la variance. Nous avons :
SCT = SCf + SCR ,
8
o`u SCT est la somme des carr´es totale, SCf est la somme des carr´es du facteur (ou encore, somme des carr´es intergroupes) et SCR est la somme des carr´es r´esiduelles (ou encore, somme des carr´es intra-groupes). La quantit´e SCf contient
en r´ealit´e deux e´ l´ements distincts : elle contient la variabilit´e li´ee a` la r´egression lin´eaire, et la variabilit´e qui n’est pas li´ee
a` la r´egression lin´eaire SCl et que nous appelons variabilit´e non-lin´eaire SCnl . Nous pouvons alors r´ee´ crire l’´egalit´e de la
somme des carr´es :
SCT = SCl + SCnl + SCR .
Nous aboutissons au tableau de l’analyse de la variance suivant :
lin´eaire
non-lin´eaire
r´esiduelle
totale
SC
6614
2
1920
8536
ddl
1
3
66
70
CM
6614
0.67
29
Fobs
228
0.03
p-valeur
0
0.99
Les p-valeurs ont e´ t´e obtenues par la commande :
> 1-pf(228,1,66)
[1] 0
> 1-pf(0.03,3,66)
[1] 0.9929393
Pour pouvoir les interpr´eter, il faut v´erifier 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 e´ tant plus grandes que 0.05, nous d´ecidons de garder les hypoth`eses nulles des deux tests qui sont
la normalit´e des r´esidus et l’homosc´edasticit´e. Nous pouvons maintenant interpr´eter le tableau de l’anova que nous venons
d’´etablir. Les deux p-valeurs correspondent aux deux tests suivants (donn´es dans l’ordre du tableau) :
H0 : il n’existe pas de relation lin´eaire,
contre
H1 : il existe une relation lin´eaire.
et le deuxi`eme test :
9
H0 : le mod`ele s’´ecrit β0 + β1 x1 ou encore il n’existe pas de relation non-lin´eaire,
contre
H1 : le mod`ele ne s’´ecrit pas β0 + β1 x1 ou encore il existe une relation non-lin´eaire.
La p-valeur du premier test est 0, et nous rejetons donc l’hypoth`ese nulle et d´ecidons qu’il existe une partie lin´eaire.
Par ailleurs, la p-valeur du deuxi`eme test est de 0.99, nous gardons donc l’hypoth`ese nulle, et d´ecidons que le mod`ele
s’´ecrit uniquement sous la forme d’une droite affine. Nous pouvons donc, au vu de ces deux tests, d´ecider de la lin´earit´e des
donn´ees.
Le test de Rainbow
Le test de Rainbow permet e´ galement de tester la lin´earit´e des donn´ees. L’id´ee de ce test est de consid´erer que, quand
bien mˆeme les donn´ees ne seraient pas lin´eaires une sous-partie de ces donn´ees peut eˆ tre lin´eaire. Ce test a pour hypoth`ese
nulle la lin´earit´e des donn´ees, contre l’hypoth`ese alternative de non-lin´earit´e des donn´ees. Ce test est fourni par le package
lmtest :
> library(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 e´ tant sup´erieure a` 0.05, nous d´ecidons de ne pas rejeter l’hypoth`ese nulle, et donc, nous d´ecidons de garder
l’hypoth`ese de lin´earit´e de donn´ees.
2.1.2
Les variables sont mesur´ees sans erreur
Il n’existe pas de mani`ere simple de tester si les variables sont mesur´ees sans erreur. Cependant, nous verrons dans la
partie concernant les diagnostics de la r´egression, que nous v´erifirons si certains points ne jouent pas un trop grand rˆole
dans la r´egression. Ce qu’il faut savoir, c’est que la pr´esence d’erreur de mesure conduit a` une sous-estimation du lien de
lin´earit´e. Nous allons mesurer ce lien de lin´earit´e grˆace a` la corr´elation lin´eaire.
>
>
>
>
>
>
>
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.9987345
> cor(y, x_bruite_1)
[1] 0.9681921
> cor(y, x_bruite_2)
[1] 0.88846
> cor(y, x_bruite_3)
10
[1] 0.7543304
La corr´elation diminue lorsque le niveau du bruit (ici, repr´esent´e par l’´ecart type de la loi normale qui augmente)
augmente.
2.1.3
Tester les hypoth`eses implicites
Les hypoth`eses implicites, comme nous l’avons vu, portent sur les termes d’erreur. Pour ce faire, nous devons d’abord
r´ecup´erer dans R le vecteur des r´esidus.
> droite<-lm(DEXfat˜waistcirc,data=donnees)
> residus<-residuals(droite)
En R, lm est la fonction qui permet d’ajuster un mod`ele lin´eaire. La fonction residuals permet de r´ecup´erer les
valeurs r´esiduelles, c’est-`a-dire :
resi = yi − yˆi ,
o`u yˆi = βˆ0 + βˆ1 x1i est la valeur ajust´ee de yi .
Ind´ependance
L’ind´ependance des r´esidus doit eˆ tre, a` ce stade, diagnostiqu´ee en fonction des connaissances que nous avons sur le jeu
de donn´ees. Dans notre cas, nous la supposerons v´erifi´ee. L’analyse des r´esidus dans la partie des diagnostics pourra nous
fournir quelques indications suppl´ementaires.
Cependant, si une forme de d´ependance est soupc¸onn´ee dans les donn´ees, certains tests sp´ecifiques peuvent eˆ tre mis
en place. En particulier, si l’on soupc¸onne une autocorr´elation des erreurs (ce qui peut arriver si les donn´ees sont mesur´ees
temporellement), il existe le test de Breusch-Godfrey, qui peut eˆ tre r´ealis´e a` partir de la commande bgtest du package
lmtest.
Normalit´e
Nous effectuons le test de Shapiro-Wilk, dont l’hypoth`ese nulle est la normalit´e des donn´ees et l’hypoth`ese alternative
la non-normalit´e des donn´ees :
> shapiro.test(residus)
Shapiro-Wilk normality test
data: residus
W = 0.9712, p-value = 0.1016
La p-valeur de ce test e´ tant plus grande que 0.05, nous d´ecidons de ne pas rejeter l’hypoth`ese nulle, et de fait, de d´ecider
que les r´esidus suivent bien une loi normale. Ce choix est fait avec un risque de seconde esp`ece que nous ne calculerons pas
ici.
Homog´en´eit´e des variances
L’homog´en´eit´e des variances peut eˆ tre test´ee grˆace au test de Breusch-Pagan. Il a pour hypoth`ese nulle l’homosc´edasticit´e
et pour hypoth`ese alternative l’h´et´erosc´edasticit´e. Nous utilsons la fonction bptest du package lmtest.
> library(lmtest)
> bptest(droite)
11
studentized Breusch-Pagan test for homoscedasticity
data: droite
BP = 3.1948, df = 1, p-value = 0.07387
La p-valeur e´ tant sup´erieure a` 0.05, nous d´ecidons de garder l’hypoth`ese nulle d’homosc´edasticit´e. Un autre test
e´ quivalent est le test de White, utilisable par la fonction white.test du package bstats ; les hypoth`eses nulle et
alternative sont les mˆeme que pour le test de Breusch-Pagan :
> library(bstats)
> white.test(droite)
White test for constant variance
data:
White = 3.721, df = 2, p-value = 0.1556
La p-valeur e´ tant sup´erieure a` 0.05, nous parvenons a` la mˆeme conclusion et gardons l’hypoth`ese d’homosc´edasticit´e.
Cependant la partie des diagnostics nous permettra e´ galement de v´erifier cette hypoth`ese.
2.2
R´egression lin´eaire et tests
Comme nous l’avons d´ej`a vu, pour appliquer la r´egression lin´eaire nous devons faire :
> droite<-lm(DEXfat˜waistcirc,data=donnees)
La fonction summary permet d’avoir toutes les informations essentielles sur la r´egression :
> 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:
F-statistic: 289.6 on 1 and 69 DF, p-value: < 2.2e-16
0.8048
ˆ 0
Analysons la sortie. Dans la partie cœfficient, nous trouvons deux lignes : l’intercept, qui correspond a` notre beta
ˆ
et waistcirc qui correspond au cœfficient de la variable explicative β1 . La premi`ere colonne, estimate, donne les
estimations ponctuelles pour ces deux estimateurs. Nous pouvons les retrouver grˆace a` la fonction coef :
> coef(droite)
(Intercept)
-31.0315836
waistcirc
0.7073954
12
La colonne Std. Error donne l’´ecart-type pour chacun des estimateurs. Les colonnes suivantes correspondent alors
aux deux tests β0 = 0 contre β0 6= 0 et β1 = 0 contre β1 6= 0. La colonne t value donne la statistique de test, tandis que
la colonne Pr(>|t|) donne la p-valeur associ´ee. Nous avons 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´ee) qui repr´esente la propotion de variabilit´e expliqu´ee par le mod`ele,
— La statistique F de l’analyse de la variance de la r´egression, elle permet de tester la significativit´e globale du mod`ele.
Elle peut e´ galement eˆ tre obtenue de la mani`ere suivante :
> anova(droite)
Analysis of Variance Table
Response: DEXfat
Df Sum Sq Mean Sq F value
Pr(>F)
waistcirc 1 6893.5 6893.5 289.59 < 2.2e-16 ***
Residuals 69 1642.5
23.8
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Comme nous avons v´erifi´e les conditions d’application de la r´egression lin´eaire, nous pouvons faire le test suivant :
H 0 : β1 = 0
contre
H1 : β1 6= 0.
La p-valeur pour ce test e´ tant inf´erieure a` 0.05, nous rejetons l’hypoth`ese nulle et acceptons l’hypoth`ese alternative
β1 6= 0. La variable waistcirc a donc un effet lin´eaire significatif sur la variable DEXfat.
Nous pouvons obtenir des intervalles de confiance pour les param`etres :
> confint(droite)
2.5 %
97.5 %
(Intercept) -38.3696199 -23.6935473
waistcirc
0.6244669
0.7903239
De la mˆeme mani`ere, nous pouvons obtenir des intervalles de confiance pour les valeurs ajust´ees yˆi :
> pred<-predict(droite,interval="confidence")
> head(pred)
ind
ind
ind
ind
ind
ind
1
2
3
4
5
6
fit
39.70795
39.35426
36.87837
19.90088
32.28030
28.03593
lwr
38.14941
37.82324
35.52008
18.17992
31.11191
26.83675
upr
41.26650
40.88528
38.23667
21.62185
33.44870
29.23511
Maintenant, nous pouvons mettre toutes ces informations sur un graphique (Figure 7) 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")
13
●
●
60
●
50
●●
donnees$DEXfat
●
●
●●
40
●
●
30
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●● ●
●
● ●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
20
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●● ●
●
●
●
●
●●
●
●
●
●● ●●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
10
70
80
90
100
110
donnees$waistcirc
F IGURE 7 – La droite de r´egression, avec son intervalle de confiance, et les valeurs ajust´ees.
2.3
Pr´ediction en r´egression lin´eaire
Supposons maintenant que nous disposions de nouveaux individus pour lesquels nous aurions m´esur´e leur tour de taille.
Cr´eeons articiellement un tel vecteur :
> waist_nouv<-c(72.1,90.4,100,111.3)
Nous aimerions savoir, compte tenu de l’analyse de r´egression lin´eaire faite pr´ec´edemment, quelles sont les valeurs
probables que peuvent prendre les mesures de graisse corporelle pour ces individus. Ceci peut eˆ tre fait grˆace a` la fonction
predict avec l’argument newdata. Par ailleurs, l’argument interval permet d’obtenir l’interval de pr´ediction :
> predict(droite,newdata=data.frame(waistcirc=waist_nouv),interval="prediction")
1
2
3
4
2.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
Diagnostics de la r´egression lin´eaire
Vous avez sans doute not´e que la plupart des tests servant a` v´erifier les conditions d’application du mod`ele ont conduit a`
la non-rejection de l’hypoth`ese nulle. Les d´ecisions que nous avons alors prises ont alors e´ t´e faite avec un risque de seconde
esp`ece que nous ne connaissons pas. Par cons´equent, il n’est pas inutile d’effectuer quelques v´erifications suppl´ementaires.
De plus les diagnostics vont nous permettre de d´etecter des observations aberrantes, et attirer notre attention sur de
possibles probl`emes dans le jeu de donn´ees. C’est donc une e´ tape indispensable.
14
2.4.1
Graphe des r´esidus studentis´es
Nous allons dans ce paragraphe e´ tudier le graphique des r´esidus studentis´es. Les r´esidus, mˆeme sous l’hypoth`ese d’homosc´edasticit´e des erreurs, n’ont pas la mˆeme variance ; ils ne sont donc pas directement comparables. Les r´esidus studentis´es permettent de r´epondre a` cette probl´ematique. Ils sont obtenus de la mani`ere suivante :
> library(MASS)
> residus_stud<-studres(droite)
Nous trac¸ons alors le graphique des r´esidus studentis´ees en fonction des valeurs ajust´ees (Figure 8) :
> 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)
ind 41
●
4.1
4
ind 48
●
2.3
2
residus_stud
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
● ● ●●
●
●
●●
●
0
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
−2
ind 55
●
−2.7
20
30
40
50
fitted(droite)
F IGURE 8 – R´esidus studentis´es contre valeurs ajust´ees.
D’abord, nous pouvons consid´erer que les observations dont les r´esidus studentis´es sont sup´erieures a` 2 en valeur absolue sont suspectes. Dans notre cas nous en avons trois. Nous y reviendrons plus tard.
Une chose importante est d’´etudier la forme du nuage de points, afin de d´etecter des probl`emes de non-lin´earit´e ou
d’h´et´erog´en´eit´e des variances. Pour comparaison, nous produisons les cas les plus classiques dans la Figure 9, et dont le
code est ci-dessous :
>
>
>
>
>
>
library(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)
15
60
●
●
●
2
●
●
rnorm(50)
●
●● ●
1
●
●
● ●
●
●●
●
●
●
●
0
●
● ●
●
●
●
●
● ●●
●
●
●●
●
●
● ●
●
●
●
● ●
●
●●
−1
(1:50) * rnorm(50)
●
●
●
●
●
● ●
30
●
●
●
●●
●
●● ●● ●
●
●
● ●
●●
0
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●●
●
●
−30
●
●
●
●
●
●
●
●
●
−60
●
−2
0
10
20
30
40
50
●
0
10
20
sqrt((1:50)) * rnorm(50)
10
●
●
●●
5
●
0
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●●
●●●
−5
●
●
●
●
●
●
−10
●
0
10
20
30
40
50
1:50
cos((1:50) * pi/25) + rnorm(50)
1:50
30
40
50
●
3
●
●
2
●●
●
● ●
●
1
●
●
●
●
●
●
●
●
●
●
●
●
● ● ●●
−1
●
●
●
●
0
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
−2
●
●
●
0
10
20
1:50
30
40
50
1:50
F IGURE 9 – Diff´erents cas pour le graphique des r´esidus.
En haut a` droite, c’est la situation ”normale”. Les deux graphiques suivants pr´esentent un cas d’h´et´erosc´edasticit´e, plus
marqu´e en haut a` droite qu’en bas a` gauche. Cele se caract´erise par des formes d’entonnoir ou de diabolo, par exemple. Le
dernier graphique pr´esente un cas de non lin´earit´e.
Dans notre cas, nous pouvons suspecter un l´eger probl`eme d’h´et´etosc´edascit´e.
2.5
Valeurs potentiellement influentes
Pour cela, nous allons calculer ce que nous appelons les hatvalues. Ces valeurs sont li´ees a` la distance qui s´epare
l’observation de la variable explicative avec la moyenne des observation. Il faut les comparer avec la valeur 4/N , avec N le
nombre d’observations. Dans notre cas la valeur de r´ef´erence 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)
16
0.08
ind 18
●
0.08
ind 45
●
0.08
ind 47 ind 48
●●
0.07 0.07
ind 46
●
0.06
●
0.06
hv
●
●● ●
●●
●
0.04
●
●
●
●
●
●
●
● ●
●
●
● ●
●
●
●
●
●
●
0.02
●
●
●
●
●
●●
●
●
●
●
●
0
●
●
●
●
●
●
●
●
●
●
●● ●●
●
●
●
●
20
●
●
●
●
●
● ●
●●
40
60
indice
F IGURE 10 – D´etection des valeurs aberrantes.
La Figure 10 indique la pr´esence de 5 individus qui d´epassent le seuil et qui sont donc potentiellement influentes de part
leur e´ loignement de la moyenne des variables explicatives.
2.6
Distance de Cook
La distance de Cook permet de prendre en compte l’´eloignement par rapport a` la moyenne des variables explicatives et
l’´eloignement par rapport a` la droite de r´egression. Les observations dont la distance de Cook est sup´erieure a` 4/N doivent
retenir notre attention.
> 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)
2.7
Diagnostic final
Nous construisons un graphique permettant de visualiser tous les points r´ep´er´es lors de l’´etape de diagnostic.
> 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"))
17
ind 41
●
0.29
0.3
0.2
cd
ind 48
●
0.18
0.1
ind 45
●
0.06● ●
ind 14
●
0.06
●
0.0
● ●
●● ●●●
●
●
●
●
●●● ●
0
●
● ●
●
●
●
●
●● ● ●
●● ● ● ● ● ●
● ●● ●
● ●
●
20
●
●● ●
●●
●
●
●
●●●●
●
● ● ●●●
40
●
●
●
●
●
60
indice
F IGURE 11 – Distance de Cook.
●
60
●
DEXfat
50
40
30
20
10
●●
●
●
●
●
●
●
●● ●
●
● ●●
●
●●
●
●●
●
●
● ●
●
●● ● ●
●●
●● ●
●
●
●●
●
●
●
●● ●
●
● ●
●● ● ●
●
●
●
●●
● ● ● ●
●
●
●
●
●
70
80
90
100
● Cook ou stud.res
● Cook ou stud.res et hi
● normal
● hi
110
waistcirc
F IGURE 12 – Diagnostic final.
18