C12

Transcription

C12
Corrigé Fiche 12
Septembre 2016
1. Importation du jeu de données (attention au séparateur):
donnees <- read.table("cancerprostate.txt",header=TRUE,sep=";")
2. Résumé du jeu de données :
summary(donnees)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
age
Min.
:45.00
1st Qu.:56.00
Median :60.00
Mean
:59.38
3rd Qu.:65.00
Max.
:68.00
grade
Min.
:0.0000
1st Qu.:0.0000
Median :0.0000
Mean
:0.3774
3rd Qu.:1.0000
Max.
:1.0000
acide
Min.
:0.4000
1st Qu.:0.5000
Median :0.6500
Mean
:0.6942
3rd Qu.:0.7800
Max.
:1.8700
Y
Min.
:0.0000
1st Qu.:0.0000
Median :0.0000
Mean
:0.3774
3rd Qu.:1.0000
Max.
:1.0000
rayonx
taille
Min.
:0.000
Min.
:0.0000
1st Qu.:0.000
1st Qu.:0.0000
Median :0.000
Median :1.0000
Mean
:0.283
Mean
:0.5094
3rd Qu.:1.000
3rd Qu.:1.0000
Max.
:1.000
Max.
:1.0000
log.acid
Min.
:-0.9163
1st Qu.:-0.6931
Median :-0.4308
Mean
:-0.4189
3rd Qu.:-0.2485
Max.
: 0.6259
Il y a un problème sur les 4 variables qualitatives, vues comme quantitatives. On les spécifie donc en tant
que telles1 :
for (i in 3:6){donnees[,i]=factor(donnees[,i])}
summary(donnees)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
age
Min.
:45.00
1st Qu.:56.00
Median :60.00
Mean
:59.38
3rd Qu.:65.00
Max.
:68.00
log.acid
Min.
:-0.9163
1st Qu.:-0.6931
Median :-0.4308
Mean
:-0.4189
3rd Qu.:-0.2485
Max.
: 0.6259
acide
Min.
:0.4000
1st Qu.:0.5000
Median :0.6500
Mean
:0.6942
3rd Qu.:0.7800
Max.
:1.8700
rayonx taille grade
0:38
0:26
0:33
1:15
1:27
1:20
Y
0:33
1:20
3. Considérons d’abord le modèle logistique permettant d’expliquer la variable Y par la variable log.acid.
1 “Je
vous disais que j’étais victime des colifichets et qu’il faudrait qu’on commence à me considérer en tant que tel.” Perceval,
Kaamelott, saison 1, épisode 89.
1
(a) Obtention du modèle :
modele0 <- glm(Y~log.acid,data=donnees,family=binomial)
summary(modele0)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Call:
glm(formula = Y ~ log.acid, family = binomial, data = donnees)
Deviance Residuals:
Min
1Q
Median
-1.9802 -0.9095 -0.7266
3Q
1.1951
Max
1.7302
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.404
0.509
0.794
0.4274
log.acid
2.245
1.040
2.159
0.0309 *
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 70.252
Residual deviance: 64.813
AIC: 68.813
on 52
on 51
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 4
(b) La probabilité critique associée au test H0 : β1 = 0 contre H1 : β1 6= 0, vaut 0.03, donc on rejette H0
au niveau 5% et on considère la variable log.acid comme significative.
(c) Le modèle donne
log
p(x)
= 0.404 + 2.245x.
1 − p(x)
Après un savant calcul, on en déduit que
p(x) =
exp(0.404 + 2.245x)
.
1 + exp(0.404 + 2.245x)
Noter qu’en toute rigueur il faudrait noter p̂(x) et non p(x).
(d) Tracé de la fonction :
beta <- coefficients(modele0)
x <- seq(-2,2,by=0.01)
p <- exp(beta[1]+beta[2]*x)/(1+exp(beta[1]+beta[2]*x))
plot(x,p,type="l",xlab="log.acid",ylab="p(x)")
abline(h=1/2,lty=3)
2
1.0
0.8
0.6
0.0
0.2
0.4
p(x)
−2
−1
0
1
2
log.acid
(e) L’équation p(x0 ) = 1/2 donne x0 =-beta[1]/beta[2], c’est-à-dire
x0 <- -beta[1]/beta[2]
x0
## (Intercept)
## -0.1799853
Pour x > x0 ≈ −0.18, on considère donc que le cancer a atteint les nœuds lymphatiques et on prédit Ŷ = 1,
et inversement si x < x0 .
plot(x,p,type="l",xlab="log.acid",ylab="p(x)")
abline(h=1/2,lty=3)
abline(v=x0,lty=3)
3
1.0
0.8
0.6
0.0
0.2
0.4
p(x)
−2
−1
0
1
log.acid
4. Modèle tenant compte de toutes les variables :
modele <- glm(Y~.,data=donnees,family=binomial)
summary(modele)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Call:
glm(formula = Y ~ ., family = binomial, data = donnees)
Deviance Residuals:
Min
1Q
Median
-2.0960 -0.6102 -0.2863
3Q
0.4834
Max
2.2000
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 10.08672
7.83450
1.287
0.1979
age
-0.04289
0.06166 -0.696
0.4867
acide
-8.48006
7.63305 -1.111
0.2666
rayonx1
2.06673
0.85469
2.418
0.0156 *
taille1
1.38415
0.79546
1.740
0.0819 .
grade1
0.85376
0.81247
1.051
0.2933
log.acid
9.60912
6.21652
1.546
0.1222
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 70.252
Residual deviance: 44.768
AIC: 58.768
on 52
on 46
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 5
4
2
5. Sélection de modèle :
modele_selectionne <- step(modele,direction="backward")
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Start: AIC=58.77
Y ~ age + acide + rayonx + taille + grade + log.acid
- age
- grade
- acide
<none>
- taille
- log.acid
- rayonx
Df Deviance
AIC
1
45.259 57.259
1
45.883 57.883
1
46.560 58.560
44.768 58.768
1
47.949 59.949
1
48.126 60.126
1
51.368 63.368
Step: AIC=57.26
Y ~ acide + rayonx + taille + grade + log.acid
- grade
<none>
- acide
- taille
- log.acid
- rayonx
Df Deviance
AIC
1
46.425 56.425
45.259 57.259
1
47.776 57.776
1
48.300 58.300
1
49.615 59.615
1
51.742 61.742
Step: AIC=56.43
Y ~ acide + rayonx + taille + log.acid
<none>
- acide
- log.acid
- taille
- rayonx
Df Deviance
46.425
1
48.986
1
50.660
1
51.246
1
53.707
AIC
56.425
56.986
58.660
59.246
61.707
summary(modele_selectionne)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
Call:
glm(formula = Y ~ acide + rayonx + taille + log.acid, family = binomial,
data = donnees)
Deviance Residuals:
Min
1Q
Median
-1.9452 -0.6464 -0.2999
3Q
0.4517
Max
2.2676
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
9.0668
7.9335
1.143
0.2531
acide
-9.8617
7.8364 -1.258
0.2082
rayonx1
2.0934
0.8273
2.530
0.0114 *
5
##
##
##
##
##
##
##
##
##
##
##
##
taille1
1.5909
0.7574
2.100
0.0357 *
log.acid
10.4097
6.2649
1.662
0.0966 .
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 70.252
Residual deviance: 46.425
AIC: 56.425
on 52
on 48
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 5
Les variables age et grade ont été supprimées.
6. On ne précise que les variables du modèle selectionné (on pourrait les rentrer toutes, ce qui ne changerait
rien du moment qu’on donne les bons noms aux variables)
new <- data.frame(acide=0.6,rayonx="1",taille="0",log.acid=-0.51)
prev <- predict(modele_selectionne,newdata=new,type="response")
prev
##
1
## 0.4835626
On trouve une probabilité de 0.48, donc on prédit que le cancer n’a pas atteint les nœuds lymphatiques.
Cependant, le résultat étant proche de 1/2, la prudence est de mise. . .
7. Estimons le taux de mal classés.
(a) Probabilités prédites :
prevglobale <- predict(modele_selectionne,newdata=donnees,type="response")
On dispose donc d’un vecteur de 53 probabilités.
(b) Tableau de contingence :
prevglobaleY <- prevglobale>0.5
prevglobaleY
##
1
2
3
4
5
6
7
8
9
10
11
12
## FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
##
13
14
15
16
17
18
19
20
21
22
23
24
## FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##
25
26
27
28
29
30
31
32
33
34
35
36
## TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
##
37
38
39
40
41
42
43
44
45
46
47
48
## TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
##
49
50
51
52
53
## TRUE FALSE TRUE TRUE TRUE
6
On obtient un vecteur de booléens qu’on transforme en 0 et 1
prevglobaleY <- as.numeric(prevglobaleY)
Il reste à dresser la table de contingence
table(donnees$Y,prevglobaleY)
##
##
##
##
prevglobaleY
0 1
0 28 5
1 6 14
(c) Le taux de mal classés est la somme des termes hors-diagonale, qui peut se calculer comme suit :
MC <- sum(donnees$Y!=prevglobaleY)/length(prevglobaleY)
MC
## [1] 0.2075472
Il y a donc environ 20% de mal classés.
8. Estimons le taux de mal-classés par validation croisée.
library(boot)
cout <- function(Y_obs,prevision_prob){return(mean(abs(Y_obs-prevision_prob)>0.5))}
cv.glm(donnees,modele_selectionne,cout)$delta[1]
## [1] 0.2830189
On trouve donc environ 28% de mal classés, c’est déjà moins bon. . .
7

Documents pareils