54 votos

La obtención de los valores de la predicción (Y=1 o 0) a partir de un modelo de regresión logística ajuste

Digamos que tengo un objeto de la clase glm (correspondiente a un modelo de regresión logística) y me gustaría activar la predicción de probabilidades dada por predict.glm usando el argumento type="response" en binario respuestas, es decir, $Y=1$ o $Y=0$. ¿Cuál es la más rápida y la mayoría de los canónica manera de hacer esto en R?

Mientras que, de nuevo, estoy consciente de predict.glm, no sé dónde exactamente el valor de corte $P(Y_i=1|\sombrero X_{i})$ vidas -- y supongo que esta es mi principal escollo aquí.

81voto

Niall Puntos 51

Una vez que usted tiene la predicción de probabilidades, es hasta qué umbral que le gustaría utilizar. Usted puede elegir el umbral para optimizar la sensibilidad, especificidad, o cualquiera que sea la medida más importante en el contexto de la aplicación (algo de información adicional sería útil aquí para una respuesta más específica). Usted puede desear mirar en las curvas ROC y otras medidas relacionadas con la clasificación óptima.

Edit: Para aclarar esta respuesta un poco me voy a dar un ejemplo. La verdadera respuesta es que el óptimo de corte depende de las propiedades del clasificador son importantes en el contexto de la aplicación. Deje de $Y_{i}$ es el verdadero valor para la observación i $$ y $\hat{Y}_{i}$ se la predicción de la clase. Algunas medidas comunes de actuación son

(1) Sensibilidad: $P(\hat{Y}_i=1 | Y_i=1)$ - la proporción de '1's que son correctamente identificados como tal.

(2) Especificidad: $P(\hat{Y}_i=0 | Y_i=0)$ - la proporción de '0' s que son correctamente identificados como así

(3) (Correcto) Tasa de Clasificación: $P(Y_i = \hat{Y}_i)$ - la proporción de predicciones eran correctas.

Por ejemplo, si el clasificador fueron con el objetivo de evaluar una prueba de diagnóstico para una enfermedad grave que tiene un relativamente seguro cura, la sensibilidad es mucho más importante que la especificidad. En otro caso, si la enfermedad fueron relativamente menores y el tratamiento eran arriesgados, especificidad, sería más importante para el control. Para la clasificación general de los problemas, es considerada "buena" para optimizar conjuntamente la sensibilidad y la especificación - por ejemplo, usted puede utilizar el clasificador que minimiza la distancia Euclidiana desde el punto $(1,1)$:

$$ \delta = \sqrt{ [P(Y_i=1 | \sombrero{Y}_i=1)-1]^2 + [P(Y_i=0 | \sombrero{Y}_i=0)-1]^2 }$$

$\delta$ podría ser ponderada o modificado de otra forma de reflejar de una manera más razonable de la medida de la distancia de dólares(1,1)$ en el contexto de la aplicación - la distancia euclídea de (1,1), fue elegido aquí arbitrariamente para fines ilustrativos. En cualquier caso, todas estas cuatro medidas que podrían ser más adecuados, dependiendo de la aplicación.

Por debajo es una simulación de ejemplo de uso de la predicción de un modelo de regresión logística para clasificar. El corte es muy variado, a ver qué corte le da el "mejor" clasificador en cada una de estas tres medidas. En este ejemplo los datos proceden de un modelo de regresión logística con tres predictores (ver R código de abajo de la parcela). Como se puede ver en este ejemplo, el "óptimo" de corte depende de en cuál de estas medidas es más importante - es totalmente dependiente de la aplicación.

Edit 2: $P(Y_i = 1 | \sombrero{Y}_i = 1)$ y $P(Y_i = 0 | \sombrero{Y}_i = 0)$, los verdaderos positivos y verdaderos negativos de las tasas (nota: estos son NO de la misma como la sensibilidad y especificidad) también pueden ser útiles las medidas de rendimiento. Por ejemplo, si usted está tratando de diseñar un diagnóstico para cuando un brote de la enfermedad iba a ocurrir (en el futuro), un alto positivos verdaderos tasa sería muy deseable, ya que significaría que si un brote va a ocurrir, usted es muy probable que predicen que uno va a ocurrir (y se puede implementar algunas de intervención). El código puede ser modificado para calcular estos en su lugar - se los dejo a ustedes :)

enter image description here

# data y simulated from a logistic regression model 
# with with three predictors, n=10000
x = matrix(rnorm(30000),10000,3)
lp = 0 + x[,1] - 1.42*x[2] + .67*x[,3] + 1.1*x[,1]*x[,2] - 1.5*x[,1]*x[,3] +2.2*x[,2]*x[,3] + x[,1]*x[,2]*x[,3]
p = 1/(1+exp(-lp))
y = runif(10000)<p

# fit a logistic regression model
mod = glm(y~x[,1]*x[,2]*x[,3],family="binomial")

# using a cutoff of cut, calculate sensitivity, specificity, and classification rate
perf = function(cut, mod, y)
{
   yhat = (mod$fit>cut)
   w = which(y==1)
   sensitivity = mean( yhat[w] == 1 ) 
   specificity = mean( yhat[-w] == 0 ) 
   c.rate = mean( y==yhat ) 
   d = cbind(sensitivity,specificity)-c(1,1)
   d = sqrt( d[1]^2 + d[2]^2 ) 
   out = t(as.matrix(c(sensitivity, specificity, c.rate,d)))
   colnames(out) = c("sensitivity", "specificity", "c.rate", "distance")
   return(out)
}

s = seq(.01,.99,length=1000)
OUT = matrix(0,1000,4)
for(i in 1:1000) OUT[i,]=perf(s[i],mod,y)
plot(s,OUT[,1],xlab="Cutoff",ylab="Value",cex.lab=1.5,cex.axis=1.5,ylim=c(0,1),type="l",lwd=2,axes=FALSE,col=2)
axis(1,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
axis(2,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
lines(s,OUT[,2],col="darkgreen",lwd=2)
lines(s,OUT[,3],col=4,lwd=2)
lines(s,OUT[,4],col="darkred",lwd=2)
box()
legend(0,.25,col=c(2,"darkgreen",4,"darkred"),lwd=c(2,2,2,2),c("Sensitivity","Specificity","Classification Rate","Distance"))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X