example of application in time series analysis - see vignette(“dlnmTS”)

para la aplicación de modelos lineales y no lineales de retardo distribuido (DLM y DLNM) en el análisis de series temporales. El desarrollo de DLM y DLNM y la implementación del software original para datos de series de tiempo se ilustran enGasparrini et al.[2010] yGasparrini[2011].

Los ejemplos descritos en las siguientes secciones cubren la mayoría de las aplicaciones estándar de la metodología DLNM para datos de series de tiempo y exploran las capacidades del paquete dlnm para especificar, resumir y trazar esta clase de modelos. A pesar de la aplicación específica sobre los efectos en la salud de la contaminación del aire y la temperatura, estos ejemplos se generalizan fácilmente a diferentes temas y forman una base para el análisis de este conjunto de datos u otras fuentes de datos de series temporales. Los resultados incluidos en este documento no pretenden representar hallazgos científicos, sino que se informan con el único propósito de ilustrar las capacidades deldlnmpaquete.

2 Datos

Los ejemplos incluidos en la las asociaciones entre la contaminación del aire y la temperatura con la mortalidad, utilizando un conjunto de datos de series temporales con observaciones diarias para la ciudad de Chicago en el período 1987-2000.

Este conjunto de datos está incluido en el paquete como el marco de datoschicago nmmaps,y se describe en la página de ayuda relacionada (help(chicagoNMMAPS)y la viñetadlnmResumen). Después de cargar el paquete en elRsesión, echemos un vistazo a las tres primeras observaciones:

library(dlnm)
## This is dlnm 2.4.7. For details: help(dlnm) and vignette('dlnmOverview').
library(DT)
DT::datatable(chicagoNMMAPS)

El conjunto de datos está compuesto por una serie completa de observaciones equiespaciadas tomadas cada día en el período 1987-2000. Esto representa el formato requerido para aplicar DLNM en datos de series de tiempo.

3 Ejemplo 1: un DLM sencillo

En este primer ejemplo, especifico un DLM simple, evaluando el efecto de PM10 sobre la mortalidad, mientras se ajusta por el efecto de la temperatura. Para hacerlo, primero construyo dos matrices de base cruzada para los dos 2 predictores, y luego incluirlos en una fórmula modelo de una función de regresión. El efecto de PM10 se supone lineal en la dimensión del predictor, por lo que, desde este punto de vista, podemos definir esto como un DLM simple, incluso si el modelo de regresión también estima la función de retraso distribuida para la temperatura, que se incluye como un término no lineal.

Primero, crossbasis() para construir las dos matrices de base cruzada, guardándolas en dos objetos. Los nombres de los dos objetos deben ser diferentes para poder predecir las asociaciones por separado para cada uno de ellos

cb1.pm <- crossbasis(chicagoNMMAPS$pm10, lag=15,
                     argvar=list(fun="lin"),
                     arglag=list(fun="poly",degree=4))
cb1.temp <- crossbasis(chicagoNMMAPS$temp, lag=3,
                       argvar=list(df=5),
                       arglag=list(fun="strata",breaks=1))

En aplicaciones con datos de series temporales, el primer argumento X se utiliza para especificar la serie de vectores.

La función pasa internamente los argumentos en argvary arglag a onebasis()con el fin de construir la base para predictor y retrasos, respectivamente. En este caso, asumimos que el efecto de PM10 es lineal (fun="lin"), mientras modela la relación con la temperatura a través de un spline cúbico natural con 5 grados de libertad (fun="ns",elegido por defecto). Los nudos internos (si no se proporcionan) son colocados por ns() en los cuantiles equidistantes predeterminados, mientras que los nudos límite se encuentran en el rango de temperatura, por lo que solo df.debe epecificarse.

En cuanto a las bases para el espacio de los rezagos, especifico el efecto rezagado de PM10hasta 15 días de retraso (mínimo retraso igual a 0 por defecto), con un función polinomial de grado 4 (configuración degree=4).El efecto retardado de la temperatura está definido por dos estratos de retardo (0 y 1-3), asumiendo que los efectos son constantes dentro de cada estrato. El argumento breaks = 1 define el límite inferior del segundo intervalo.

La función de método proporciona una descripción general de las especificaciones para la base cruzada (y las bases relacionadas en las dos dimensiones).summary()para esta clase:

summary(cb1.pm)
## CROSSBASIS FUNCTIONS
## observations: 5114 
## range: -3.049835 to 356.1768 
## lag period: 0 15 
## total df:  5 
## 
## BASIS FOR VAR:
## fun: lin 
## intercept: FALSE 
## 
## BASIS FOR LAG:
## fun: poly 
## degree: 4 
## scale: 15 
## intercept: TRUE
summary(cb1.temp)
## CROSSBASIS FUNCTIONS
## observations: 5114 
## range: -26.66667 to 33.33333 
## lag period: 0 3 
## total df:  10 
## 
## BASIS FOR VAR:
## fun: ns 
## knots: 0.2777778 6.666667 14.44444 20.94444 
## intercept: FALSE 
## Boundary.knots: -26.66667 33.33333 
## 
## BASIS FOR LAG:
## fun: strata 
## df: 2 
## breaks: 1 
## ref: 1 
## intercept: TRUE

ahora las dos bases cruzadas los objetos se pueden incluir en una fórmula de modelo de un modelo de regresión. Los paquete spline. En este caso, ajusté el modelo de serie temporal asumiendo una distribución de Poisson sobredispersa, que incluye una función de tiempo suave con 7 df/año (para corregir la estacionalidad y la tendencia a largo plazo) y el día de la semana como factor:

library(splines)
model1 <- glm(death ~ cb1.pm + cb1.temp + ns(time, 7*14) + dow,
              family=quasipoisson(), chicagoNMMAPS)

La asociación estimada con niveles específicos de PM10sobre la mortalidad, predicha por el modelo anterior, se puede resumir mediante la crosspred()y guardado en un objeto con la misma clase:

pred1.pm <- crosspred(cb1.pm, model1, at=0:20, bylag=0.2,
                      cumul=TRUE)

La función incluye la basis1.pm y model1 objetos utilizados para estimar los parámetros como los dos primeros argumentos, mientras que at= 0:20 establece que la predicción debe calcularse para cada valor entero de 0 a 20 $µgr/m^3$. Configurandobylag=0.2,la predicción se calcula a lo largo del espacio de retraso con un incremento de 0,2. Esta cuadrícula más fina está destinada a producir una curva de retraso más suave cuando se trazan los resultados. El argumentocumul(por defecto FALSO)indica que también se deben incluir asociaciones acumulativas incrementales a lo largo de los retrasos (nota: esta predicción solo se devuelve para retrasos enteros). No se define el centrado a través del argumento.cen,y el valor de referencia por lo tanto se establece en el valor 0 por defecto (esto sucede para la funciónlin()).Ahora que las predicciones se han almacenado enpred1.pm`,se pueden trazar mediante funciones de método específicas. Por ejemplo:

plot(pred1.pm, "slices", var=10, col=3, ylab="RR",
     ci.arg=list(density=15,lwd=2),
     main="Lag-response curve for a 10-unit increase in PM10")

plot(pred1.pm, "slices", var=10, col=2, cumul=TRUE,
     ylab="Cumulative RR",
     main="Lag-response curve of incremental cumulative effects")

La función incluye pred1.pm objeto con los resultados almacenados, y el argumento slices define que queremos graficar la relación correspondiente a valores específicos de predictor y retraso en el relacionado dimensiones.

Con var=10, muestra la relación de respuesta de retraso para un valor específico de PM10, es decir 10gr/m3. Esta asociación se define utilizando el valor de referencia de 0 gr/m3, proporcionando así la asociación de predictor específico para un aumento de 10 unidades. También elegí un color diferente para la primera trama. El argumento cumul indica si las asociaciones acumulativas incrementale, previamente guardadas en pred1.pm, debe ser ploteado. Los resultados se muestran en las Figuras. Los intervalos de confianza se establecen en el valor predeterminado valor “área” para el argumento ci. En el panel izquierdo, los argumentos adicionales se pasan al nivel bajo función de trazado polygon() a través de ci.arg, para dibujar en su lugar líneas de sombreado como intervalos de confianza.

La interpretación de estos gráficos es doble: la curva de retraso representa el aumento del riesgo en cada día futuro después de un aumento de PM_10 \(µgr/m^3\) en un día específico (interpretación directa), o en su defecto las aportaciones de cada día pasado con el mismo PM10 aumento del riesgo en un día específico (interpretación inversa).

Las parcelas en Figuras sugieren que el aumento inicial en el riesgo de PM10 se invierte en retrasos más largos. El efecto acumulativo general de un aumento de 10 unidades en PM10 más de 15 días de retraso (es decir, sumandotodas las contribuciones hasta el retraso máximo), junto con sus intervalos de confianza del 95% pueden ser extraídos por los objetosallRRfit,allRRhighYallRRlowincluidos enpred1.pm, `

pred1.pm$allRRfit["10"]
##        10 
## 0.9997563
cbind(pred1.pm$allRRlow, pred1.pm$allRRhigh)["10",]
## [1] 0.9916871 1.0078911

example of application beyond time series - see vignette(“dlnmExtended”)

generate the matrix of exposure histories from the 5-year periods

Qnest <- t(apply(nested, 1, function(sub) exphist(rep(c(0,0,0,sub[5:14]), each=5), sub[“age”], lag=c(3,40))))

define the cross-basis

cbnest <- crossbasis(Qnest, lag=c(3,40), argvar=list(“bs”,degree=2,df=3), arglag=list(fun=“ns”,knots=c(10,30),intercept=FALSE)) summary(cbnest)

run the model and predict

library(survival) mnest <- clogit(case~cbnest+strata(riskset), nested) pnest <- crosspred(cbnest,mnest, cen=0, at=0:20*5)

bi-dimensional exposure-lag-response association

plot(pnest, zlab=“OR”, xlab=“Exposure”, ylab=“Lag (years)”) # lag-response curve for dose 60 plot(pnest, var=50, ylab=“OR for exposure 50”, xlab=“Lag (years)”, xlim=c(0,40)) # exposure-response curve for lag 10 plot(pnest, lag=5, ylab=“OR at lag 5”, xlab=“Exposure”, ylim=c(0.95,1.15))

example of extended predictions - see vignette(“dlnmExtended”)

compute exposure profiles and exposure history

expnested <- rep(c(10,0,13), c(5,5,10)) hist <- exphist(expnested, time=length(expnested), lag=c(3,40))

predict association with a specific exposure history

pnesthist <- crosspred(cbnest, mnest, cen=0, at=hist) with(pnesthist, c(allRRfit,allRRlow,allRRhigh))

example of user-defined functions - see vignette(“dlnmExtended”)

define a log function

mylog <- function(x) log(x+1)

define the cross-basis

cbnest2 <- crossbasis(Qnest, lag=c(3,40), argvar=list(“mylog”), arglag=list(fun=“ns”,knots=c(10,30),intercept=FALSE)) summary(cbnest2)

run the model and predict

mnest2 <- clogit(case~cbnest2+strata(riskset), nested) pnest2 <- crosspred(cbnest2, mnest2, cen=0, at=0:20*5)

plot and compare with previous fit

plot(pnest2, zlab=“OR”, xlab=“Exposure”, ylab=“Lag (years)”) plot(pnest2, var=50, ylab=“OR for exposure 50”, xlab=“Lag (years)”, xlim=c(0,40)) lines(pnest, var=50, lty=2) plot(pnest2, lag=5, ylab=“OR at lag 5”, xlab=“Exposure”, ylim=c(0.95,1.15)) lines(pnest, lag=5, lty=2)

example of penalized models - see vignette(“dlnmPenalized”)

to be added soon