Vous êtes sur la page 1sur 14

REGRESSION LOGISTIQUE

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.

Lecture –données disease.txt


> rdisease<-read.table("disease.txt",header=T)
> for (i in 2:6) rdisease[,i]<-factor(rdisease[,i])
> summary(rdisease)
age sociostat sociostat2 sociostat3 secteur maladie
Min. : 1.00 1:38 0:75 0:62 0:59 0:67
1st Qu.: 9.50 2:24 1:23 1:36 1:39 1:31
Median :20.50 3:36
Mean :25.20
3rd Qu.:35.00
Max. :74.00
> attach(rdisease)

1. Etude liaison maladie - age


-Représentations graphiques
> boxplot(age~maladie,xlab="maladie",ylab="age")

> plot(age,maladie)

1
-Régression logistique Y=f(age)

On exécute la régression logistique de la réponse sur l’âge avec la fonction glm( ):


> m1<-glm(maladie~age,family=binomial)
> summary(m1)
Call:glm(formula = maladie ~ age, family = binomial)

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

2. Etude liaison maladie – secteur

-Test chi deux


> table(maladie,secteur)
secteur
maladie 0 1
0 49 18
1 10 21
> chisq.test(maladie,secteur)
Pearson's Chi-squared test with Yates' continuity correction
data: maladie and secteur
X-squared = 13.1236, df = 1, p-value = 0.0002916

-Régression logistique Y=f(secteur)


On exécute la régression logistique de la réponse Y sur le secteur.
> m2<-glm(maladie~secteur,family=binomial)
> summary(m2)
Call: glm(formula = maladie ~ secteur, family = binomial)

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

-Tests chi deux


> table(maladie,sociostat)
sociostat
maladie 1 2 3
0 24 14 29
1 14 10 7
> chisq.test(maladie,sociostat)
Pearson's Chi-squared test
data: maladie and sociostat
X-squared = 4.067, df = 2, p-value = 0.1309

-Régression logistique Y=f(sociostat)


On exécute la régression logistique de la réponse Y sur le statut social.
> m3<-glm(maladie~sociostat2+sociostat3,family=binomial)
> summary(m3)
Call: glm(formula = maladie ~ sociostat2 + sociostat3, family =
binomial)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.0383 -0.9587 -0.6576 1.3232 1.8098

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

Null deviance: 122.32 on 97 degrees of freedom


Residual deviance: 118.09 on 95 degrees of freedom
AIC: 124.09

> beta<-coef(m3)
> exp(beta[-1])
sociostat21 sociostat31
1.2244898 0.4137931

4. Etude - Modèle Y=f(age,secteur, sociostat) sans interaction


On considère un premier modèle explicitant la liaison entre maladie et les trois variables
explicatives sans intégrer les termes d’interactions.
> modelsi<-
glm(maladie~age+secteur+sociostat2+sociostat3,family=binomial)
> summary(modelsi)
Call: glm(formula = maladie ~ age + secteur + sociostat2 + sociostat3,
family = binomial)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.6552 -0.7529 -0.4788 0.8558 2.0977

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

5. Etude - Modèle Y=f(age,secteur, sociostat) avec interaction


On considère un second modèle avec les trois variables explicatives intégrant les termes
d’interactions d’ordre 2 entre variables explicatives .

> 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

Comparaison des modèles


Le test de vraisemblance permet de comparer les deux modèles avec et sans interaction :
> deviance(modelsi)-deviance(modelai)
[1] 7.058277
> qchisq(0.95,5)
[1] 11.07050

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

Model 1: maladie ~ age + secteur + sociostat2 + sociostat3 + age *


secteur +
age * sociostat2 + age * sociostat3 + secteur * sociostat2 +
secteur * sociostat3
Model 2: maladie ~ age + secteur + sociostat2 + sociostat3
Resid. Df Resid. Dev Df Deviance P(>|Chi|)
1 88 93.996
2 93 101.054 -5 -7.0583 0.2163

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

Call: glm(formula = maladie ~ age + secteur + sociostat2 +


age:sociostat2,
family = binomial)

Coefficients:
(Intercept) age secteur1 sociostat21
-2.22450 0.01887 1.75300 -1.73595
age:sociostat21
0.09453

Degrees of Freedom: 97 Total (i.e. Null); 93 Residual


Null Deviance: 122.3
Residual Deviance: 96.79 AIC: 106.8

7. Sélection de modèles ascendante pas à pas - Critère AIC

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é.

> glm0<-glm(maladie~age, family="binomial")


> step(glm0,scope=~age+secteur+sociostat2+sociostat3+
+ age*secteur+age*sociostat2+age*sociostat3+
+ secteur*sociostat2+secteur*sociostat3,direction="forward")

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

Call: glm(formula = maladie ~ age + secteur, family = "binomial")

Coefficients:
(Intercept) age secteur1
-2.33515 0.02929 1.67345

Degrees of Freedom: 97 Total (i.e. Null); 95 Residual


Null Deviance: 122.3
Residual Deviance: 102.3 AIC: 108.3

6
Analyse des résidus –déviance - Modèle Y=f(age,secteur)

On analyse graphiquement les résidus du modèle ; construire les graphiques suivants :


- graphique des résidus en fonction de l’index
- graphique des résidus en fonction des valeurs estimées
- graphique résidus en fonction de l’âge

Représenter également l’allure de la courbe logistique en traçant le graphique des valeurs


estimées du modèle en fonction du log odds.
> modelf<-glm(maladie~age+secteur,family="binomial")
> bf<-coef(modelf)
> sector<-as.numeric(secteur)
> logodds<-(bf[1]+bf[2]*age+bf[3]*sector)
> par(mfrow=c(2,2))
> plot(residuals(modelf))
> plot(fitted.values(modelf),residuals(modelf))
> plot(age,residuals(modelf))
> plot(logodds,fitted.values(modelf))

Prévision - modèle Y=f(age, secteur, statut social)


On considère dans cette partie le modèle sans interaction précédent pour réaliser une prévision
sur de nouvelles observations ; on suppose connaitre les valeurs des variables explicatives et on
utilise le modèle pour prévoir le statut malade oui – non.

> 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 applique le modèle de prévision à ces nouvelles observations:


> prevrd2<-predict(modelsi,newdata=rd2,type="response")
> prevrd2
1 2
0.274048 0.836732

Classement – Méthode de substitution

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

Taux de bien – mal classés

> 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))

age sociostat sociostat2 sociostat3 secteur maladie 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

Classement – Méthode de l’Echantillon test

L’estimation précédente de l’erreur de classement présente un biais (sous estimation du taux de


mal classés). La méthode de l’échantillon – test permet une correction de ce biais ; le principe
consiste à scinder l’échantillon initial en deux sous échantillon ; un tirage aléatoire permet de
former un échantillon d’apprentissage sur lequel on exécute le modèle de régression logistique
et un échantillon test ou de validation sur lequel on évalue l’erreur de prévision (taux de mal
classés). On prend ici deux échantillons de taille équivalente.

> 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

Remarque : Réexécution – Boucle

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)

> #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]
[1] 0.3265306

> #écriture équivalente


> 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 ##
################

#Lecture –données disease.txt#


rdisease<-read.table("disease.txt",header=T)
for (i in 2:6) rdisease[,i]<-factor(rdisease[,i])
summary(rdisease)
age<-rdisease$age
disease<-rdisease$disease
sociostat2<-rdisease$sociostat2
sociostat3<-rdisease$sociostat3
secteur<-rdisease$secteur
maladie<-rdisease$maladie

#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])

#Modèle Y=f(age,secteur,sociostat) sans interaction #


modelsi<-glm(maladie~age+secteur+sociostat2+sociostat3,
family=binomial)
summary(modelsi)

#Modèle Y=f(age,sexcteur,sociostat) avec interaction#


modelai<-glm(maladie~age+secteur+sociostat2+sociostat3+
age*secteur+age*sociostat2+age*sociostat3+
secteur*sociostat2+secteur*sociostat3,family=binomial)
summary(modelai)

#Comparaison des deux modèles#


anova(modelai,modelsi,test="Chisq")
deviance(modelsi)-deviance(modelai)
qchisq(0.95,5)

12
#Procédure de sélection descendante pas à pas#
glmc<-modelai
step(glmc,direction="backward")

#Procédure de sélection ascendante pas à pas #


glm0<-glm(maladie~age, family="binomial")
step(glm0,scope=~age+secteur+sociostat2+sociostat3+
age*secteur+age*sociostat2+age*sociostat3+
secteur*sociostat2+secteur*sociostat3,direction="forward")
modelf<-glm(maladie~age+secteur,family="binomial")

#Analyse résidus -modèle Y=f(age,secteur)#


modelf<-glm(maladie~age+secteur,family="binomial")
bf<-coef(modelf)
sector<-as.numeric(secteur)
logodds<-(bf[1]+bf[2]*age+bf[3]*sector)
par(mfrow=c(2,2))
plot(residuals(modelf))
plot(fitted.values(modelf),residuals(modelf))
plot(age,residuals(modelf))
plot(logodds,fitted.values(modelf))

#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

#Classement - Méthode de substitution#


prevrd<-predict(modelsi,newdata=rdisease,type="response")
prevrdlabel<-as.numeric(prevrd>0.5)
table(rdisease$maladie,prevrdlabel)
sum(prevrdlabel!=rdisease$maladie)/nrow(rdisease)

#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))

#Classement – Méthode Echantillon test #


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)
sum(prevrdlabel1!=tabr1$maladie)/nrow(tabr1)
tabr2<-rdisease[-r1,1:6]
prevrd2<-predict(modelsi1,newdata=tabr2,type="response")
prevrdlabel2<-as.numeric(prevrd2>0.5)
table(tabr2$maladie,prevrdlabel2)
sum(prevrdlabel2!=tabr2$maladie)/nrow(tabr2)

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

Vous aimerez peut-être aussi