Estimación de razones de riesgo ajustadas en datos binarios usando la regresión de Poisson

9

Estoy interesado en estimar una razón de riesgo ajustada, análoga a cómo se estima una razón de probabilidad ajustada usando regresión logística. Parte de la literatura (p. Ej., Esto ) indica que usar la regresión de Poisson con los errores estándar de Huber-White es una forma basada en el modelo para hacer esto.

No he encontrado literatura sobre cómo el ajuste por covariables continuas afecta esto. La siguiente simulación simple demuestra que este problema no es tan sencillo:

arr <- function(BLR,RR,p,n,nr,ce)
{
   B = rep(0,nr)
   for(i in 1:nr){
   b <- runif(n)<p 
   x <- rnorm(n)
   pr <- exp( log(BLR) + log(RR)*b + ce*x)
   y <- runif(n)<pr
   model <- glm(y ~ b + x, family=poisson)
   B[i] <- coef(model)[2]
   }
   return( mean( exp(B), na.rm=TRUE )  )
}

set.seed(1234)
arr(.3, 2, .5, 200, 100, 0)
[1] 1.992103
arr(.3, 2, .5, 200, 100, .1)
[1] 1.980366
arr(.3, 2, .5, 200, 100, 1)
[1] 1.566326 

En este caso, la verdadera razón de riesgo es 2, que se recupera de manera confiable cuando el efecto covariable es pequeño. Pero, cuando el efecto covariable es grande, esto se distorsiona. Supongo que esto surge porque el efecto covariable puede empujar hacia arriba contra el límite superior (1) y esto contamina la estimación.

He buscado pero no he encontrado ninguna literatura sobre el ajuste por covariables continuas en la estimación de la razón de riesgo ajustada. Soy consciente de las siguientes publicaciones en este sitio:

pero no responden mi pregunta ¿Hay algún documento sobre esto? ¿Hay alguna precaución conocida que deba ejercerse?

kjetil b halvorsen
fuente
1
Puede ser de su interés: aje.oxfordjournals.org/content/162/3/199.full
StatsStudent
También este Q&A stats.stackexchange.com/questions/18595/… puede ayudar.
mdewey

Respuestas:

1

No sé si aún necesita una respuesta a esta pregunta, pero tengo un problema similar en el que me gustaría usar la regresión de Poisson. Al ejecutar su código, descubrí que si configuro el modelo como

model <- glm(y ~ b + x, family=binomial(logit)

en lugar de su modelo de regresión de Poisson, se produce el mismo resultado: el OR estimado es ~ 1.5 a medida que se aproxima ce 1. Por lo tanto, no estoy seguro de que su ejemplo proporcione información sobre un posible problema con el uso de la regresión de Poisson para resultados binarios.

David F
fuente
1
El problema con el ajuste de un modelo logit, si bien no conduce a riesgos predichos mayores que 1, es que la razón de probabilidades es un estimador sesgado de la razón de riesgo y ese sesgo aumenta dramáticamente a medida que el resultado se vuelve más frecuente. Puede especificar binomial(link=log)que realmente se ajuste a un modelo de riesgo relativo, pero rara vez converge debido a la predicción excesiva de resultados.
AdamO
1

Encuentro que usar la máxima verosimilitud directa con la función de probabilidad adecuada mejora en gran medida la estimación del riesgo relativo. Puede especificar directamente la función de riesgo truncado como la tasa prevista para el proceso.

ingrese la descripción de la imagen aquí

Usualmente usamos el Hessian para crear CIs para la estimación. No he explorado la posibilidad de usar eso como la matriz "B" (carne) en el error de Huber White y usar los riesgos ajustados para obtener la matriz "A" (pan) ... ¡pero sospecho que podría funcionar! De manera más factible, puede usar un bootstrap para obtener errores del modelo que sean robustos para una relación de media-varianza mal especificada.

## the negative log likelihood for truncated risk function
negLogLik <- function(best, X, y) { 
  pest <- pmin(1, exp(X %*% best))
  -sum(dpois(x = y, lambda = pest, log=TRUE))
}

set.seed(100)

sim <- replicate(100, {
  n <- 200
  X <- cbind(1, 'b'=rbinom(n, 1, 0.5), 'x'=rnorm(n))
  btrue <- c(log(0.3), log(2), 1)
  ptrue <- pmin(1, exp(X %*% matrix(btrue)))
  y <- rbinom(n, 1, ptrue) ## or just take y=ptrue for immediate results
  nlm(f = logLik, p = c(log(mean(y)),0,0), X=X, y=y)$estimate
})

rowMeans(exp(sim))

Da:

> rowMeans(exp(sim))
[1] 0.3002813 2.0680780 3.0888280

El coeficiente medio te da lo que quieres.

AdamO
fuente