Ajuste de un Poisson GLM en R: problemas con las tasas frente a los recuentos

11

Actualmente estoy trabajando en un proyecto que involucra GLM (y eventualmente GAM) de algunos datos de conteo a lo largo del tiempo. Normalmente haría esto en SAS, pero estoy tratando de pasar a R y tengo ... problemas.

Cuando ajusto un GLM para contar datos usando lo siguiente:

cdi_model <- glm(counts ~ exposure + covariate + month, data=test, family = poisson)

Yo obtengo:

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9825  -0.7903  -0.1187   0.5717   1.7649  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  1.97563    0.20117   9.821  < 2e-16 ***
exposure     0.94528    0.30808   3.068  0.00215 ** 
covariate   -0.01317    0.28044  -0.047  0.96254    
months      -0.03203    0.01303  -2.458  0.01398 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 40.219  on 29  degrees of freedom
Residual deviance: 29.297  on 26  degrees of freedom
AIC: 137.7

Number of Fisher Scoring iterations: 5

Ignore por un momento el rendimiento, o la falta de él, del modelo en sí, principalmente jugando con sintaxis y similares en este momento.

Sin embargo, cuando trato de ajustar los datos de la tasa (recuentos / persona-días) y uso un desplazamiento de esta manera: cdi_model <- glm(count_rate ~ exposure + covariate + months + offset(log(pd)), data=test, family = poisson)

Recibo más de 50 advertencias, todas "1: en dpois (y, mu, log = TRUE): no entero x = 0.002082" etc. Eso es más de uno para cada observación (solo hay 30 en el conjunto de datos).

Además, el ajuste del modelo parece ir a la olla. Salida de la siguiente manera:

 Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-0.0273656  -0.0122169   0.0002396   0.0072269   0.0258643  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept) -15.40110   15.12772  -1.018    0.309
exposure      0.84848   22.18012   0.038    0.969
covariate    -0.02751   21.31262  -0.001    0.999
months       -0.01889    0.95977  -0.020    0.984

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 0.0068690  on 29  degrees of freedom
Residual deviance: 0.0054338  on 26  degrees of freedom
AIC: Inf

Number of Fisher Scoring iterations: 9

A pesar de esto, si calculo la tasa predicha contra los datos reales, el ajuste no se ve mucho peor, y la estimación del efecto real no parece cambiar tanto.

¿Alguien tiene una idea de lo que está sucediendo, o si todo va bien y me falta algo debido a la inexperiencia?

Fomite
fuente

Respuestas:

17

Cuando agrega el desplazamiento, no necesita (y no debería) calcular también la tasa e incluir la exposición.

No sé si esta es la causa de los errores, pero si la exposición por caso es por persona pd, entonces la variable dependiente debería ser countsy la compensación debería ser log(pd)así:

cdi_model <- glm(counts ~ covariate + months + offset(log(pd)), 
                 data=test, family = poisson)
conjugadoprior
fuente
(+1) A veces he visto a epidemiólogos llamar a cualquier variable independiente de interés "exposición" (por ejemplo, "exposición a fumar cigarrillos"). Pero buena captura, definitivamente no debes usar la tasa como la variable dependiente.
Andy W
Habría adivinado que la variable 'meses' es la duración de la exposición, pero el principio sería el mismo.
Aniko
@ Aniko, supongo que lo descubriremos pronto. Estaba pensando que si es razonable pensar en una tasa como (counts/thing)entonces, el modelo lineal logarítmico es casi siempre counts ~ ... + offset(log(thing)). Y mientras estamos adivinando cosas, también predigo que log(pd) == exposure...
conjugateprior
Para aclarar algunas cosas, Andy W es correcto. La "exposición" es en realidad una variable de interés independiente (en este caso, un cambio en la política). Meses son solo "meses desde la fecha X" para permitir cierto control de las tendencias en los datos.
Fomite
@ConjugatePrior Al usar el modelo en su respuesta, ¿no debería la salida del modelo estar en una tasa? Ejecutarlo parece poner todo como un recuento bruto a pesar de la inclusión del desplazamiento. ¿O hay otro paso que me estoy perdiendo?
Fomite