Espartaco

“Is that to say we are against Free Trade? No, we are for Free Trade, because by Free Trade all economical laws, with their most astounding contradictions, will act upon a larger scale, upon the territory of the whole earth; and because from the uniting of all these contradictions in a single group, where they will stand face to face, will result the struggle which will itself eventuate in the emancipation of the proletariat.”

Karl Heinrich Marx · Marx-Engels Collected Works, Vol. VI, p. 290

26,450 views since December 2020

26,450 visitas desde diciembre de 2020

EnglishEspañol

Detectando Cuándo Cambia el Mundo: Un Análisis Profundo del Paquete R RegimeChange

Puedes encontrar esta librería en CRAN y descargarla directamente desde R y RStudio.

Series temporales · Changepoints · Inferencia bayesiana

¿Cuándo cambió realmente el sistema? Una introducción a RegimeChange

Un paquete de R que reúne métodos clásicos, bayesianos y de deep learning para detectar cambios de régimen, cuantificar su incertidumbre y distinguir una transición real de una simple fluctuación aleatoria.

RegimeChange · R · Código abierto · GitHub

Una línea de producción funciona con normalidad y, de pronto, los sensores comienzan a verse distintos. Ninguna observación individual parece imposible, pero algo cambió. Un economista observa décadas de crecimiento y sospecha que el país dejó atrás un régimen para entrar en otro. Un médico sigue una serie de signos vitales y necesita saber cuándo la estabilidad comienza a convertirse en deterioro.

En los tres casos la pregunta estadística es esencialmente la misma: ¿en qué momento el proceso dejó de comportarse como antes?

Éste es el problema de la detección de cambios de régimen, también conocida como changepoint detection.

RegimeChange intenta abordarlo mediante una biblioteca única que reúne métodos que normalmente aparecen dispersos entre varios paradigmas y paquetes: estadística frecuentista, inferencia bayesiana, detección secuencial y, opcionalmente, deep learning.

La pregunta fundamental

Toda serie fluctúa. El problema es determinar cuándo una fluctuación es solamente ruido dentro del mismo régimen y cuándo constituye evidencia de que el sistema pasó a un estado estadísticamente diferente.

Detectar un cambio significa decidir cuánto error estamos dispuestos a tolerar

La dificultad aparece porque ninguna regla de detección puede escapar por completo de dos clases de error.

Falsa alarma — Error tipo I

Declaramos que hubo un cambio cuando el proceso simplemente estaba atravesando una fluctuación normal. En una fábrica puede significar detener innecesariamente una línea de producción.

Cambio no detectado — Error tipo II

El sistema sí cambió, pero el algoritmo no genera una alarma. Dependiendo de la aplicación, esto puede significar reaccionar demasiado tarde ante una crisis, un brote o un deterioro operativo.

El umbral de detección regula ese compromiso. Un umbral bajo detectará cambios rápidamente, pero también puede producir muchas falsas alarmas. Uno muy alto será más conservador, aunque puede reconocer el cambio demasiado tarde.

No existe un umbral universalmente correcto: depende del costo práctico de cada error.

Tres familias metodológicas bajo una misma interfaz

RegimeChange organiza sus algoritmos en tres familias principales.

Frecuentistas

Incluyen CUSUM, PELT, Binary Segmentation, WBS, FPOP, E-Divisive, Kernel CPD y NOT. Cubren desde cambios simples en la media hasta transformaciones complejas de la distribución.

Bayesianos

BOCPD y Shiryaev-Roberts permiten representar probabilísticamente la incertidumbre acerca de cuándo ocurrió el cambio y, en contextos online, actualizar esa evidencia a medida que llegan datos.

Deep learning

Autoencoders, TCN, Transformers y Contrastive Predictive Coding amplían la detección hacia patrones temporales complejos y no lineales.

CUSUM: dejar que la evidencia se acumule

CUSUM —Cumulative Sum— es uno de los métodos clásicos de detección secuencial.

La intuición es especialmente clara. Mientras el proceso permanece en el mismo régimen, las desviaciones positivas y negativas respecto de un nivel de referencia tienden a compensarse.

Pero si la media cambia, las desviaciones comienzan a acumularse persistentemente en una dirección.

Cuando esa acumulación supera un umbral, se genera una alarma.

Intuición de CUSUM

Una observación extraña puede no significar nada. Muchas desviaciones consecutivas en la misma dirección sí comienzan a constituir evidencia de un cambio.

Su complejidad es lineal, \(O(n)\), y resulta especialmente natural para monitoreo online y detección de cambios en la media.

PELT: encontrar múltiples cambios sin probar cada partición posible

Cuando existe más de un cambio, la dificultad aumenta. Debemos decidir simultáneamente cuántos segmentos existen y dónde comienzan y terminan.

PELT —Pruned Exact Linear Time— utiliza programación dinámica para buscar la segmentación global que minimiza una función de costo, incorporando al mismo tiempo una penalización por introducir demasiados cambios.

La penalización es importante: sin ella, el modelo podría mejorar artificialmente su ajuste dividiendo la serie en un número excesivo de segmentos.

RegimeChange permite criterios como:

  • BIC;
  • AIC;
  • MBIC;
  • MDL;
  • o una penalización numérica especificada manualmente.

El mecanismo de pruning elimina posiciones candidatas que ya no pueden producir la solución óptima, permitiendo que PELT alcance complejidad promedio cercana a \(O(n)\) bajo las condiciones correspondientes.

No todo cambio se parece a un salto limpio en la media

RegimeChange incorpora métodos adicionales porque distintos cambios dejan firmas estadísticas diferentes.

Binary Segmentation

Localiza un cambio, divide la serie y repite recursivamente. Es rápido, aunque su estrategia greedy no garantiza el óptimo global.

Wild Binary Segmentation

Busca cambios sobre numerosos subintervalos aleatorios y puede mejorar la localización cuando existen varios changepoints próximos.

FPOP

Utiliza poda funcional y funciones de costo por tramos para realizar particionamiento óptimo.

E-Divisive

Emplea estadísticas de energía y permite detectar cambios más generales en la distribución sin imponer una forma paramétrica específica.

Kernel CPD

Traslada la información a un espacio de características mediante kernels para capturar cambios distribucionales complejos.

NOT

Narrowest-Over-Threshold está orientado a localizar cambios con precisión mediante intervalos que superan un umbral.

BOCPD: en lugar de preguntar “¿cambió?”, preguntar “¿qué probabilidad hay de que haya cambiado?”

La aproximación bayesiana cambia profundamente la forma del resultado.

Bayesian Online Changepoint Detection mantiene en cada instante una distribución posterior sobre el llamado run length: cuántas observaciones han transcurrido desde el último cambio.

Cuando llega una nueva observación, existen esencialmente dos posibilidades:

  • el régimen continúa y el run length aumenta;
  • ocurre un cambio y el run length vuelve a cero.

Una función de riesgo —hazard function— controla la probabilidad previa de que ocurra un cambio en cada instante.

El resultado es especialmente útil porque BOCPD no devuelve únicamente un indicador binario. Produce una probabilidad posterior de cambio a lo largo del tiempo.

RegimeChange implementa distintas familias conjugadas, entre ellas Normal-Gamma para media y varianza desconocidas, Normal con varianza conocida, Gamma-Poisson para conteos y Normal-Wishart para datos multivariados.

Y cuando la relación temporal es demasiado compleja: deep learning

Algunos cambios no se manifiestan como una modificación simple de media, varianza o tendencia.

Para esos casos el paquete incorpora, como módulos opcionales, métodos de aprendizaje profundo.

Autoencoders

Aprenden a reconstruir el comportamiento normal. Si cambia el régimen, aumenta el error de reconstrucción.

Temporal Convolutional Networks

Utilizan convoluciones causales dilatadas para capturar dependencias temporales de largo alcance.

Transformers

Aplican mecanismos de self-attention para representar relaciones temporales distantes.

Contrastive Predictive Coding

Aprende representaciones auto-supervisadas y busca cambios importantes en el espacio de embeddings resultante.

Existe además un modo ensemble que exige acuerdo entre múltiples detectores antes de declarar un cambio.

La interfaz única: cambiar de método sin cambiar de lógica

Una de las decisiones prácticas más importantes del paquete es que los algoritmos principales pueden llamarse desde detect_regimes().

library(RegimeChange)

set.seed(42)

data <- c(
  rnorm(200, 0, 1),
  rnorm(200, 2, 1)
)

# PELT
result <- detect_regimes(
  data,
  method = "pelt"
)

print(result)
plot(result)

Para pasar a un detector bayesiano:

result <- detect_regimes(
  data,
  method = "bocpd",
  prior = normal_gamma(
    mu0 = 0,
    kappa0 = 1,
    alpha0 = 1,
    beta0 = 1
  )
)

Y para monitoreo online con CUSUM:

result <- detect_regimes(
  data,
  method = "cusum",
  mode = "online",
  threshold = 5
)

El usuario puede especificar si busca cambios en media, varianza, ambas, tendencia o distribución, además del número esperado de cambios y el criterio de penalización.

Offline y online son problemas relacionados, pero no idénticos

En modo offline ya conocemos la serie completa. Queremos reconstruir retrospectivamente cuándo ocurrieron los cambios.

En modo online, en cambio, los datos llegan uno por uno. La pregunta es si debemos generar una alarma ahora.

detector <- regime_detector(
  method = "bocpd",
  prior = normal_gamma(),
  threshold = 0.5
)

for (x in data_stream) {

  detector <- update(detector, x)

  if (detector$last_result$alarm) {

    message(
      "Changepoint detected at time ",
      detector$last_result$t
    )

    detector <- reset(detector)
  }
}

Esa arquitectura es relevante para aplicaciones como vigilancia epidemiológica, control industrial, detección de fraude o monitoreo financiero.

El mundo real tiene outliers, colas pesadas y autocorrelación

Aquí aparece uno de los puntos más interesantes del paquete. Muchos procedimientos clásicos funcionan mejor cuando las observaciones son aproximadamente independientes y la distribución no contiene contaminación severa.

Los datos reales rara vez cooperan tanto.

El modo robusto de PELT puede combinar varias defensas.

Winsorización

Limita el impacto de observaciones extremas recortándolas según cuantiles configurables.

Pérdidas robustas

Puede utilizar Huber M-estimation o Tukey biweight en lugar de pérdida cuadrática convencional.

Escala Qn

Emplea el estimador robusto de Rousseeuw y Croux, diseñado para mantener alta resistencia frente a contaminación.

Modo automático

robust = "auto" examina indicadores de contaminación y selecciona un nivel de robustez apropiado.

Para series autocorrelacionadas, correct_ar = TRUE estima una estructura AR(1) y pre-blanquea la serie antes de ejecutar la detección.

La idea es evitar que una dependencia temporal ordinaria sea confundida con evidencia de un cambio estructural.

¿Qué muestran los benchmarks documentados?

La wiki del paquete reporta una comparación con paquetes establecidos de R en 17 escenarios y 50 repeticiones por escenario.

Escenario Resultado reportado para RegimeChange Comparación documentada
Promedio general F1 = 0.804 El selector automático obtuvo el mayor F1 medio de los métodos evaluados.
Datos contaminados F1 = 0.998 Frente a 0.479 para PELT estándar del paquete de referencia indicado en la documentación.
Cambio sutil de varianza 2:1 F1 = 0.667 Frente a 0.400 en los paquetes de referencia reportados.
Autocorrelación fuerte, AR = 0.7 F1 = 0.900 Frente a 0.720 en la comparación documentada.
Resumen de escenarios Ganó o empató en 16 de 17 La pérdida restante fue reportada como marginal, de 0.017 en un escenario de colas pesadas.
Cómo leer estos resultados

Son resultados de los benchmarks descritos en la documentación del paquete. No implican que RegimeChange vaya a superar a cualquier alternativa en cualquier conjunto de datos. El comportamiento real depende del tipo de cambio, la contaminación, la autocorrelación, el tamaño muestral y la parametrización.

No basta con saber dónde: también importa saber cuán seguros estamos

Decir que un cambio ocurrió en la observación 200 parece preciso, pero puede dar una falsa sensación de certeza.

RegimeChange diferencia al menos dos dimensiones.

Incertidumbre sobre la localización

Para los métodos frecuentistas puede utilizar block bootstrap: se remuestrean bloques para preservar dependencia local, se vuelve a ejecutar la detección y se obtiene una distribución de las posiciones estimadas.

A partir de ella pueden construirse intervalos de confianza para la localización del changepoint.

Incertidumbre sobre la existencia del cambio

En BOCPD la pregunta puede plantearse directamente en términos probabilísticos: ¿qué probabilidad posterior existe de que un cambio haya ocurrido en este momento?

Esa información puede ser más útil operacionalmente que un simple “sí/no”, especialmente cuando las decisiones dependen del costo de una falsa alarma.

R por fuera, Julia por dentro cuando hace falta velocidad

El paquete incorpora un backend opcional en Julia para varios de sus algoritmos principales.

init_julia()

julia_available()

Según la documentación, el backend incluye implementaciones de PELT, FPOP, BOCPD, CUSUM, Kernel CPD, WBS y PELT multivariado.

Para conjuntos grandes el paquete puede despachar automáticamente el cálculo hacia Julia, mientras mantiene la interfaz en R. Si Julia no está disponible, vuelve a la implementación en R.

La implementación también incorpora técnicas de estabilidad numérica como el algoritmo de Welford para media y varianza acumuladas, suma compensada de Kahan y cálculos en dominio logarítmico para evitar underflow en BOCPD.

Evaluar un detector también requiere más de una métrica

Cuando conocemos los changepoints verdaderos —por ejemplo en simulaciones— RegimeChange puede evaluar los resultados mediante varias medidas.

metrics <- evaluate(
  result,
  true_changepoints = c(100, 250),
  tolerance = 10
)

print(metrics)

El marco incluye:

  • precision;
  • recall;
  • F1;
  • distancia de Hausdorff;
  • Rand Index;
  • Adjusted Rand Index;
  • covering metric.

compare_methods() permite además aplicar varios algoritmos a la misma serie y compararlos bajo un formato común.

¿Qué método elegir?

Situación Opción sugerida por la documentación
Datos limpios y cambios claros de media PELT
Outliers o colas pesadas PELT con robust = TRUE o "auto"
Serie autocorrelacionada PELT con correct_ar = TRUE
Detección en tiempo real BOCPD o CUSUM
Necesitamos probabilidad de cambio BOCPD
Queremos un enfoque no paramétrico E-Divisive o Kernel CPD
Patrones complejos y no lineales Métodos de deep learning
No sabemos qué método elegir Ensemble o method = "auto"

Instalación

RegimeChange puede instalarse desde GitHub:

# install.packages("devtools")

devtools::install_github(
  "IsadoreNabi/RegimeChange"
)

La documentación indica R 4.0.0 o posterior como requisito base. El backend Julia es opcional y requiere Julia 1.6 o posterior junto con JuliaCall. Los detectores de deep learning requieren keras y tensorflow.

La cuestión de fondo: ¿cuánta sorpresa hace falta para decir que el mundo cambió?

Hay una forma interesante de interpretar todo este problema.

Cada nueva observación proporciona evidencia acerca de dos posibilidades: el sistema sigue funcionando bajo el mismo régimen o algo cambió.

Los distintos métodos formalizan esa evidencia de maneras diferentes. CUSUM la acumula. PELT busca la segmentación óptima. BOCPD actualiza una distribución posterior. Los detectores neuronales observan cuándo una representación aprendida deja de describir bien los datos nuevos.

Pero la pregunta conceptual permanece: ¿la desviación que estamos viendo es suficientemente improbable bajo el régimen anterior como para justificar afirmar que el proceso ya no es el mismo?

Y en aplicaciones reales esa respuesta nunca depende exclusivamente de la estadística. También depende de qué cuesta equivocarse.

Ésa es la apuesta de RegimeChange: convertir la detección de cambios de régimen en un problema que pueda abordarse desde varios paradigmas sin abandonar una interfaz común, incorporando robustez, cuantificación de incertidumbre, evaluación comparativa y detección online. El objetivo no es simplemente señalar un punto rojo sobre una serie temporal, sino responder con mayor rigor tres preguntas: si realmente hubo un cambio, dónde ocurrió y cuánta confianza deberíamos depositar en esa conclusión.

RegimeChange está disponible en GitHub. La documentación del paquete incluye guías de introducción, detección offline, métodos bayesianos y benchmarks comparativos.


Descubre más de Marxist Philosophy of Science

Suscríbete para recibir las últimas entradas en tu correo electrónico.

Follow the blogSeguí al blog

Comments

Leave a Comment/Deja un Comentario

Descubre más de Marxist Philosophy of Science

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Continuar leyendo