Vous êtes sur la page 1sur 9

Modèles linéaires généralisés - Régression logistique

M2 STD – Laurent Léger

Exemple – chd

Les données proviennent d’une étude réalisée sur 100 individus pour évaluer l’effet de l’âge
(variable AGE) sur la présence d’une pathologie (variable CHD, CHD= 1 si présence ,
CHD=0 si absence ). L’objectif est d’analyser la liaison CHD - AGE x en utilisant un modèle
de régression logistique.

> chd <- read.table("chd.txt", head=TRUE,row.names=1)


> chd
AGE CHD
1 20 0
2 23 0
3 24 0
….
100 69 1

> attach(chd)

- Graphique xoy , CHD en fonction de AGE et boxplot


> boxplot(AGE~CHD,xlab="CHD",ylab="AGE")
> plot(AGE,CHD)

Le graphique montre qu’il est difficile de modéliser les données brutes. La variabilité de la
variable CHD est élevée pour tout âge. On peut pour réduire cette variabilité découper la
variable AGE en classes et déterminer la proportion ou fréquence d’individus malades par
classes d’âge (données dites agrégées par opposition aux données individuelles).

> x <- c(19.999,29,34,39,44,49,54,59,70)


> mid <- c((x[2:9]+x[1:8])/2)
> GRAGE <- cut(AGE, breaks=x)
> chd.f <- tapply(CHD, GRAGE, mean)
> chd.f
(20,29] (29,34] (34,39] (39,44] (44,49] (49,54] (54,59] (59,70]
0.1000000 0.1333333 0.2500000 0.3333333 0.4615385 0.6250000 0.7647059 0.8000000

On note ici que la proportion d’individus malades augmente avec l’âge.

1
On représente graphiquement les proportions de malades par classes d’âge.
> plot(AGE,CHD)
> points(mid, chd.f, col="red", pch=3)

L’interprétation est également plus simple que la précédente. On peut observer :


- la relation positive entre proportion de malades et classe d’âges
- une relation non linéaire – courbe de liaison de forme sigmoide (courbe en S)

Fonction logistique
La liaison entre proportion de malades et classes d’âge peut être modélisée par une fonction
de ce type dite logistique de la forme :

Y= exp(b.X) / (1+exp(b.X))

On trace la fonction correspondante :


> plot(seq(-5,5,.5),1/(1+exp(-seq(-5,5,.5))))
> lines(seq(-5,5,.5),1/(1+exp(-seq(-5,5,.5))))

Ce modèle statistique dit de régression logistique est adapté lorsqu’on souhaite modéliser une
variable Y de type binaire (présence – absence) . On modélise en réalité une probabilité (ici dans
cet exemple la probabilité la pathologie) en fonction de la variable explicative âge. Ce modèle fait
partie de la classe des modèles dits linéaires généralisés.

2
Régression logistique

On exécute la régression logistique de la réponse y sur x avec la fonction glm( ) en spécifiant la


famille binomial dans les arguments:
> chd.glm <- glm(CHD ~ AGE, family=binomial(link=logit))

L’instruction names permet d’accéder aux éléments de la liste résultats : > names(chd.glm)

Les résultats du modèle , coefficients estimés, valeurs des critères de vraisemblance et AIC sont
affichés par l’instruction summary:
> summary(chd.glm)
Call: glm(formula = CHD ~ AGE, family = binomial(link = logit))

Deviance Residuals:
Min 1Q Median 3Q Max
-1.9718 -0.8456 -0.4576 0.8253 2.2859

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -5.30945 1.13365 -4.683 2.82e-06 ***
AGE 0.11092 0.02406 4.610 4.02e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Null deviance: 136.66 on 99 degrees of freedom


Residual deviance: 107.35 on 98 degrees of freedom
AIC: 111.35

Number of Fisher Scoring iterations: 4

La partie "coefficients" du tableau résultats reporte les estimations des coefficients du


modèle, l’écart type de ces estimations et les tests sur ces coefficients.

Estimation des coefficients de régression

Le modèle estimé ou logit g(.) s’écrit :

g(x) = −5.30945 + 0.11092 * AGE

On peut déterminer la probabilité π(x) à un âge donné d’étre malade, par exemple à 60 ans en
calculant :

- le logit estimé (équation de régression)

> c1<- coef(chd.glm)[1]


> c2<- coef(chd.glm)[2]
> logit.pred <-c1 + c2*60

- l’inverse de ce logit π(x)

> pr.pred <- exp(logit.pred)/(1+exp(logit.pred))


> pr.pred
0.7934446

Test sur le coefficient beta de la variable

Le test sur la nullité du coefficient beta de la variable AGE révèle que cette variable est très
significative avec une pvalue=4.02e-06***;on peut conclure que la probabilité de la
pathologie augmente avec l’âge.

3
Risque – odds ratio
Le coefficient beta de la variable AGE correspond au log odds ratio associé à une augmentation
d’une unité de la variable explicative X.

Si X=AGE augmente de 1, le rapport entre la probabilité de maladie et de non maladie sera


modifié d’un facteur multiplicatif égal à exp(beta).

L’odds-ratio vaut ici:


> exp(chd.glm$coef[2])
AGE
1.117307

Le coefficient ordonnée à l’origine correspond à la valeur prédite par le modèle pour une valeur
de la variable explicative égale à 0 (à prendre avec précaution):
> exp(c1)/(1+exp(c1))

Test du rapport de vraisemblance sur le modèle


Les informations nécessaires sont reportées dans la dernière partie du tableau résultats.

Les hypothèses sont :


H0 modèle sans la variable explicative (modèle constant)
H1 modèle avec la variable explicative (le modèle testé)

Le test du rapport de vraisemblance sur la qualité du modèle est basé sur la comparaison des
vraisemblances des modèles emboités. On note la vraisemblance par L (Likelihood) , L0 sous
H0 , L1 sous H1.

La statistique de test qui suit sous l’hypothèse H0 une loi du chi-deux (1 ddl) a pour expression:

Lambda= [- 2*log L0] – [- 2*log L1]

Cette statistique utilise la notion de déviance ; on appelle déviance la quantité -2*logL.

Les valeurs de déviance des deux modèles emboités, modèle avec et sans la variable
explicative sont reportées dans le tableau résultats et valent respectivement pour L0 et L1 :

Null deviance: 136.66 on 99 degrees of freedom


Residual deviance: 107.35 on 98 degrees of freedom

La valeur de la statistique test Lambda=136.66-107.35 =29.3 est très significative;


le modèle est accepté.

Le test précédent peut être obtenu avec l’instruction:


> anova(mod, test="Chisq")

Analysis of Deviance Table


Model: binomial, link: logit

Response: CHD
Terms added sequentially (first to last)

Df Deviance Resid. Df Resid. Dev P(>|Chi|)


NULL 99 136.66
AGE 1 29.31 98 107.35 6.168e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

4
Valeurs estimées par le modèle
Les estimations du logit g(.) et du modèle logistique π(.) s’obtiennent avec les instructions :
> chd.glm$linear.predictors
> chd.glm$fitted.values
1 2 3 4 5
0.04347876 0.05962145 0.06615278 0.07334379 0.07334379
… etc
96 97 98 99 100
0.84271622 0.85686593 0.85686593 0.86993915 0.91246455

On représente le nuage de points initial (données observées) avec les proportions et la courbe
logistique sur le même graphique avec l’instruction lines.

> plot(AGE,CHD)
> points(mid, f.chd, col="red", pch=3)
> lines(AGE, chd.glm$fitted)

ou instructions équivalentes :

> plot(AGE,CHD)
> points(mid, f.chd, col="red", pch=3)
> xp=seq(min(AGE),max(AGE),length=100)
> yp=predict(chd.glm,data.frame(AGE=xp),type="response")
> lines(xp,yp,col="red")

On peut représenter graphiquement l’intervalle de confiance pour la courbe de régression


logistique avec les instructions suivantes :

> plot(AGE,CHD)
> points(mid, f.chd, col="red", pch=3)
> grid <-(20:69) # création des valeurs abcisses x
> se <- predict(chd.glm, data.frame(AGE=grid), se=TRUE)
> gl <- binomial(link=logit) # fonction link utilisée
> lines(grid, gl$linkinv(se$fit))
> lines(grid, gl$linkinv(se$fit-1.96*se$se), col="red", lty=2)
> lines(grid, gl$linkinv(se$fit+1.96*se$se), col="red", lty=2)

Note : la fonction gl$linkinv permet d’obtenir la valeur de π(x) à partir de g(x).

5
Analyse des résidus
L’analyse des résidus doit permettre de :
1. Déterminer les points qui "clochent" dans les données, qui s'écartent fortement des autres
dans l'espace de représentation (points "atypiques").
2. Déterminer les points qui sont mal modélisés (mal expliqués) par la régression logistique.
3. Déterminer les points qui pèsent fortement sur les résultats. Si on les retirait de l'ensemble
d'apprentissage, le modèle obtenu serait très différent (points "influents").

On peut construire plusieurs types de résidus (standardisés), résidus de Pearson ou résidus de


déviance et en faire des représentations graphiques soit en fonction des valeurs estimées ou
prévisions, soit en fonction des variables explicatives.

> res.dev <- residuals(chd.glm,type="deviance")


> res.pear <- residuals(chd.glm,type="pearson")

Graphique - Résidus Déviance ou Pearson en fonction des valeurs estimées


Ce graphique permet de détecter des valeurs aberrantes et ou des structurations suspectes.

> plot(predict(chd.glm),res.dev,
xlab="Fitted values", ylab = "Residuals-Deviance",
ylim = max(abs(res.dev)) * c(-1,1))
> abline(h = 0, lty = 2)

> plot(predict(chd.glm),res.pear,
xlab="Fitted values", ylab = "Residuals-Pearson",
ylim = max(abs(res.pear)) * c(-1,1))
> abline(h = 0, lty = 2)

6
Graphiques - Résidus partiels ~ Variable explicative

On représente les résidus en fonction de chaque variable explicative et on traçe une courbe de
lissage. Si la courbe est linéaire le modèle est correct , si une tendance non linéaire se dégage, il
faut remplacer la variable j par une fonction de cette variable qui suive la tendance observée.

> res.partiels<-resid(chd.glm,type="partial")
> prov<-loess(res.partiels[,"AGE"]~chd$AGE)
> ordre<-order(chd$AGE)
> plot(chd$AGE,res.partiels[,"AGE"],type="p",cex=0.5,xlab="",ylab="")
> matlines(chd$AGE[ordre],predict(prov)[ordre])
> abline(lsfit(chd$AGE,res.partiels[,"AGE"]),lty=2)

7
Script – chd

chd <- read.table("chd.txt", head=TRUE,row.names=1)


chd
attach(chd)

#Représentations graphiques

#Box plot - Distributions de AGE pour les modalités CHD=0-1


boxplot(AGE~CHD,xlab="CHD",ylab="AGE")

#Graphique - CHD en fonction de AGE


plot(AGE,CHD)

#Graphique - Fréquence de CHD par classe d'age en fonction de AGE


x <- c(19.999,29,34,39,44,49,54,59,70)
mid <- c((x[2:9]+x[1:8])/2)
GRAGE <- cut(AGE, breaks=x)
chd.f <- tapply(CHD, GRAGE, mean)
chd.f
data.frame(mid,chd.f)
plot(AGE,CHD)
points(mid, chd.f, col="red", pch=3)

#Fonction logistique
plot(seq(-5,5,.5),1/(1+exp(-seq(-5,5,.5))))
lines(seq(-5,5,.5),1/(1+exp(-seq(-5,5,.5))))

#Régression logistique
chd.glm <- glm(CHD ~ AGE, family=binomial(link=logit))
summary(chd.glm)
names(chd.glm)

#Estimation - Tests sur coefficients - odds ratio


c1<- coef(chd.glm)[1]
c2<- coef(chd.glm)[2]
logit.pred <-c1 + c2*60
pr.pred <- exp(logit.pred)/(1+exp(logit.pred))
pr.pred

#Risque - Odds ratio


exp(chd.glm$coef[2])

#Test du rapport de vraisemblance


anova(chd.glm, test="Chisq")

#Estimation du logit g(x)


chd.glm$linear.predictors

#Valeurs estimées par le modèle π(x)


chd.glm$fitted.values

#Graphique
plot(AGE,CHD)
points(mid, f.chd, col="red", pch=3)
lines(AGE, chd.glm$fitted)

#Graphique identique
plot(AGE,CHD)
points(mid, f.chd, col="red", pch=3)
xp=seq(min(AGE),max(AGE),length=100)
yp=predict(chd.glm,data.frame(AGE=xp),type="response")
8
lines(xp,yp,col="red")
#Graphique - Bandes de confiance
plot(AGE,CHD)
points(mid, f.chd, col="red", pch=3)
grid <-(20:69) # création des valeurs abcisses x
se <- predict(chd.glm, data.frame(AGE=grid), se=TRUE)
gl <- binomial(link=logit) # fonction link utilisée
lines(grid, gl$linkinv(se$fit))
lines(grid, gl$linkinv(se$fit-1.96*se$se), col="red", lty=2)
lines(grid, gl$linkinv(se$fit+1.96*se$se), col="red", lty=2)

#Annexe
x<-seq(25,65,by=0.5)
bmod<-chd.glm$coefficients
y<-exp(bmod[1]+bmod[2]*x)/(1+exp(bmod[1]+bmod[2]*x))
plot(x,y,type="l",xlim=c(25,65),ylim=c(-0.05,1.05))
lines(x,y+0.10)
lines(x,y-0.10)

#Analyse des résidus - Graphiques


#Résidus - Déviance - Pearson
res.dev <- residuals(chd.glm,type="deviance")
#Résidus de Pearson
res.pear <- residuals(chd.glm,type="pearson")

#Graphiques Résidus ~ Prévisions


plot(predict(chd.glm),res.dev,
xlab="Fitted values", ylab = "Residuals-Deviance",
ylim = max(abs(res.dev)) * c(-1,1))
abline(h = 0, lty = 2)

plot(predict(chd.glm),res.pear,
xlab="Fitted values", ylab = "Residuals-Pearson",
ylim = max(abs(res.pear)) * c(-1,1))
abline(h = 0, lty = 2)

#Graphiques Résidus partiels ~ Variable explicative


res.partiels<-resid(chd.glm,type="partial")
prov<-loess(res.partiels[,"AGE"]~chd$AGE)
ordre<-order(chd$AGE)
plot(chd$AGE,res.partiels[,"AGE"],type="p",cex=0.5,xlab="",
ylab="")
matlines(chd$AGE[ordre],predict(prov)[ordre])
abline(lsfit(chd$AGE,res.partiels[,"AGE"]),lty=2)

Vous aimerez peut-être aussi