El recorrido completo v1 → v6 · EpiForecast-MX · IMSS × Tec de Monterrey
Seis versiones, cada una construyendo sobre los hallazgos de la anterior
log(1+y) y el RMSE medio cayó de 0.586 a 0.210 (-64%). También descubrimos que el modo aditivo mejoraba en Depresión, mientras multiplicativo dominaba en Alzheimer.Las transformaciones que convirtieron datos crudos en features modelables
Los datos epidemiológicos son ruidosos: errores de captura, rezagos de reporte, brotes reales. Usamos Z-score con umbral=3, agrupado por Padecimiento × Entidad, reemplazando outliers con la mediana del grupo.
¿Por qué Z-score y no IQR? Z-score es más robusto para distribuciones no-normales cuando el umbral es alto (3). IQR es demasiado agresivo para series epidemiológicas con variación estacional natural.
Dos perspectivas temporales críticas para Prophet como regresores adicionales:
Lag-12 (quarter-over-quarter): captura tendencias trimestrales. Útil para detectar aceleraciones o desaceleraciones recientes en la incidencia.
Lag-52 (year-over-year): captura la estacionalidad anual directamente. Particularmente valioso para Depresión, que tiene un patrón estacional marcado con picos en invierno.
Un suavizado semestral usando media móvil de 26 semanas. Esto produce una tendencia semestral limpia que filtra el ruido semanal pero preserva cambios de nivel importantes.
26 semanas = medio año. Es el balance óptimo: suficiente para suavizar variación estacional intrasemestral, pero no tanto como para perder cambios de régimen reales (como el de Tabasco en 2023).
El SINAVE reporta incidencia acumulada por año. Cuando el acumulado baja de una semana a otra, es un error de captura o corrección retroactiva. Dos estrategias:
Redistribución: los decrementos se redistribuyen proporcionalmente en las semanas previas del mismo año.
Extrapolación 3 semanas: para las últimas semanas del año (que a veces llegan con rezago), extrapolamos usando la tendencia de las 3 semanas anteriores.
El pipeline que transforma conteos crudos en el espacio óptimo para Prophet
El problema fundamental: CDMX reporta ~500 casos/semana de Depresión, Colima solo ~5. Esto no significa que CDMX tenga 100x más incidencia — tiene 12x más población. Sin normalizar, Prophet sobreajustaría en estados grandes y subajustaría en pequeños.
La solución: dividir la incidencia semanal entre la población del estado y multiplicar por 100,000. Ahora la escala es comparable: ~5.5 por 100K en CDMX vs ~6.8 por 100K en Colima.
Incluso después de normalizar, la varianza de Depresión era heterogénea: estados con tasas altas tenían fluctuaciones mucho más grandes. log(1+y) estabiliza la varianza y comprime los picos extremos. El +1 evita log(0) cuando la incidencia es cero.
Cada parámetro fue probado y justificado con datos
Prophet modela estacionalidad con series de Fourier. Usamos period=52.18 semanas (365.25/7) para capturar el ciclo anual exacto.
| Parámetro | Nacional | Regional/Estatal |
|---|---|---|
| fourier_order | 5 | 3 |
| n_changepoints | 25 (default) | 12 |
| Justificación | Series largas, complejidad alta | Series cortas, evitar overfitting |
¿Por qué order=3 regional? Con fourier_order=5 en series estatales cortas, Prophet sobreajustaba oscilaciones espurias — especialmente en Depresión estatal. Order=3 reduce los parámetros de estacionalidad de 10 a 6, produciendo curvas más suaves y generalizables.
La pandemia distorsionó drásticamente las series epidemiológicas. La modelamos como un holiday que abarca 913 días (~2.5 años) desde el 23 de marzo de 2020.
| Padecimiento | Efecto | Impacto |
|---|---|---|
| Depresión | Caída brusca seguida de rebote | Sin holiday, Prophet trata el rebote como tendencia |
| Parkinson | Caída sostenida, recuperación lenta | Holiday absorbe el periodo sin distorsionar tendencia |
| Alzheimer | Caída moderada | Menor impacto pero aún mejora el fit |
Probamos holidays para cambios de nivel en 5 estados. Solo uno pasó el filtro:
| Entidad | Padecimiento | Δ RMSE | Veredicto |
|---|---|---|---|
| Tabasco | Depresión | -6.2% | Aprobado |
| Nayarit | Depresión | +7.1% | Rechazado |
| Colima | Depresión | +5.3% | Rechazado |
| Durango | General | +8.9% | Rechazado |
| Baja California Sur | General | +4.7% | Rechazado |
Lección clave: Prophet holidays modelan eventos temporales. Nayarit, Colima, Durango y BCS tienen cambios permanentes (step functions) que Prophet no puede absorber como holidays — los trata como eventos que eventualmente regresan al nivel anterior, empeorando el forecast.
Prophet coloca 25 changepoints por default para detectar cambios de tendencia. En series estatales (más cortas, menos datos), esto produce overfitting.
Con n_changepoints=12, los modelos regionales y estatales capturan los cambios de tendencia principales (COVID, recuperación post-pandemia) sin sobreajustar fluctuaciones menores.
La lógica: 12 changepoints en ~500 observaciones (10 años semanales) = 1 changepoint cada ~10 meses. Suficiente para cambios anuales, no tanto como para capturar ruido.
De un grid genérico a grids optimizados por padecimiento, con CV ponderada y MASE
El grid más reducido. Multiplicativo domina al 100%; additive tenía +51% RMSE.
El grid más grande. Ambos modos compiten (47% vs 53%). El rango de SP es el más amplio.
Multiplicativo domina (71%) pero additive gana en algunas entidades. CP=0.01 eliminado (Newton-prone).
No todos los folds de CV son igual de relevantes. El fold post-COVID (2020-2021) es un periodo atípico que no representa el futuro. El fold más reciente (2023-2024) es el más representativo del forecast. Los pesos reflejan esta realidad:
| Fold | Periodo | Peso | Justificación |
|---|---|---|---|
| 1 | 2020-2021 | 0.50 | Post-COVID, periodo atípico, menos relevante |
| 2 | 2021-2022 | 0.75 | Recuperación, patrón transicional |
| 3 | 2022-2023 | 1.00 | Estabilización, patrón normal |
| 4 | 2023-2024 | 1.25 | Más reciente, más representativo del forecast |
Agregado en v6 como métrica principal. MAPE (porcentual) es problemático en epidemiología: cuando el denominador (casos reales) es pequeño, MAPE explota. MASE compara contra un baseline naive estacional (repetir lo de hace 52 semanas):
Cómo evitamos que Prophet cayera al optimizador Newton (100-500x más lento que L-BFGS)
Prophet usa Stan para optimizar. El optimizador default es L-BFGS (rápido, O(n) por iteración). Pero cuando L-BFGS no converge, Stan cae silenciosamente a Newton (O(n³) por iteración). En Chihuahua-Depresión, un solo fold tardaba hasta 25 minutos con Newton, acumulando 39 minutos para los 3 modos de sexo.
El trigger: changepoint_prior_scale bajo (0.01, 0.03) combinado con series volátiles. CP bajo = regularización fuerte de cambios de tendencia, lo que dificulta la convergencia de L-BFGS.
Las combinaciones se ordenan por changepoint_prior_scale de mayor a menor. CP alto converge rápido con L-BFGS. Si encontramos una buena solución temprano, podemos podar las combinaciones lentas.
_fit_with_timeout() usa ThreadPoolExecutor para cortar un fold que exceda 35 segundos. Si un fold tarda más de 35s, con alta probabilidad cayó a Newton.
Si una combinación con CP=X hace timeout, todas las combinaciones con CP < X se saltan automáticamente. CP más bajo = más probabilidad de Newton. Poda agresiva y segura.
Si todas las combinaciones hacen timeout (raro, pero posible), usamos parámetros default con el CP más alto del grid. Esto garantiza que siempre obtenemos un modelo, aunque no sea el óptimo de CV.
De 72% cobertura a 100%: el fallback regional que cambió el juego
En v3-v5, 41 combinaciones estado-padecimiento-sexo tenían un promedio menor a 0.5 casos/semana. Sus modelos Prophet producían líneas planas — predicciones técnicamente válidas pero inservibles. Descartarlas significaba perder cobertura: solo el 72% de los estados tenían al menos un modelo usable en v3.
Para cada región INEGI de salud mental, entrenamos un modelo regional que agrega datos de todos los estados de la zona. Estos modelos tienen muchos más datos y producen predicciones robustas. Cuando un estado es «insuficiente», usamos el modelo de su región pero desnormalizamos con la población del estado individual.
Colima — Alzheimer
< 0.5 casos/semana
Urbana media
(9 estados)
Prophet entrenado
con datos agregados
Población de Colima
(no de la región)
El progreso medido: cada versión mejoró al menos una métrica
| Versión | RMSE Dep. | RMSE Alz. | RMSE Park. | Cobertura | Modelos | Cambio principal |
|---|---|---|---|---|---|---|
| v1 | 0.586 | 0.030 | 0.070 | 100% | 297 | Normalización tasa 100K |
| v2 | 0.210 | 0.029 | 0.063 | 100% | 297 | Log-transform (-64% RMSE) |
| v3 | 0.210 | 0.029 | 0.063 | 72% | 213 | Filtro insuficientes + holidays |
| v5 | 0.206 | 0.033 | 0.064 | 87% | 257 | Anti-Newton + umbral 0.5 |
| v6 | 0.183 | 0.027 | 0.057 | 100% | 312 | Híbrido + MASE + grids v5 |
CV evalúa, pero el modelo final usa todos los datos disponibles
Un error común es entrenar el modelo final solo con el split de entrenamiento de CV. Pero CV ya cumplió su función: seleccionar los mejores hiperparámetros. Una vez seleccionados, el modelo final debe aprovechar todos los datos disponibles para maximizar la precisión en producción.
Nuestro flujo: CV usa 4 splits temporales para evaluar → selecciona los mejores HP → el .pkl final se entrena con toda la serie (2014-2025). Esto captura los patrones más recientes sin desperdiciar datos.
10 takeaways de 6 versiones y 297+ modelos
Modelar conteos crudos cuando las poblaciones varían 12x no tiene sentido. Tasa por 100K convierte todos los estados a una escala comparable. Sin esto, nada funciona.
Un solo log(1+y) redujo el RMSE de Depresión 64%. La lección: antes de tunear hiperparámetros, asegúrate de que el target esté en el espacio correcto. Estabilizar la varianza importa más que el grid search.
Prophet holidays modelan eventos que empiezan y terminan. Un cambio permanente de nivel (Nayarit subiendo 3x y quedándose ahí) no es un holiday — Prophet lo tratará como algo que debe «regresar» y empeorará.
Alzheimer necesita solo multiplicativo. Depresión compite entre aditivo y multiplicativo. Un grid único para todos desperdicia tiempo en combinaciones inútiles o pierde opciones valiosas.
Stan no avisa cuando cae a Newton optimizer. Un modelo que tardaba 30 segundos de repente tarda 25 minutos. Sin monitoreo de tiempos, nunca lo habríamos detectado.
Un modelo regional con desnormalización individual es mejor que «sin datos suficientes». Los stakeholders necesitan cobertura completa, no modelos perfectos con lagunas.
MAPE explota cuando los valores reales son cercanos a cero. MASE compara contra un baseline real (naive lag-52) y es escala-independiente. Alzheimer con MASE 0.74 es 26% mejor que repetir el año pasado.
El fold post-COVID no representa el futuro. Ponderar con [0.5, 0.75, 1.0, 1.25] refleja esta realidad. Sin pesos, el fold 2020-2021 distorsiona la selección de hiperparámetros.
CV selecciona hiperparámetros. El modelo final debe usar toda la data disponible. Desperdiciar el 25% de datos en un test set permanente es un lujo que series de 10 años no se pueden dar.
Fourier order=5 funciona para series nacionales con 500+ puntos. Para series estatales con menos datos, order=3 evita sobreajustar patrones estacionales espurios — especialmente crítico en Depresión estatal.