Académique Documents
Professionnel Documents
Culture Documents
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.
> attach(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).
1
On représente graphiquement les proportions de malades par classes d’âge.
> plot(AGE,CHD)
> points(mid, chd.f, col="red", pch=3)
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))
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
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
On peut déterminer la probabilité π(x) à un âge donné d’étre malade, par exemple à 60 ans en
calculant :
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.
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))
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:
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 :
Response: CHD
Terms added sequentially (first to last)
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")
> 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)
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").
> 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
#Représentations graphiques
#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)
#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)
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)