3.7.c Dengue: brotes y pronóstico
Canal endémico, años de brote y pronóstico a 1, 3 y 6 meses con información hidroclimática
El riesgo de dengue se mide en brotes: meses en que los casos superan lo esperado y saturan la atención en salud. Beal et al. construyeron modelos estadísticos de pronóstico del dengue a 1, 3 y 6 meses para cuatro ciudades de Colombia, entre ellas Leticia, y encontraron que los modelos con información hidroclimática superaban a los autorregresivos a 3 y 6 meses, con la TSM como mejor predictor Beal et al., 2025. Este cuaderno replica esa comparación con los datos públicos de OpenDengue.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from IPython.display import Markdown, display
from leticia import fuentes, salud, viz
from leticia.config import parametros
pdg = parametros()["dengue"]
semanal = fuentes.dengue_opendengue()
mensual = salud.casos_mensuales(semanal)1. Canal endémico y años de brote¶
cas = mensual.loc["2011":]
hist = cas.loc[:"2018"]
canal = hist.groupby(hist.index.month).quantile([0.25, 0.5, 0.75]).unstack()
fig, ax = plt.subplots(figsize=(10.5, 3.8))
for anio, color in ((2019, viz.ROJO), (2020, viz.GRIS), (2021, viz.TIERRA), (2022, viz.AZUL_RIO)):
s = cas[cas.index.year == anio]
ax.plot(s.index.month, s, "o-", color=color, lw=1.4, label=str(anio))
ax.fill_between(canal.index, canal[0.25], canal[0.75], color="0.85", label="p25–p75 de 2011–2018")
ax.plot(canal.index, canal[0.5], color="0.4", lw=1, label="mediana 2011–2018")
ax.set_xticks(range(1, 13)); ax.set_xticklabels(list("EFMAMJJASOND"))
ax.set_ylabel("casos por mes")
ax.set_title("Canal endémico de dengue en Leticia y años recientes")
ax.legend(ncol=3, fontsize=7.5)
fig.tight_layout()
sobre = (cas > canal[0.75].reindex(cas.index.month).to_numpy())
display(Markdown("**Meses por año sobre el percentil 75 de 2011–2018:** " + ", ".join(f"{a}: {int(v)}" for a, v in sobre.groupby(sobre.index.year).sum().items()) + "."))
El canal endémico compara cada mes con la distribución de los años previos, como lo hace la vigilancia en salud pública. El brote de 2019, el mayor de la serie, superó el percentil 75 de los años previos los doce meses. Leticia comparte la transmisión con Tabatinga (Brasil) y Santa Rosa (Perú): sin datos de los tres lados, la vigilancia de un solo país ve una parte del brote.
2. Pronóstico a 1, 3 y 6 meses (réplica de Beal et al.)¶
era = fuentes.clima_diario()
X = salud.predictores_mensuales(era, {"ONI": fuentes.oni(), "TNA": fuentes.indice_tna()}, base=(1991, 2020))
tablas, predicciones = {}, {}
for r in pdg["rezagos_meses"]:
tablas[r], predicciones[r] = salud.modelos_dengue(cas, X, r)
hab = pd.concat({f"{r} meses": t["habilidad"] for r, t in tablas.items()}, axis=1)
cor = pd.concat({f"{r} meses": t["r"] for r, t in tablas.items()}, axis=1)
display(Markdown("**Habilidad frente a la climatología (1 − ECM/ECM de la climatología; positivo = mejora), validación dejando un año fuera:**"))
display(hab.round(2))
display(Markdown("**Correlación entre pronóstico y observación (escala log):**"))
display(cor.round(2))La habilidad compara cada modelo con la climatología validada de la misma forma. La correlación de la climatología es negativa por un efecto de la validación: al dejar fuera un año, el promedio mensual se calcula sin él, de modo que los años con muchos casos reciben un pronóstico más bajo y los años con pocos, uno más alto.
fig, ax = plt.subplots(1, len(predicciones), figsize=(13, 3.6), sharey=True)
for a, (r, p) in zip(ax, predicciones.items()):
a.plot(p.index, p["observado"], color="k", lw=1.2, label="observado")
a.plot(p.index, p["autorregresivo"], color=viz.AZUL_RIO, lw=1, label="autorregresivo")
a.plot(p.index, p["oceánico"], color=viz.CALOR, lw=1, label="oceánico (ONI y TNA)")
a.set_yscale("symlog", linthresh=10)
a.set_title(f"Pronóstico a {r} {'mes' if r == 1 else 'meses'}")
ax[0].set_ylabel("casos por mes")
ax[0].legend(fontsize=7.5)
fig.tight_layout()
Lectura. Con los datos públicos de 2011–2022 y modelos lineales simples, no se reproduce la habilidad hidroclimática que Beal et al. reportan a 3 y 6 meses. El modelo autorregresivo, que solo usa los casos recientes, es muy útil a un mes, conserva habilidad a tres y la pierde a seis; los modelos con temperatura, lluvia, humedad o TSM no mejoran la climatología a ningún horizonte. Las diferencias pueden venir del periodo, de la selección de predictores, de la forma del modelo y de la validación, y del peso del brote de 2019 en una serie corta. La lección práctica es doble: para la alerta inmediata conviene vigilar la tendencia de los casos, semana a semana; y un pronóstico climático a 3–6 meses para Leticia exige un trabajo de modelación específico, validado como en este cuaderno, antes de usarse para decidir.
- Beal, M. R. W., Osorio, J., Ciuoderis, K., Hernandez-Ortiz, J. P., & Block, P. (2025). Forecasting dengue: evaluating the role of hydroclimate information in subseasonal to seasonal prediction. GeoHealth, 9(9), e2024GH001325. 10.1029/2024GH001325