El código que ha utilizado estima un modelo de regresión logística utilizando el glm
función. No has incluido datos, así que me inventaré algunos.
set.seed(1234)
mydat <- data.frame(
won=as.factor(sample(c(0, 1), 250, replace=TRUE)),
bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))
Un modelo de regresión logística modela la relación entre una variable de respuesta binaria y, en este caso, un predictor continuo. El resultado es un logit-transformado probabilidad como una relación lineal con el predictor. En su caso, el resultado es una respuesta binaria que corresponde a ganar o no ganar en el juego y está siendo predicho por el valor de la apuesta. Los coeficientes de mod1
se dan en probabilidades registradas (que son difíciles de interpretar), según:
$$\text{logit}(p)=\log\left(\frac{p}{(1-p)}\right)=\beta_{0}+\beta_{1}x_{1}$$
Para convertir las probabilidades registradas en probabilidades, podemos traducir lo anterior en
$$p=\frac{\exp(\beta_{0}+\beta_{1}x_{1})}{(1+\exp(\beta_{0}+\beta_{1}x_{1}))}$$
Puedes utilizar esta información para configurar la parcela. En primer lugar, necesita un rango de la variable de predicción:
plotdat <- data.frame(bid=(0:1000))
A continuación, utilizando predict
puede obtener predicciones basadas en su modelo
preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)
Obsérvese que los valores ajustados también pueden obtenerse mediante
mod1$fitted
Al especificar se.fit=TRUE
También se obtiene el error estándar asociado a cada valor ajustado. El resultado data.frame
es una matriz con los siguientes componentes: las predicciones ajustadas ( fit
), los errores estándar estimados ( se.fit
), y un escalar que da la raíz cuadrada de la dispersión utilizada para calcular los errores estándar ( residual.scale
). En el caso de un logit binomial, el valor será 1 (que se puede ver introduciendo preddat$residual.scale
en R
). Si quiere ver un ejemplo de lo que ha calculado hasta ahora, puede escribir head(data.frame(preddat))
.
El siguiente paso es preparar el terreno. A mí me gusta configurar primero un área de ploteo en blanco con los parámetros:
with(mydat, plot(bid, won, type="n",
ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))
Ahora puedes ver dónde es importante saber cómo calcular las probabilidades ajustadas. Puedes dibujar la línea correspondiente a las probabilidades ajustadas siguiendo la segunda fórmula anterior. Utilizando la preddat data.frame
puede convertir los valores ajustados en probabilidades y utilizarlos para trazar una línea contra los valores de su variable de predicción.
with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))
Por último, responde a tu pregunta, los intervalos de confianza pueden añadirse al gráfico calculando la probabilidad de los valores ajustados +/- 1.96
veces el error estándar:
with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))
El gráfico resultante (a partir de los datos generados aleatoriamente) debería tener el siguiente aspecto:
Por conveniencia, aquí está todo el código en un trozo:
set.seed(1234)
mydat <- data.frame(
won=as.factor(sample(c(0, 1), 250, replace=TRUE)),
bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))
plotdat <- data.frame(bid=(0:1000))
preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)
with(mydat, plot(bid, won, type="n",
ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))
with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))
with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))
(Nota: Esta es una respuesta muy editada en un intento de hacerla más relevante para stats.stackexchange).
4 votos
(+1) En respuesta a los votos para cerrar como off topic: Aparentemente la base de esos votos es que la pregunta parece hacer una pregunta puramente relacionada con el software ("cómo trazar tal y tal cosa en R"), una pregunta que de hecho debería aparecer en SO. Sin embargo, hay que tener en cuenta que en la respuesta actual hay fórmulas estadísticas para crear los puntos de trazado. Esto sugiere que hay un interés estadístico en la pregunta, por lo que me resisto a votar por la migración. A buena La respuesta a esta pregunta destacaría y explicaría este punto estadístico.