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