Skip to contents

Objetivo

Al final de este tutorial usted será capaz de transformar una serie diaria de salud alineada al clima en inferencia epidemiológica: estimar la relación no lineal y rezagada entre temperatura y mortalidad con un DLNM (sus_mod_dlnm()), cuantificar la carga atribuible al calor y al frío (sus_mod_af()), y conocer las demás herramientas del sombrero bioestadístico del climasus4r — series temporales interrumpidas (sus_mod_its()), case-crossover (sus_mod_casecrossover()) y metaanálisis multi-ciudad (sus_mod_pool()).

El modelado es la última etapa del pipeline. Consume la salida de las etapas anteriores (la serie de salud agregada del Tutorial 4 y la exposición climática alineada de los Tutoriales 7 y 8) y produce estimaciones de riesgo relativo, fracciones atribuibles y visualizaciones listas para publicación.

Contexto científico

La epidemiología ambiental moderna trata la asociación entre una exposición ambiental (temperatura, contaminantes) y un desenlace diario de conteo (defunciones, hospitalizaciones) como un problema no lineal y rezagado en el tiempo. El calor extremo mata el mismo día o en 1–2 días (efecto agudo); el frío mata a lo largo de una a dos semanas (efecto tardío y prolongado). Modelar solo la temperatura del día subestima el efecto del frío.

El Distributed Lag Non-linear Model (DLNM) de Gasparrini, Armstrong & Kenward (2010) resuelve esto con una cross-basis: el producto externo de dos bases de splines — una en la dimensión de la exposición (captura la curva en U/J: el riesgo sube en el frío y en el calor) y otra en la dimensión del lag (captura cómo se distribuye el efecto a lo largo de los días). La implementación en R es el paquete dlnm (Gasparrini, 2011), sobre el cual climasus4r construye sus_mod_dlnm().

El ajuste sigue las buenas prácticas de regresión de series temporales en epidemiología ambiental sistematizadas por Bhaskaran et al. (2013): modelo log-lineal cuasi-Poisson (robusto frente a la sobredispersión), control de la tendencia de largo plazo y de la estacionalidad mediante spline natural del tiempo, y ajuste por día de la semana. La fracción atribuible descompone la carga total de eventos en componentes de calor y frío (Gasparrini & Armstrong, 2013).

Caso conductor. Investigamos la temperatura y los desenlaces de salud en adultos mayores (60+) en la Región Metropolitana de São Paulo, 2014–2019 (respiratorios J00–J99 y cardiovasculares I00–I99). Aquí unimos la serie diaria de defunciones (caso_serie.rds, Tutorial 4) con la temperatura de la estación INMET A701 (São Paulo – Mirante de Santana) ya alineada (caso_clima_estacao.rds, Tutorial 7), armamos la estructura de rezagos distribuidos y ajustamos el DLNM para estimar la curva exposición-respuesta y la carga atribuible al calor y al frío.

Datos utilizados

Entrada Origen Contenido Papel
dados/caso_serie.rds Tutorial 4 Serie diaria de defunciones (adultos mayores 60+) Desenlace n_obitos
dados/caso_clima_estacao.rds Tutorial 7 Temperatura diaria de la estación A701 Exposición tair_dry_bulb_c

Las dos series se unen por fecha. La exposición se expande luego en columnas de rezago distribuido (tair_dry_bulb_c_lag0, …, tair_dry_bulb_c_lag21), estructura que en el flujo completo se produce con sus_climate_aggregate(temporal_strategy = "distributed_lag", lag_days = 21). El script protege la etapa con requireNamespace()/tryCatch() y, si faltan las entradas, genera una serie sintética mínima realista (con señal temperatura-mortalidad en V) solo con fines ilustrativos.

Pipeline completo

Los bloques a continuación reproducen lo que ejecuta scripts/tutorial_09_modelagem.R.

library(climasus4r)

Armar la entrada del DLNM (rezagos distribuidos)

sus_mod_dlnm() espera un climasus_df en la etapa "climate" y tipo "distributed_lag", con la columna date, el desenlace y las columnas {variável}_lag0 … _lagL. En un flujo real, esto proviene de sus_climate_aggregate():

df_dl <- sus_climate_aggregate(
  health_data       = caso_serie,          # série de saúde (do Tutorial 4)
  climate_data      = caso_clima_estacao,  # temperatura alinhada (do Tutorial 7)
  climate_var       = "tair_dry_bulb_c",
  temporal_strategy = "distributed_lag",
  lag_days          = 21,
  lang              = "pt"
)

Ajustar el DLNM (sus_mod_dlnm)

Cross-basis con exposición en spline natural de 4 grados de libertad (captura el U/J calor+frío) y lag en spline natural de 3 grados (decaimiento suave), familia cuasi-Poisson y control estacional automático (dof_per_year = 6, recomendado para el Brasil subtropical):

fit <- sus_mod_dlnm(
  df           = df_dl,
  outcome_col  = "n_obitos",
  climate_col  = "tair_dry_bulb_c",
  lag_max      = 21,
  argvar       = list(fun = "ns", df = 4),  # dimensão exposição
  arglag       = list(fun = "ns", df = 3),  # dimensão lag
  family       = "quasipoisson",
  dof_per_year = 6L,                        # gl/ano para sazonalidade
  lang         = "pt"
)

print(fit)
fit$exposure_response   # RR cumulativo na grade de percentis
fit$lag_response        # RR por lag no percentil 75
fit$diagnostics$disp_ratio

Fracción atribuible al calor y al frío (sus_mod_af)

A partir del DLNM ajustado, descomponemos la carga total de defunciones en componentes de calor (por encima del umbral de confort) y frío (por debajo), con IC por simulación de Monte Carlo:

af <- sus_mod_af(
  fit  = fit,
  by   = "month",   # quebra mensal opcional
  nsim = 200L,      # use 5000L para qualidade de publicação
  lang = "pt"
)

print(af)
af$total        # FA/NA total, calor e frio
af$by_period    # quebra mensal

Visualizar (sus_mod_plot_dlnm)

El paquete ofrece visualizaciones científicas listas — curva exposición-respuesta, lag-respuesta, superficie 3D, contorno, cortes por lag, distribución y serie temporal:

sus_mod_plot_dlnm(fit, type = "overall", lang = "pt")  # exposição-resposta
sus_mod_plot_dlnm(fit, type = "contour", lang = "pt")  # superfície log(RR)
sus_mod_plot_dlnm(fit, type = "lag",     lang = "pt")  # lag-resposta

Características de las funciones

sus_mod_dlnm() — Distributed Lag Non-linear Model

Argumento ¿Esencial? Descripción
df sí climasus_df en stage = "climate", type = "distributed_lag"
outcome_col sí Columna de conteo diario (ej.: "n_obitos")
climate_col opcional Base de la exposición sin sufijo _lagN; NULL autodetecta
lag_max opcional Rezago máximo; NULL detecta a partir del mayor _lagN presente
argvar opcional Base de la exposición (ej.: list(fun = "ns", df = 4))
arglag opcional Base del lag (ej.: list(fun = "ns", df = 3))
family opcional "quasipoisson" (predeterminado), "poisson", "negbin" (→ cuasi)
ns_df / dof_per_year opcional Grados de libertad del spline temporal (estacionalidad)
ref_value opcional Valor de referencia (RR = 1); NULL usa la mediana
covariates opcional Confusores lineales adicionales (humedad, etc.)

Retorno: un objeto climasus_dlnm con $model (GLM), $crossbasis, $pred (crosspred en una grilla de 100 puntos), $exposure_response, $lag_response, $models (resumen de una línea), $data_daily y $diagnostics (dispersión, autocorrelación de Ljung-Box, AIC).

sus_mod_af() — Fracción y Número Atribuible

Argumento Descripción
fit Objeto climasus_dlnm de sus_mod_dlnm()
threshold Umbral que separa calor (por encima) y frío (por debajo); NULL usa ref_value
pred_at Percentiles de las franjas (predeterminado c(0.75, 0.90, 0.95, 0.99))
by Corte temporal: "month", "year", "season" o NULL
nsim Simulaciones de Monte Carlo para el IC (predeterminado 1000L)
alpha Nivel de significancia (predeterminado 0.05 → IC 95%)

Retorno: climasus_af con $total (total/calor/frío), $by_quantile, $by_period, $daily y $custom.

sus_mod_its() — Series Temporales Interrumpidas

Regresión Poisson segmentada para el efecto de intervenciones (políticas, eventos extremos, pandemia) sobre una serie de conteo (Bernal et al., 2017).

Argumento Descripción
data climasus_df (aggregate/climate) o data.frame con fecha + conteo
outcome_col / date_col Columnas de desenlace y fecha
interruption_dates Una o más fechas de intervención (dentro del intervalo)
harmonics Pares senoidales para la estacionalidad (predeterminado 2L)
family "quasipoisson" (predeterminado) o "poisson"
counterfactual Proyecta la tendencia previa a la intervención (predeterminado TRUE)

Retorno: climasus_its con $effects (cambio de nivel y de tendencia), $counterfactual y $segments.

sus_mod_casecrossover() — Case-Crossover Estratificado en el Tiempo

Cada estrato temporal (mes/semana) es su propio control, eliminando la tendencia y la estacionalidad por diseño (Maclure, 1991; Armstrong et al., 2014).

Argumento Descripción
data climasus_df o data.frame con date, desenlace y exposición
outcome_col / exposure_col Desenlace y exposición (sin autodetección)
stratum "month" (predeterminado), "week" o columna existente
lag Rezago entero único o vector (media móvil, ej.: 0:6)
method "conditional_poisson" (predeterminado) o "clogit"
family "quasipoisson" (predeterminado) o "poisson"

Retorno: climasus_casecrossover con $or_table (OR, IC, p) y $diagnostics.

sus_mod_pool() — Metaanálisis Multi-ciudad

Combina estimaciones DLNM de varias ciudades mediante metaanálisis multivariado (REML vía mvmeta), produciendo curva combinada, heterogeneidad (Q, I²) y BLUPs por ciudad (Gasparrini et al., 2012).

Argumento Descripción
fits Lista nombrada de objetos climasus_dlnm (misma cross-basis)
method "reml" (predeterminado), "ml" o "fixed"
blup Calcula predicciones BLUP por ciudad (predeterminado TRUE)
pred_at Percentiles de la tabla combinada

Retorno: climasus_pool con $exposure_response, $lag_response, $heterogeneity, $city_table y $blup_preds.

Formulación estadística

El DLNM modela el conteo diario YtY_t como cuasi-Poisson con media μt\mu_t. El predictor log-lineal combina la cross-basis cb(xt,ℓ;β)\mathrm{cb}(x_t, \ell; \beta) — el efecto de la historia de exposición xt,xt−1,…,xt−Lx_{t}, x_{t-1}, \ldots, x_{t-L} — con el control de estacionalidad (spline natural del tiempo) y de día de la semana (DOW):

log⁡𝔼(Yt)=α+cb(xt,ℓ;β)+ns(tempo)+DOW. \log\,\mathbb{E}(Y_t) \;=\; \alpha \;+\; \mathrm{cb}(x_t,\,\ell;\,\beta) \;+\; \mathrm{ns}(\text{tempo}) \;+\; \mathrm{DOW}.

La cross-basis es el producto externo de una base en la exposición (argvar) y una base en el lag (arglag). El efecto acumulado a lo largo de todos los rezagos, en el nivel de exposición xx relativo a la referencia x0x_0, es

RRcum(x)=exp⁡{∑ℓ=0L[f(x,ℓ)−f(x0,ℓ)]}. RR_{\text{cum}}(x) \;=\; \exp\!\left\{ \sum_{\ell=0}^{L} \big[ f(x,\ell) - f(x_0,\ell) \big] \right\}.

La fracción atribuible acumulada asociada a la historia de exposición sigue la forma (Gasparrini & Armstrong, 2013):

AF=1−exp⁡(−∑ℓ=0Lβℓxt−ℓ),ANt=Yt(1−1RRt), AF \;=\; 1 - \exp\!\left( -\sum_{\ell=0}^{L} \beta_\ell\, x_{t-\ell} \right), \qquad AN_t \;=\; Y_t \left( 1 - \frac{1}{RR_t} \right),

con el número atribuible diario ANtAN_t sumado a lo largo del período y el IC obtenido por simulación de Monte Carlo de los coeficientes de la cross-basis.

Decisiones de modelado

  • Sobredispersión. Los conteos de defunciones típicamente tienen varianza mayor que la media (ϕ̂>1\hat\phi > 1). La familia cuasi-Poisson infla el error estándar por ϕ̂\sqrt{\hat\phi} y se recomienda cuando la razón de dispersión supera ~1,5 (Armstrong, 2006). La alternativa binomial negativa (NB) es incompatible con dlnm::crossbasis() y climasus4r la redirige a cuasi-Poisson.
  • Elección de nodos (knots) y rezagos. Para la exposición, ns con 4 gl captura bien la forma en U/J (frío + calor); 3 gl es más conservador, 5 gl exige N grande. Para el lag, ns con 3 gl modela el decaimiento suave típico de temperatura-mortalidad; el rezago máximo de 21 días cubre el efecto tardío y prolongado del frío (Gasparrini, 2011).
  • Estacionalidad. El spline natural del tiempo absorbe la tendencia de largo plazo y el ciclo anual que confunden la asociación. Se recomienda ~dof_per_year = 4 para 1–2 años y 6–8 para el Brasil subtropical y enfermedades con fuerte estacionalidad (Bhaskaran et al., 2013). Subajustar deja autocorrelación residual (prueba de Ljung-Box en $diagnostics); sobreajustar consume la señal.

Resultados ilustrados

Figura 1. Superficie de respuesta del DLNM: log(RR) de defunciones de adultos mayores en función de la temperatura (eje y) y del día de rezago (eje x). Los tonos anaranjados indican riesgo aumentado (calor, rezagos cortos); los tonos verdes, riesgo reducido. La estructura bidimensional revela cuándo, tras cada nivel de exposición, se manifiesta el efecto.

Figura 2. Curva exposición-respuesta acumulada (RR e IC 95%) sumada sobre todos los rezagos, centrada en la mediana de la temperatura (referencia, RR = 1). La forma en U/J — riesgo creciente en el frío y en el calor — es la firma clásica de la relación temperatura-mortalidad.

Figura 3. Curva lag-respuesta en el percentil 75 de la exposición: RR específico por día de rezago entre la temperatura y la defunción. Permite distinguir el efecto agudo (rezagos cortos) del efecto tardío y prolongado (rezagos largos).

Figura 4. Fracción atribuible de defunciones (%) descompuesta en total, calor y frío, con IC 95% por Monte Carlo. En climas subtropicales, la fracción del frío suele superar la del calor, reflejando el efecto prolongado de las bajas temperaturas sobre los adultos mayores.

Tabla 1. Resumen del ajuste DLNM (especificación, RR en P75 y diagnósticos).
Parametro Valor
Exposicao climatica tair_dry_bulb_c
Desfecho n_obitos
Familia GLM quasipoisson
Lag maximo (dias) 21
N observacoes (dias) 2170
Valor de referencia (°C) 18.8
RR no P75 (vs referencia) 0.922 [0.725; 1.172]
Lag de efeito pico (dias) 21
Razao de dispersao 1.05 (adequate)
AIC (Poisson) 11800.7
Tabla 2. Fracción atribuible (FA) y número atribuible (NA) por componente térmico.
Componente FA (%) NA (obitos) N obitos
Total 5.78 [-7.25; 17.87] 1624 [-2037; 5018] 28081
Calor 2.90 [-3.93; 8.48] 814 [-1102; 2382] 28081
Frio 2.89 [-3.35; 9.49] 811 [-941; 2665] 28081

Referencias

  • Armstrong, B. (2006). Models for the relationship between ambient temperature and daily mortality. Epidemiology, 17(6), 624–631.
  • Bernal, J. L., Cummins, S., & Gasparrini, A. (2017). Interrupted time series regression for the evaluation of public health interventions: a tutorial. International Journal of Epidemiology, 46(1), 348–355. https://doi.org/10.1093/ije/dyw098
  • Bhaskaran, K., Gasparrini, A., Hajat, S., Smeeth, L., & Armstrong, B. (2013). Time series regression studies in environmental epidemiology. International Journal of Epidemiology, 42(4), 1187–1195. https://doi.org/10.1093/ije/dyt092
  • Gasparrini, A. (2011). Distributed lag linear and non-linear models in R: the package dlnm. Journal of Statistical Software, 43(8), 1–20. https://doi.org/10.18637/jss.v043.i08
  • Gasparrini, A., Armstrong, B., & Kenward, M. G. (2010). Distributed lag non-linear models. Statistics in Medicine, 29(21), 2224–2234. https://doi.org/10.1002/sim.3940
  • Gasparrini, A., & Armstrong, B. (2013). Reducing and meta-analysing estimates from distributed lag non-linear models. BMC Medical Research Methodology, 14, 70. https://doi.org/10.1186/1471-2288-14-70
  • Maclure, M. (1991). The case-crossover design: a method for studying transient effects on the risk of acute events. American Journal of Epidemiology, 133(2), 144–153.