Académique Documents
Professionnel Documents
Culture Documents
Ex. Disease
Les données proviennent d’une étude réalisée sur 98 individus tirés aléatoirement dans une
population de référence. L’objectif est d’analyser la relation entre l’apparition d’un
symptome et les caractéristiques de vie des individus en particulier l’âge, le statut socio
économique et le secteur de résidence. L’âge est une variable quantitative en années, le
statut socio-économique est un facteur à trois niveaux (1=élevé, 2=moyen, 3=faible) et le
secteur un facteur à deux niveaux (1=secteur 1, 2=secteur 2). La variable réponse Y est
codée 1 si le symptome est présent, 0 sinon.
> plot(age,maladie)
1
-Régression logistique Y=f(age)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.3712 -0.8485 -0.6730 1.1311 1.8151
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.62437 0.40575 -4.003 6.25e-05 ***
age 0.03183 0.01204 2.644 0.0082 **
---
Null deviance: 122.32 on 97 degrees of freedom
Residual deviance: 114.91 on 96 degrees of freedom
AIC: 118.91
> beta<-coef(m1)
> exp(beta[-1])
age
1.032346
Deviance Residuals:
Min 1Q Median 3Q Max
-1.2435 -0.6095 -0.6095 1.1127 1.8841
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.5892 0.3470 -4.580 4.65e-06 ***
secteur1 1.7434 0.4728 3.687 0.000227 ***
---
Null deviance: 122.32 on 97 degrees of freedom
Residual deviance: 107.53 on 96 degrees of freedom
AIC: 111.53
> beta<-coef(m2)
> exp(beta[-1])
secteur1
5.716667
2
3. Etude liaison maladie – sociostat
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.5390 0.3363 -1.603 0.109
sociostat21 0.2025 0.5334 0.380 0.704
sociostat31 -0.8824 0.5389 -1.637 0.102
> beta<-coef(m3)
> exp(beta[-1])
sociostat21 sociostat31
1.2244898 0.4137931
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.31293 0.64259 -3.599 0.000319 ***
age 0.02975 0.01350 2.203 0.027577 *
secteur1 1.57475 0.50162 3.139 0.001693 **
sociostat21 0.40879 0.59900 0.682 0.494954
sociostat31 -0.30525 0.60413 -0.505 0.613362
---
Null deviance: 122.32 on 97 degrees of freedom
Residual deviance: 101.05 on 93 degrees of freedom
AIC: 111.05
3
> beta<-coef(modelsi)
> exp(beta[-1])
age sociostat21 sociostat31 secteur1
1.0292185 1.1491596 0.6488282 4.7685293
> modelai<-glm(maladie~age+secteur+sociostat2+sociostat3+
+ age*secteur+age*sociostat2+age*sociostat3+
+ secteur*sociostat2+secteur*sociostat3,family=binomial)
> summary(modelai)
Call:
glm(formula = maladie ~ age + secteur + sociostat2 + sociostat3 +
age * secteur + age * sociostat2 + age * sociostat3 + secteur *
sociostat2 + secteur * sociostat3, family = binomial)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.4692 -0.7379 -0.4194 1.0128 2.1734
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.53654 1.14185 -2.221 0.0263 *
age 0.03042 0.03085 0.986 0.3241
secteur1 2.97961 1.24815 2.387 0.0170 *
sociostat21 -2.09593 1.93766 -1.082 0.2794
sociostat31 -0.44411 1.30782 -0.340 0.7342
age:secteur1 -0.03421 0.03093 -1.106 0.2688
age:sociostat21 0.10538 0.05592 1.885 0.0595 .
age:sociostat31 0.01397 0.03161 0.442 0.6586
secteur1:sociostat21 -0.30917 1.44090 -0.215 0.8301
secteur1:sociostat31 -0.73963 1.24892 -0.592 0.5537
---
Null deviance: 122.318 on 97 degrees of freedom
Residual deviance: 93.996 on 88 degrees of freedom
La procédure anova( ) permet de tester pour chaque terme du modèle complet la significativité
de son introduction dans le modèle :
> anova(modelai,modelsi,test="Chisq")
Analysis of Deviance Table
4
6. Sélection de modèles descendante pas à pas - Critère AIC
Une première procédure de sélection descendante est exécutée ; le modèle initial est le modèle
complet avec interaction précédent. La procédure élimine à chaque étape le terme du modèle le
moins significatif. Le critère de choix est le critère d’Akaiké.
> glmc<-modelai
> step(glmc,direction="backward")
Start: AIC=114
maladie ~ age + secteur + sociostat2 + sociostat3 + age * secteur +
age * sociostat2 + age * sociostat3 + secteur * sociostat2 +
secteur * sociostat3
Df Deviance AIC
- secteur:sociostat2 1 94.041 112.04
- age:sociostat3 1 94.190 112.19
- secteur:sociostat3 1 94.349 112.35
- age:secteur 1 95.223 113.22
<none> 93.996 114.00
- age:sociostat2 1 99.246 117.25
Step: AIC=112.04
maladie ~ age + secteur + sociostat2 + sociostat3 + age:secteur +
age:sociostat2 + age:sociostat3 + secteur:sociostat3
Df Deviance AIC
- age:sociostat3 1 94.242 110.24
- secteur:sociostat3 1 94.349 110.35
- age:secteur 1 95.235 111.23
<none> 94.041 112.04
- age:sociostat2 1 99.660 115.66
Step: AIC=110.24
maladie ~ age + secteur + sociostat2 + sociostat3 + age:secteur +
age:sociostat2 + secteur:sociostat3
Df Deviance AIC
- secteur:sociostat3 1 94.638 108.64
- age:secteur 1 96.211 110.21
<none> 94.242 110.24
- age:sociostat2 1 99.735 113.73
Step: AIC=108.64
maladie ~ age + secteur + sociostat2 + sociostat3 + age:secteur +
age:sociostat2
Df Deviance AIC
- sociostat3 1 95.087 107.09
- age:secteur 1 96.484 108.48
<none> 94.638 108.64
- age:sociostat2 1 99.834 111.83
Step: AIC=107.09
maladie ~ age + secteur + sociostat2 + age:secteur + age:sociostat2
Df Deviance AIC
- age:secteur 1 96.794 106.79
<none> 95.087 107.09
- age:sociostat2 1 100.196 110.20
5
Step: AIC=106.79
maladie ~ age + secteur + sociostat2 + age:sociostat2
Df Deviance AIC
<none> 96.794 106.79
- age:sociostat2 1 101.310 109.31
- secteur 1 109.513 117.51
Coefficients:
(Intercept) age secteur1 sociostat21
-2.22450 0.01887 1.75300 -1.73595
age:sociostat21
0.09453
Une seconde procédure de sélection dite ascendante est exécutée ; on choisit ici de prendre
comme modèle initial, le modèle avec la seule variable âge. La procédure ajoute à chaque étape
le terme le plus significatif . Le critère de choix est le critère d’Akaiké.
Start: AIC=118.91
maladie ~ age
Df Deviance AIC
+ secteur 1 102.26 108.26
+ sociostat3 1 111.97 117.97
<none> 114.91 118.91
+ sociostat2 1 113.11 119.11
Step: AIC=108.26
maladie ~ age + secteur
Df Deviance AIC
<none> 102.26 108.26
+ age:secteur 1 101.20 109.20
+ sociostat2 1 101.31 109.31
+ sociostat3 1 101.52 109.52
Coefficients:
(Intercept) age secteur1
-2.33515 0.02929 1.67345
6
Analyse des résidus –déviance - Modèle Y=f(age,secteur)
> modelsi<-glm(maladie~age+secteur+sociostat2+sociostat3,
+family=binomial)
On suppose disposer de nouvelles observations que l’on stocke dans un objet rd2 dont la
structure est identique à celle de rdisease.
> rd2<-data.frame(matrix(c(45,1,0,0,0,66,2,1,0,1),ncol=5,byrow=T))
> names(rd2)<-names(rdisease[-6])
> for (i in 2:5) rd2[,i]<-factor(rd2[,i])
7
> rd2
age sociostat sociostat2 sociostat3 secteur
1 45 1 0 0 0
2 66 2 1 0 1
On évalue la qualité du modèle précédent pour réaliser une prévision de maladie (oui - non) en
fonction des valeurs des variables âge, secteur, statut social. Cette prévision est obtenue par
reclassement des individus de l’échantillon de base (Méthode de substitution) et permet de
construire une matrice de confusion et d’estimer les taux de bien et mal classés.
> prevrd<-predict(modelsi,newdata=rdisease,type="response")
> prevrdlabel<-as.numeric(prevrd>0.5)
> table(rdisease$maladie,prevrdlabel)
prevrdlabel
0 1
0 58 9
1 19 12
> sum(prevrdlabel!=rdisease$maladie)/nrow(rdisease)
[1] 0.2857143
On trace les boites à moustaches des probabilités de maladie estimée et les résidus de
déviance pour chacune des deux modalités de la variable réponse.
> par(mfrow=c(1,2))
> boxplot(fitted.values(modelsi)~rdisease$maladie,
+ xlab="maladie",ylab="probas maladie")
> boxplot(residuals(modelsi)~rdisease$maladie,
+ xlab="maladie",ylab="residus")
Le tableau de classement pour chaque individu permet d’identifier les individus mal classés.
Le tableau de classement classe par en particulier 9 individus en malades (proba prevrd >0.5)
alors qu’ils sont sains (Y=0) (ind n027,35,43,48,55,57,58,59,60).
8
> cbind(rdisease,round(prevrd,2))
1 33 1 0 0 0 0 0.21
2 35 1 0 0 0 0 0.22
3 6 1 0 0 0 0 0.11
4 60 1 0 0 0 0 0.37
5 18 3 0 1 0 1 0.11
6 26 3 0 1 0 0 0.14
7 6 3 0 1 0 0 0.08
8 31 2 1 0 0 1 0.27
9 26 2 1 0 0 1 0.24
10 37 2 1 0 0 0 0.31
11 23 1 0 0 0 0 0.16
12 23 1 0 0 0 0 0.16
13 27 1 0 0 0 0 0.18
14 9 1 0 0 0 1 0.11
15 37 1 0 0 1 1 0.59
16 22 1 0 0 1 1 0.48
17 67 1 0 0 1 1 0.78
18 8 1 0 0 1 0 0.38
19 6 1 0 0 1 1 0.36
20 15 1 0 0 1 1 0.43
21 21 2 1 0 1 1 0.57
22 32 2 1 0 1 1 0.65
23 16 1 0 0 1 1 0.43
24 11 2 1 0 1 0 0.50
25 14 3 0 1 1 0 0.35
26 9 2 1 0 1 0 0.48
27 18 2 1 0 1 0 0.55*
28 2 3 0 1 0 0 0.07
29 61 3 0 1 0 0 0.31
30 20 3 0 1 0 0 0.12
31 16 3 0 1 0 0 0.11
32 9 2 1 0 0 0 0.16
33 35 2 1 0 0 0 0.30
34 4 1 0 0 0 0 0.10
35 44 3 0 1 1 0 0.57*
36 11 3 0 1 1 1 0.33
37 3 2 1 0 1 0 0.44
38 6 3 0 1 1 0 0.30
39 17 2 1 0 1 1 0.54
40 1 3 0 1 1 0 0.27
41 53 2 1 0 1 1 0.78
42 13 1 0 0 1 1 0.41
43 24 1 0 0 1 0 0.49
44 70 1 0 0 1 1 0.79
45 16 3 0 1 1 1 0.36
46 12 2 1 0 1 0 0.51*
47 20 3 0 1 1 1 0.39
48 65 3 0 1 1 0 0.71*
49 40 2 1 0 1 1 0.70
50 38 2 1 0 1 1 0.69
51 68 2 1 0 1 1 0.84
52 74 1 0 0 1 1 0.81
53 14 1 0 0 1 1 0.42
54 27 1 0 0 1 1 0.52
55 31 1 0 0 1 0 0.55*
56 18 1 0 0 1 0 0.45
57 39 1 0 0 1 0 0.60*
58 50 1 0 0 1 0 0.68*
59 31 1 0 0 1 0 0.55*
60 61 1 0 0 1 0 0.75*
61 18 3 0 1 0 0 0.11
62 5 3 0 1 0 0 0.08
63 2 3 0 1 0 0 0.07
64 16 3 0 1 0 0 0.11
65 59 3 0 1 0 1 0.30
66 22 3 0 1 0 0 0.12
67 24 1 0 0 0 0 0.17
68 30 1 0 0 0 0 0.19
69 46 1 0 0 0 0 0.28
70 28 1 0 0 0 0 0.19
71 27 1 0 0 0 0 0.18
72 27 1 0 0 0 1 0.18
73 28 1 0 0 0 0 0.19
9
74 52 1 0 0 0 1 0.32
75 11 3 0 1 0 0 0.09
76 6 2 1 0 0 0 0.15
77 46 3 0 1 0 0 0.22
78 20 2 1 0 0 1 0.21
79 3 1 0 0 0 0 0.10
80 18 2 1 0 0 0 0.20
81 25 2 1 0 0 0 0.24
82 6 3 0 1 0 0 0.08
83 65 3 0 1 0 1 0.34
84 51 3 0 1 0 0 0.25
85 39 2 1 0 0 0 0.32
86 8 1 0 0 0 0 0.11
87 8 2 1 0 0 0 0.16
88 14 3 0 1 0 0 0.10
89 6 3 0 1 0 0 0.08
90 6 3 0 1 0 0 0.08
91 7 3 0 1 0 0 0.08
92 4 3 0 1 0 0 0.08
93 8 3 0 1 0 0 0.08
94 9 2 1 0 0 0 0.16
95 32 3 0 1 0 1 0.16
96 19 3 0 1 0 0 0.11
97 11 3 0 1 0 0 0.09
98 35 3 0 1 0 0 0.17
> r1<-sample(1:98,49)
> tabr1<-rdisease[r1,1:6]
modelsi1<-glm(maladie~age+secteur+sociostat2+sociostat3,
+ data=tabr1,family=binomial)
> prevrd1<-predict(modelsi1,newdata=tabr1,type="response")
> prevrdlabel1<-as.numeric(prevrd1>0.5)
> table(tabr1$maladie,prevrdlabel1)
prevrdlabel1
0 1
0 28 4
1 4 13
> sum(prevrdlabel1!=tabr1$maladie)/nrow(tabr1)
[1] 0.1632653
> tabr2<-rdisease[-r1,1:6]
> prevrd2<-predict(modelsi1,newdata=tabr2,type="response")
> prevrdlabel2<-as.numeric(prevrd2>0.5)
> table(tabr2$maladie,prevrdlabel2)
prevrdlabel2
0 1
0 29 6
1 10 4
> sum(prevrdlabel2!=tabr2$maladie)/nrow(tabr2)
[1] 0.3265306
10
Classement – Procédure de validation croisée
Méthodes de rééchantillonnage- Package boot
L’estimation de l’erreur par validation croisée est exécutée par une fonction cv.glm(.) du
package boot.
La fonction cv.glm(data, glmfit, cost, K) admet les arguments suivants :
> help(cv.glm)
- data: les données
- glmfit: le modèle glm ajusté sur ces données (objet de classe «glm »)
- cost: une fonction cout avec deux vecteurs en arguments qui spécifie le cout de la
validation croisée (arguments: vecteur Y-observations et vecteur Y-estimations)
- K : le nombre de groupes à partir duquel est exécutée la validation croisée
L’aide en ligne précise: “Since the response is a binary variable an appropriate cost function is:”
cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)
La fonction retourne dans la sortie delta deux composantes ; la première composante donne
l’estimation par validation croisée de l’erreur de prévision.
> cv.glm(rdisease,modelsi,cost)$delta[1]
[1] 0.3265306
11
################
## Script ##
################
#Modèle Y=f(age)#
#Représentations graphiques#
plot(age,maladie)
boxplot(age~maladie,xlab="maladie",ylab="age")
#Régression logistique#
m1<-glm(maladie~age,family=binomial)
summary(m1)
beta<-coef(m1)
exp(beta[-1])
#Modèle Y=f(secteur)#
#Tableau de contingence –Test chi deux#
table(maladie,secteur)
chisq.test(maladie,secteur)
#Régression logistique- odds ratio#
m2<-glm(maladie~secteur,family=binomial)
summary(m2)
beta<-coef(m2)
exp(beta[-1])
#Modèle Y=f(sociostat)#
#Tableau de contingence –Test chi deux#
table(maladie,sociostat)
chisq.test(maladie,sociostat)
#Régression logistique- odds ratio#
m3<-glm(maladie~sociostat2+sociostat3,family=binomial)
summary(m3)
beta<-coef(m3)
exp(beta[-1])
12
#Procédure de sélection descendante pas à pas#
glmc<-modelai
step(glmc,direction="backward")
#Prévision#
rd2<-data.frame(matrix(c(45,1,0,0,0,66,2,1,0,1),ncol=5,byrow=T))
names(rd2)<-names(rdisease[-6])
for (i in 2:5) rd2[,i]<-factor(rd2[,i])
rd2
prevrd2<-predict(modelsi,newdata=rd2,type="response")
prevrd2
#Graphiques#
par(mfrow=c(1,2))
boxplot(fitted.values(modelsi)~rdisease$maladie,
xlab="maladie",ylab="probas maladie")
boxplot(residuals(modelsi)~rdisease$maladie,
xlab="maladie",ylab="residus")
#Tableau de classement#
cbind(rdisease,round(prevrd,2))
13
#Classement – Procédure de validation croisée#
library(boot)
disease.glm<-predict(modelsi,newdata=rdisease,type="response")
cout<-function(maladie,disease.glm)
return(mean(abs(maladie-disease.glm)>0.5))
cv.glm(rdisease,modelsi,cout)$delta[1]
#écriture équivalente
cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)
cv.glm(rdisease,modelsi,cost)$delta[1]
14