Você está na página 1de 6

Modèle Linéaire 2017-2018

Régression linéaire multiple en R


Exemple détaillé

Préambule : récupération et mise en forme des données


On utilise la base state de R, que nous mettons en forme.

> data(state)
> stateEU <- data.frame(state.x77, row.names=state.abb)
> attach(stateEU)

Cette base de données comprend les mesures sur 50 pays des Etats-Unis de
• Population population estimée au 1er juillet 1975
• Income revenu par individu (1974)
• Illiteracy illettrisme (1970, pourcentage de la population)
• Life.Exp espérance de vie moyenne (1969-1971)
• Murder taux d’homicide pour 100 000 individus (1976)
• HS Grad pourcentage de diplômés niveau baccalauréat –high-school graduates– (1970)
• Frost] nombre de jours moyens avec des températures inférieures à 0o C dans les
grandes villes (1931-1960)
• Area surface du pays en miles carrés.

1 Sélection de variables
On souhaite expliquer l’espérance de vie Life.Exp en fonction des autres variables. On va
utiliser pour cela une méthode descendante.

> life.lm <- lm(Life.Exp∼ .,data=stateEU)


> summary(life.lm)
Call:
lm(formula = Life.Exp ~ ., data = stateEU)

Residuals:
Min 1Q Median 3Q Max
-1.48895 -0.51232 -0.02747 0.57002 1.49447

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.094e+01 1.748e+00 40.586 < 2e-16 ***
Population 5.180e-05 2.919e-05 1.775 0.0832 .
Income -2.180e-05 2.444e-04 -0.089 0.9293
Illiteracy 3.382e-02 3.663e-01 0.092 0.9269
Murder -3.011e-01 4.662e-02 -6.459 8.68e-08 ***
HS.Grad 4.893e-02 2.332e-02 2.098 0.0420 *

1
Frost -5.735e-03 3.143e-03 -1.825 0.0752 .
Area -7.383e-08 1.668e-06 -0.044 0.9649
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7448 on 42 degrees of freedom


Multiple R-squared: 0.7362, Adjusted R-squared: 0.6922
F-statistic: 16.74 on 7 and 42 DF, p-value: 2.534e-10

Si nous souhaitons minimiser le critère AIC, nous pouvons l’obtenir de la façon suivante :

> extractAIC(life.lm)
[1] 8.00000 -22.18462

(On préférera extractAIC à la fonction AIC qui donne un critère légèrement différent.)
On commence par enlever les variables dont la p-valeur est supérieure à 0.3.

> life.lm <- update(life.lm,.~.-Area-Illiteracy-Income)


> summary(life.lm)
Call:
lm(formula = Life.Exp ~ Population + Murder + HS.Grad + Frost,
data = stateEU)

Residuals:
Min 1Q Median 3Q Max
-1.47095 -0.53464 -0.03701 0.57621 1.50683

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.103e+01 9.529e-01 74.542 < 2e-16 ***
Population 5.014e-05 2.512e-05 1.996 0.05201 .
Murder -3.001e-01 3.661e-02 -8.199 1.77e-10 ***
HS.Grad 4.658e-02 1.483e-02 3.142 0.00297 **
Frost -5.943e-03 2.421e-03 -2.455 0.01802 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7197 on 45 degrees of freedom


Multiple R-squared: 0.736, Adjusted R-squared: 0.7126
F-statistic: 31.37 on 4 and 45 DF, p-value: 1.696e-12
> extractAIC(life.lm)
[1] 5.00000 -28.16123

On constate que l’AIC a bien diminué.


On enlève ensuite la variable dont le coefficient est le moins significatif, ici Population.

> life.lm <- update(life.lm,.~.-Population)


> summary(life.lm)
Call:
lm(formula = Life.Exp ~ Murder + HS.Grad + Frost, data = stateEU)

Residuals:

2
Min 1Q Median 3Q Max
-1.5015 -0.5391 0.1014 0.5921 1.2268

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 71.036379 0.983262 72.246 < 2e-16 ***
Murder -0.283065 0.036731 -7.706 8.04e-10 ***
HS.Grad 0.049949 0.015201 3.286 0.00195 **
Frost -0.006912 0.002447 -2.824 0.00699 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7427 on 46 degrees of freedom


Multiple R-squared: 0.7127, Adjusted R-squared: 0.6939
F-statistic: 38.03 on 3 and 46 DF, p-value: 1.634e-12
> extractAIC(life.lm)
[1] 4.00000 -25.91958
On constate que l’AIC a augmenté (et que l’écart-type estimé des résidus a augmenté : il
vaut 0.7427 contre 0.7197 auparavant). On préfère donc le modèle conservant la variable
Population.
> life.lm <- lm(Life.Exp ∼ Murder + HS.Grad + Frost + Population)
R peut faire ce raisonnement de manière automatisée. Il suffit d’appliquer :
> life.lm <- step(lm(Life.Exp∼ .,data=stateEU), direction="bakward")
Le critère choisi par défaut est alors l’AIC. Il est également possible de choisir les méthodes
"forward" et "both". Ensuite on peut résumer les différentes étapes de la façon suivante :
> life.lm$anova
Step Df Deviance Resid. Df Resid. Dev AIC
1 NA NA 42 23.29714 -22.18462
2 - Area 1 0.001086580 43 23.29822 -24.18229
3 - Illiteracy 1 0.003759832 44 23.30198 -26.17422
4 - Income 1 0.006058246 45 23.30804 -28.16123
On peut également utiliser les fonctions add1 et drop1, non détaillées ici.

Intervalle de prévision.

Supposons que nous disposions des données pour un nouveau pays, par exemple européen.
Nous souhaitons comparer l’espérance de vie estimée avec ce modèle avec l’espérance de
vie observée. L’intervalle de confiance sur la valeur prédite est donné par l’instruction
suivante :
> predict(life.lm,data.frame(Murder=8, HS.Grad=75, Frost=80, Population=4250),
+ interval="prediction",level=0.95)
fit lwr upr
1 71.85724 70.23526 73.47921
Ainsi avec les valeurs ci-dessus, si l’espérance de vie est comprise dans l’intervalle [70.23, 73.48]
il n’y a pas de contradiction avec le modèle.

3
2 Etude des résidus
Représentations graphiques.
On représente les principaux graphiques sur les résidus.

Residuals vs Fitted Normal Q−Q

1.5
HI ● HI ●

Standardized residuals

2

● ● ●● ●


● ● ●● ●
● ●●
0.5

● ● ● ●
Residuals

●●

1

● ●● ●●●●
● ● ●●●
● ● ● ●
● ● ●●
● ● ●
● ● ● ●●

0
● ● ●●●

● ●●●
−0.5


● ● ●
● ●●●
● ● ●
●●
● ●●●●

−1
● ● ● ●
● SC ● ●
●●
● ●●●
−1.5

● SC
ME ●

−2
● ME

69 70 71 72 −2 −1 0 1 2

Fitted values Theoretical Quantiles

Scale−Location Cook's distance

0.4
HI ●
1.5

HI
ME ●
Standardized residuals

● SC ●
0.3
● ●
● ● ● ● ● ●
Cook's distance

● ● ●


1.0

● ● ●
● ● ● ●● ●
● ●
● ●
0.2

●●
● ●
● ● ●● ●
0.5

● ●
0.1

● ● WA
● ●
● ● ME
● ●

0.0

0.0

69 70 71 72 0 10 20 30 40 50

Fitted values Obs. number

Toutes les hypothèses semblent vérifiées : pas de structure dans le premier graphique ni dans
le troisième, pas d’hétéroscédasticité au vu du premier graphique, hypothèse gaussienne
non remise en cause par le QQ-plot et aucun point aberrant d’après la distance de Cook.
On vérifie plus précisément l’hypothèse d’indépendance des résidus. On peut représenter
l’autocorrélation des résidus
> acf(residuals(life.lm),ci=0.99)

Series resid(life.lm)
1.0
0.8
0.6
0.4
ACF

0.2
0.0
−0.2
−0.4

0 5 10 15

Lag

L’hypothèse d’indépendance est cohérente graphiquement, au seuil 0.99. Nous avons choisi
ici d’être peu restrictifs sur l’autocorrélation en prenant un intervalle de confiance de niveau
0.99, mais elle ne serait pas valide avec une confiance de 0.95.

Tests statistiques.
On réalise des test statistiques afin de valider les hypothèses. On teste tout d’abord l’hy-
pothèse de normalité :

4
> shapiro.test(resid(life.lm))

On obtient une p-valeur de 5.25%. On ne rejette pas l’hypothèse de normalité avec un seuil
de 5%.
On teste l’hypothèse de linéarité :

> library(lmtest)
> raintest(life.lm)

On obtient une p-valeur de 39.24%. On ne rejette pas le modèle linéaire.


On teste ensuite l’hypothèse d’homogénéité des variances :

> gqtest(life.lm)

On obtient une p-valeur de 76.72%. L’homogénéité de la variance des résidus n’est pas
rejetée.
On teste également l’indépendance des résidus :

> dwtest(life.lm)

On obtient une p-valeur de 38.54%. L’indépendance des résidus n’est pas rejetée. Attention,
le test de Durbin Wastson teste l’autocorrélation d’ordre 1 et d’autres tests peuvent être
plus adaptés – cf tests du porte-manteau (Box-Pierce, Ljung-Box).
Nous vérifions enfin qu’il n’y a pas de colinéarité forte dans le modèle, c’est-à-dire que les
variables explicatives ne sont pas linéairement dépendantes.

> library(car)
> vif(life.lm)
Population Murder HS.Grad Frost
1.189835 1.727844 1.356791 1.498077

Les valeurs des VIF (Variance Inflation Factors) étant inférieures à 10, les variables ne
présentent pas de forte colinéarité.

5
Bilan

Pour ajuster un modèle linéaire gaussien yi = Xβ + εi


> modele <- lm(y ∼x1+x2+x3) ou > modele <- lm(y ∼. , data=dataframe)
Pour voir les principales statistiques du modèle
> summary(modele)

Pour appliquer une sélection de variables


- Manuellement, avec > modele <- update(modele, .∼.+new.var)
ou > modele <- update(modele ∼ .-var.enlevee) et comparer les résultats
- De manière automatique, par exemple avec
> step(modele, direction="backward")

Pour étudier la validité des hypothèses


• Graphiquement, plot(modele) ou en détail :
- Adéquation et homoscédasticité : plot(fitted(modele),stdres(modele))
- Indépendance : acf(res(modele))
- Normalité : QQ-plot
- Points aberrants : cooks.distance(modele)
• Avec des tests statistiques :
- Adéquation : raintest(modele) dans lmtest
- Homoscédasticité : gqtest(modele) dans lmtest
- Indépendance : dwtest(modele) dans lmtest
- Normalité : shapiro.test(resid(modele))
Seul un test par hypothèses est proposé ici mais d’autres tests sont possibles (et
peuvent être plus adaptés).
Pour étudier la colinéarité des variables explicatives : vif(modele).

Você também pode gostar