alt text

Métodos estadísticos I

Tarea 13 - La rabia chilena como binomial negativa

En este ejercicio se busca replicar los resultados obtenidos por Favi, et. al. sobre los casos de rabia en Chile de 1989 a 2005, publicados en la revista [Revista Chilena de Infectologia][http://ref.scielo.org/jws58f].

Básicamente la idea es replicar la siguiente tabla:

Tabla 7

Sin embargo está tabla no se pudo reproducir con los mismos resultados, adicionalmente cabe señalar que algo extraño que tiene el artículo es que utiliza como variable respuesta la proporción de murcielagos con rabia, sin embargo la distribución de probabilidad utilizada corresponde a datos de conte. Por lo cual en este ejercicio se propone una metodología diferente. Con los mismos datos:

año <- 1989:2005
p_sos <- c(3, 5, 7, 7, 12, 15, 16, 48, 22, 9, 38, 67, 63, 108, 73, 81, 103)
t_sos <- c(15, 267, 92, 74, 55, 98, 270, 467, 301, 265, 76, 848, 741, 878, 744, 
    896, 1042)
p_vig <- c(0, 4, 1, 1, 5, 2, 2, 9, 8, 0, 0, 0, 0, 3, 1, 5, 1)
t_vig <- c(291, 164, 314, 305, 206, 61, 347, 756, 837, 625, 1510, 509, 337, 
    637, 694, 922, 747)

Supongamos que el interes de estudio consiste en observar si la proporción de murcielagos con rabia a aumentado, o cambiado, en el tiempo:


plot(año, (p_sos + p_vig)/(t_sos + t_vig), type = "b", pch = 16, col = 2, ylab = "Proporción de murcielagos con rabia")

plot of chunk plot1

Sin considerar autocorrelación en los datos, la primera opción consiste en utilizar un modelo de regresión logística, sin embargo a la manera en como se encuentra agrupada la información esto no es posible por lo cual se utiliza la función expand.table en el paquete epitools para generar un “data.frame” con un registro para cada observación:

library(epitools)

datos <- matrix(nrow = 17, ncol = 2, dimnames = list(año = año, rabia = c(1, 
    0)))
datos[, 1] <- p_sos + p_vig
datos[, 2] <- t_sos + t_vig - (p_sos + p_vig)

datos  #esta es la tabla con los datos agrupados
##       rabia
## año      1    0
##   1989   3  303
##   1990   9  422
##   1991   8  398
##   1992   8  371
##   1993  17  244
##   1994  17  142
##   1995  18  599
##   1996  57 1166
##   1997  30 1108
##   1998   9  881
##   1999  38 1548
##   2000  67 1290
##   2001  63 1015
##   2002 111 1404
##   2003  74 1364
##   2004  86 1732
##   2005 104 1685

library(epitools)
expandidos <- expand.table(datos)  #con esta función expandimos la tabla de contingencia a una versión completa por registro
# mostramos los primeros diez registros
expandidos[1:10, ]
##     año rabia
## 1  1989     1
## 2  1989     1
## 3  1989     1
## 4  1989     0
## 5  1989     0
## 6  1989     0
## 7  1989     0
## 8  1989     0
## 9  1989     0
## 10 1989     0

A partir de los datos expandidos ajustamos el modelo de regresión logística:

m_log_exp <- glm(rabia ~ as.integer(año), family = binomial(logit), data = expandidos)
summary(m_log_exp)
## 
## Call:
## glm(formula = rabia ~ as.integer(año), family = binomial(logit), 
##     data = expandidos)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -2.769   0.263   0.299   0.329   0.351  
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      3.87683    0.13023   29.77  < 2e-16 ***
## as.integer(año) -0.06587    0.00992   -6.64  3.1e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5902.1  on 16390  degrees of freedom
## Residual deviance: 5854.6  on 16389  degrees of freedom
## AIC: 5859
## 
## Number of Fisher Scoring iterations: 6

Otra alternativa consiste en utilizar la opción de pesos en la función de modelos lineales generalizados, pero para esto es necesario presentar de otra manera los datos, de manera similar como una tabla de contingencia sin embargo ahora ponemos la variable rabia tambien en los renglones, y utilizamos las frecuencias como pesos

datos_2 <- matrix(nrow = 17 * 2, ncol = 3, dimnames = list(rep(1:17, 2), c("año", 
    "rabia", "Freq")))
datos_2[, 1] <- c(año, año)
datos_2[, 2] <- c(rep(1, 17), rep(0, 17))
datos_2[, 3] <- c(datos[, 1], datos[, 2])

datos_2  #esta tabla es la que se utiliza para ajustar el modelo.
##     año rabia Freq
## 1  1989     1    3
## 2  1990     1    9
## 3  1991     1    8
## 4  1992     1    8
## 5  1993     1   17
## 6  1994     1   17
## 7  1995     1   18
## 8  1996     1   57
## 9  1997     1   30
## 10 1998     1    9
## 11 1999     1   38
## 12 2000     1   67
## 13 2001     1   63
## 14 2002     1  111
## 15 2003     1   74
## 16 2004     1   86
## 17 2005     1  104
## 1  1989     0  303
## 2  1990     0  422
## 3  1991     0  398
## 4  1992     0  371
## 5  1993     0  244
## 6  1994     0  142
## 7  1995     0  599
## 8  1996     0 1166
## 9  1997     0 1108
## 10 1998     0  881
## 11 1999     0 1548
## 12 2000     0 1290
## 13 2001     0 1015
## 14 2002     0 1404
## 15 2003     0 1364
## 16 2004     0 1732
## 17 2005     0 1685

Y el modelo es el siguiente

m_log_tab <- glm(rabia ~ año, family = binomial(logit), weights = Freq, data = as.data.frame(datos_2))
summary(m_log_tab)
## 
## Call:
## glm(formula = rabia ~ año, family = binomial(logit), data = as.data.frame(datos_2), 
##     weights = Freq)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -14.401   -8.805    0.931   13.372   25.831  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.35e+02   1.98e+01   -6.79  1.1e-11 ***
## año          6.59e-02   9.92e-03    6.64  3.1e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5902.1  on 33  degrees of freedom
## Residual deviance: 5854.6  on 32  degrees of freedom
## AIC: 5859
## 
## Number of Fisher Scoring iterations: 6

Contrario a lo que esperabamos, los resultados no son los mismos, es decir los esperados, de manera análoga a lo que sucedio con la opción de pesos para la funcion de modelo lineal en un ejercicio anterior. Sería necesario revisar la documentación, y probablemente directamente el código de la función, sin embargo no es el objetivo de este ejercicio.

Ahora supongamos que el objetivo del estudio no consiste en saber si hay una mayor proporción de murcielagos con rabia, sino saber si hay más murcielagos con rabia, lo cual puede ser una pregunta más relevante en términos de salud pública, sin considerar los tamaños de muestra tenemos los siguientes conteos de murcielagos con rabia:


plot(año, (p_sos + p_vig), type = "b", pch = 16, col = 4, ylab = "Murcielagos con rabia")

plot of chunk plot2

De entrada notamos que la tendencia en este caso es muy clara. Ajustemos pues el modelo sin considerar el tamaño de muestra:

library(MASS)
m_bn_t <- glm.nb(datos[, 1] ~ año)
summary(m_bn_t)
## 
## Call:
## glm.nb(formula = datos[, 1] ~ año, init.theta = 6.994900521, 
##     link = log)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -2.569  -0.583  -0.278   0.227   2.339  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -368.9320    44.0678   -8.37   <2e-16 ***
## año            0.1864     0.0221    8.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(6.995) family taken to be 1)
## 
##     Null deviance: 86.097  on 16  degrees of freedom
## Residual deviance: 17.088  on 15  degrees of freedom
## AIC: 138.9
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  6.99 
##           Std. Err.:  3.04 
## 
##  2 x log-likelihood:  -132.88

…Sin embargo quizá vale la pena considerar los tamaños de muestra, ¿qué pasa cuando vemos el número de conteos frente al tamaño de muestra?..


plot(año, (t_sos + t_vig), type = "b", pch = 16, col = 3, ylab = "Murcielagos", 
    ylim = c(0, max(t_sos + t_vig)))
lines(año, (p_sos + p_vig), type = "b", pch = 16, col = 4)
legend("topleft", bty = "n", legend = c("Con rabia", "Totales"), lty = 1, pch = 16, 
    col = c(4, 3))

plot of chunk plot3

Ok… ya no se que pensar…

Ajustemos pues considerando el tamaño de muestra como pesos para el modelo:

m_bn_w <- glm.nb(datos[, 1] ~ año, weights = datos[, 1] + datos[, 2])
summary(m_bn_t)
## 
## Call:
## glm.nb(formula = datos[, 1] ~ año, init.theta = 6.994900521, 
##     link = log)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -2.569  -0.583  -0.278   0.227   2.339  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -368.9320    44.0678   -8.37   <2e-16 ***
## año            0.1864     0.0221    8.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(6.995) family taken to be 1)
## 
##     Null deviance: 86.097  on 16  degrees of freedom
## Residual deviance: 17.088  on 15  degrees of freedom
## AIC: 138.9
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  6.99 
##           Std. Err.:  3.04 
## 
##  2 x log-likelihood:  -132.88

Pero queda la pregunta ¿Esto que significa?