Salida de predicción de regresión logística

14

He creado una regresión logística usando el siguiente código:

full.model.f = lm(Ft_45 ~ ., LOG_D)
base.model.f = lm(Ft_45 ~ IP_util_E2pl_m02_flg)
step(base.model.f, scope=list(upper=full.model.f, lower=~1),
     direction="forward", trace=FALSE)

Luego utilicé el resultado para crear un modelo final:

final.model.f = lm(Ft_45 ~ IP_util_E2pl_m02_flg + IP_util_E2_m02_flg + 
                           AE_NumVisit1_flg + OP_NumVisit1_m01_flg + IP_TotLoS_m02 + 
                           Ft1_45 + IP_util_E1_m05_flg + IP_TotPrNonElecLoS_m02 + 
                           IP_util_E2pl_m03_flg + LTC_coding + OP_NumVisit0105_m03_flg +
                           OP_NumVisit11pl_m03_flg + AE_ArrAmb_m02_flg)

Luego he predicho los resultados para un conjunto diferente de datos usando la función de predicción:

log.pred.f.v <- predict(final.model.f, newdata=LOG_V)

He podido establecer una curva ROC agradable y he creado una tabla para establecer la sensibilidad y especificidad que me da las respuestas que esperaría.

Sin embargo, lo que estoy tratando de hacer es establecer para cada fila de datos cuál es la probabilidad de que Ft_45 sea 1. Si miro la salida de log.pred.fv obtengo, por ejemplo:

1 -0.171739593    
2 -0.049905948    
3 0.141146419    
4 0.11615669    
5 0.07342591    
6 0.093054334    
7 0.957164383    
8 0.098415639    
.
.
.
104 0.196368229    
105 1.045208447    
106 1.05499112

Como solo tengo una idea tentativa de lo que estoy haciendo, estoy luchando por comprender cómo interpretar los valores negativos y más altos de 1, ya que esperaría que la probabilidad esté entre 0 y 1.

Entonces, mi pregunta es si me estoy perdiendo un paso en el que necesito transformar la salida o me he equivocado por completo. Gracias de antemano por cualquier ayuda que pueda ofrecer.

SeBee
fuente

Respuestas:

23

Primero, parece que construyó un modelo de regresión lineal regular, no un modelo de regresión logística. Para construir un modelo de regresión logística, debe usar glm()con family="binomial" , no lm().

X1,X2X3y

logit <- glm(y~x1+x2+x3,family="binomial")

β0 0,β1,β2β3

Si lo hace predict(logit), R calculará y regresará b0 + b1*x1 + b2*x2 + b3*x3.

y=losol(pag1-pag)=β0 0+β1X1+β2X2+β3X3

pag

En R, puedes hacer algo como esto:

pred <- predict(logit,newdata=data) #gives you b0 + b1x1 + b2x2 + b3x3
probs <- exp(pred)/(1+exp(pred)) #gives you probability that y=1 for each observation
Ben F
fuente
Muchas gracias, en primer lugar por corregir mi código y en segundo lugar por explicar cómo obtener las probabilidades en R. Lo probé y funciona perfectamente. ¡Ojalá hubiera preguntado hace semanas!
SeBee
1
Se puede acortar con probs <- exp(predict(logit, type = "response" , newdata=data)o al menos `probs <- 1 / (1 + exp (-pred))
snoram
11

Mirando la documentación de la predict.glm, parece que es tan fácil como usar un parámetro adicional en la predictllamada:

 type = "response"

Ver documentación:

tipo : el tipo de predicción requerida. El valor predeterminado está en la escala de los predictores lineales; la "respuesta" alternativa está en la escala de la variable de respuesta. Por lo tanto, para un modelo binomial predeterminado, las predicciones predeterminadas son de log-odds (probabilidades en la escala logit) y type = "response" da las probabilidades predichas. La opción "términos" devuelve una matriz que proporciona los valores ajustados de cada término en la fórmula del modelo en la escala de predicción lineal. El valor de este argumento puede abreviarse

Bulat
fuente