2 votos

Regresión logística: cómo calcular un intervalo de predicción

Supongamos que tengo un modelo de regresión logística simple:

$log(p/(1-p)) = \beta_0 + \beta_1x$

Entonces lo sé:

$p/(1-p) = e^{\beta_0 + \beta_1x}$

y

$p = e^{\beta_0 + \beta_1x}/(1 + e^{\beta_0 + \beta_1x})$

¿Cómo puedo obtener un intervalo de confianza para p?

Es decir, ¿cómo puedo obtener un intervalo de confianza del 95% sobre la probabilidad de éxito (¿se llamaría intervalo de predicción? Tal vez esté utilizando el término equivocado)?

He buscado en varios sitios, pero no encuentro la fórmula. Por ejemplo, he buscado:

  • aquí (lo que indica que dicho intervalo no es de interés porque cada valor de la respuesta sólo puede ser 0 o 1, pero eso no es lo que me interesa),

  • y aquí (y de nuevo, sin fórmula, pero con una pregunta similar)

4voto

Alex Puntos 128

¿se llamaría intervalo de predicción? Tal vez estoy usando el término equivocado)

Eso no sería un intervalo de predicción. Un intervalo de predicción incorporaría la incertidumbre en la generación de datos. Es un poco inútil para una regresión logística binaria, ya que sabemos que el resultado será 0 o 1. Un intervalo de predicción puede ser más útil cuando se tienen datos de prueba (por ejemplo, predigo entre 8 y 12 eventos de los 20).

A calcular el intervalo de confianza. En primer lugar, hay que empezar por calcular $\operatorname{Var}(\operatorname{logit}(p))$ . Desde $\operatorname{logit}(p) = \beta_0 + \beta_1x$

$$\operatorname{Var}(\operatorname{logit}(p)) = \operatorname{Var}(\beta_0) + x^2 \operatorname{Var}(\beta_1) + 2x\operatorname{Cov}(\beta_0, \beta_1)$$

Puede encontrar estas cantidades a partir de la matriz de covarianza estimada a partir del modelo. Si se saca la raíz cuadrada de esta cantidad, se obtiene la desviación típica de $\operatorname{logit}(p)$ . Llamemos a esta cantidad $\sigma$ por ahora.

Un intervalo de confianza para $\operatorname{logit}(p)$ es $(\theta_L, \theta_U) = (\operatorname{logit}(p) - 1.96 \sigma,\operatorname{logit}(p) + 1.96 \sigma )$ . Invierta cada punto final para obtener un intervalo de confianza para $p$ .

Así es como se puede realizar esto en R.

library(tidyverse)

#Simulate some data to run a regression on
x = rnorm(100)
eta = -0.8 + 0.2*x
p = plogis(eta)
y = rbinom(100, 1, p)

# Fit a model
model = glm(y~x, family = binomial())
Bigma = vcov(model)

# Formula above for standard deviation of logit p.  Vectorize for ease of computation
sig =Vectorize(function(x) sqrt(Bigma[1,1] + x^2*Bigma[2,2] + 2*x*Bigma[1,2]))

# New xs to make prediction on.
new_x = seq(-2, 2, 0.01)
logit_p = predict(model, newdata=list(x=new_x))
theta_L = logit_p - 1.96*sig(new_x)
theta_U = logit_p + 1.96*sig(new_x)

# Invert the estimates
p_L = plogis(theta_L)
p = plogis(logit_p)
p_U = plogis(theta_U)

d = data.frame(x=new_x, p_L, p, p_U)

# Now compare with builtin tools

fits = predict(model, newdata = list(x=new_x), se.fit = T) %>% 
       bind_cols() %>% 
       mutate(x=new_x) %>% 
       mutate(p = plogis(fit),
              p_L = plogis(fit - 1.96*se.fit),
              p_U = plogis(fit + 1.96*se.fit))

ggplot()+
  # R's computation of the confidence interval in Black
  geom_line(data=fits, aes(x, p))+
  geom_ribbon(data=fits, aes(x=x, ymin=p_L, ymax=p_U), alpha = 0.5)+
  # Out computation of the confidence interval in Red
  geom_line(data=d, aes(x, p), color = 'red')+
  geom_ribbon(data=d, aes(x=x, ymin=p_L, ymax=p_U), alpha = 0.5, fill='red')

Este es un ejemplo de salida

enter image description here

El rojo y el negro están uno encima del otro, lo que significa que el procedimiento manual reproduce la salida de los métodos incorporados de R para calcular el error estándar del ajuste. Puedes ejecutar este código para múltiples semillas aleatorias y verificar que producen las mismas estimaciones (al menos hasta unos pocos decimales, imagino).

0 votos

Y si x=1, entonces Var(logit(p)) = Var(beta_0) + Var(beta_1) + 2Cov(beta_0, beta_1), y si hago la raíz cuadrada, obtengo sig(new_x), y de nuevo invertiría las estimaciones para obtener p_L y p_U. ¿Tiene sentido?

0 votos

Algo no cuadra. Cuando introduzco logit_p = predict(model, newdata=list(x=0)), obtengo dos valores únicos. Yo esperaba uno....

0 votos

Ah - no necesito predict() para el caso en que x=0 - sólo necesito el intercepto del modelo, porque logit(p) = beta_0 + beta_1x, y si x=0, sólo necesito beta_0. Es obvio.

1voto

Neal Puntos 316

Hay tres o cuatro opciones para los intervalos de confianza.

Tienes una función no lineal de coeficientes en tu tercera ecuación, y puedes usar el método delta para calcular el aproximado varianza de esa función. Esto puede obtener valores fuera de $[0,1]$ intervalo, pero eso no es tan importante como la gente lo hace ver.

También puede predecir la parte de la función de índice ( $\beta_0 + \beta_1\cdot x)$ que es una función lineal de los coeficientes, obtener los límites inferior y superior de los IC para eso, y luego usar el logit inverso para obtener los IC en la escala de probabilidad. Estos deben estar dentro de $[0,1]$ . Esto es lo que sugirió Demetri Pananos más arriba.

En tercer lugar, se puede hacer un bootstrap de la parte de estimación y de predicción conjuntamente.

Pero como su $x$ es binario, se puede ajustar un modelo de probabilidad lineal con varianza robusta a la heterocedasticidad y acabar con ello. Este es posiblemente el camino más fácil de todos y le dará las mismas estimaciones puntuales e ICs muy similares.

Aquí está la salida de Stata anotada que muestra cómo hacer las cuatro cosas:

. set seed 9191945

. sysuse auto
(1978 automobile data)

. gen high_mpg = mpg>22

. logit foreign i.high_mpg, nolog

Logistic regression                                     Number of obs =     74
                                                        LR chi2(1)    =  14.76
                                                        Prob > chi2   = 0.0001
Log likelihood = -37.652732                             Pseudo R2     = 0.1639

------------------------------------------------------------------------------
     foreign | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
  1.high_mpg |   2.077817   .5699326     3.65   0.000     .9607695    3.194864
       _cons |  -1.767662   .4089589    -4.32   0.000    -2.569207   -.9661172
------------------------------------------------------------------------------

. /* Delta Method */
. margins high_mpg

Adjusted predictions                                        Number of obs = 74
Model VCE: OIM

Expression: Pr(foreign), predict()

------------------------------------------------------------------------------
             |            Delta-method
             |     Margin   std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
    high_mpg |
          0  |   .1458333   .0509424     2.86   0.004     .0459881    .2456785
          1  |   .5769231   .0968907     5.95   0.000     .3870209    .7668253
------------------------------------------------------------------------------

. /* inverse logit */
. margins high_mpg, predict(xb)

Adjusted predictions                                        Number of obs = 74
Model VCE: OIM

Expression: Linear prediction (log odds), predict(xb)

------------------------------------------------------------------------------
             |            Delta-method
             |     Margin   std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
    high_mpg |
          0  |  -1.767662   .4089589    -4.32   0.000    -2.569207   -.9661172
          1  |   .3101549   .3969581     0.78   0.435    -.4678687    1.088179
------------------------------------------------------------------------------

. transform_margins invlogit(@)
----------------------------------------------
             |         b         ll         ul
-------------+--------------------------------
    high_mpg |
          0  |  .1458333   .0711467   .2756551
          1  |  .5769231   .3851208   .7480386
----------------------------------------------

. /* Bootstrap */
. capture program drop savemargins

. program savemargins, rclass
  1.         logit foreign i.high_mpg, nolog
  2.         margins high_mpg, post
  3. end

. bootstrap _b, reps(200): savemargins
(running savemargins on estimation sample)

Bootstrap replications (200)
----+--- 1 ---+--- 2 ---+--- 3 ---+--- 4 ---+--- 5 
..................................................    50
..................................................   100
..................................................   150
..................................................   200

Adjusted predictions                                       Number of obs =  74
                                                           Replications  = 200

------------------------------------------------------------------------------
             |   Observed   Bootstrap                         Normal-based
             | coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
    high_mpg |
          0  |   .1458333   .0482008     3.03   0.002     .0513615    .2403052
          1  |   .5769231   .0963147     5.99   0.000     .3881497    .7656965
------------------------------------------------------------------------------

. /* Het-Robust LPM */
. regress foreign ibn.high_mpg, noconstant robust

Linear regression                               Number of obs     =         74
                                                F(2, 72)          =      21.23
                                                Prob > F          =     0.0000
                                                R-squared         =     0.4398
                                                Root MSE          =     .41375

------------------------------------------------------------------------------
             |               Robust
     foreign | Coefficient  std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
    high_mpg |
          0  |   .1458333   .0516451     2.82   0.006     .0428808    .2487859
          1  |   .5769231   .0982272     5.87   0.000     .3811108    .7727353
------------------------------------------------------------------------------

Todas las estimaciones puntuales son idénticas, y los IC son generalmente muy similares en los cuatro enfoques, incluso con 74 observaciones.

0 votos

Gracias Dimitriy, pero aquí no se ha proporcionado una fórmula.

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