En un experimento descrito en Prentice (1976) se expuso una muestra de escarabajos a cierto pesticida. Tras cinco horas de exposición a distintos niveles de concentración del pesticida algunos de los escarabajos murieron y otros sobrevivieron. Los resultados para cada dosis aparecen en la tabla siguiente:

Dosis (\(\log_{10}CS_2 mgl^{-1}\)) N. insectos N. muertos
1.6907 59 6
1.7242 60 13
1.7552 62 18
1.7842 56 28
1.8113 63 52
1.8369 59 53
1.8610 62 61
1.8839 60 60

Formula un modelo de regresión logística para analizar estos datos y estima la probabilidad de que muera un escarabajo expuesto durante cinco horas a una dosis de concentración 1.8.


Solución:

# Datos
dosis = c(rep(1.6907,59),rep(1.7242,60),rep(1.7552,62),rep(1.7842,56),
          rep(1.8113,63),rep(1.8369,59),rep(1.8610,62),rep(1.8839,60))
y = c(rep(1,6),rep(0,53),rep(1,13),rep(0,47),rep(1,18),rep(0,62-18),
      rep(1,28),rep(0,56-28),rep(1,52),rep(0,63-52),rep(1,53),rep(0,59-53),
      rep(1,61),rep(0,1),rep(1,60))

PropMuertes <- tapply(y,factor(dosis),mean)
plot(levels(factor(dosis)),PropMuertes,xlab="Dosis",ylab="Proporción de muertes")
lines(levels(factor(dosis)),PropMuertes)

# Ajuste del modelo
reg = glm(y~dosis,family='binomial')
summary(reg)
## 
## Call:
## glm(formula = y ~ dosis, family = "binomial")
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.4922  -0.5986   0.2058   0.4512   2.3820  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -60.717      5.181  -11.72   <2e-16 ***
## dosis         34.270      2.912   11.77   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 645.44  on 480  degrees of freedom
## Residual deviance: 372.47  on 479  degrees of freedom
## AIC: 376.47
## 
## Number of Fisher Scoring iterations: 5
predict(reg,data.frame(dosis=1.8),type="response")
##         1 
## 0.7249464
dosisvec <- seq(1.69,1.89,0.001)
probMpred <- predict(reg,data.frame(dosis=dosisvec),type="response")
plot(levels(factor(dosis)),PropMuertes,xlab="Dosis",ylab="Proporción de muertes")
lines(levels(factor(dosis)),PropMuertes)
lines(dosisvec,probMpred,col="red")

Para aproximar el riesgo o tasa de clasificación errónea de la clasificación logística mediante leave-one-out:

library(boot)
## Warning: package 'boot' was built under R version 4.1.2
glm.fit <- glm(y~dosis,family='binomial',data=data.frame(cbind(dosis,y)))

cv.err <- cv.glm(data.frame(cbind(dosis,y)), glm.fit)
# Riesgo
cv.err$delta[1]
## [1] 0.1241303