Parece que está buscando picos dentro de intervalos de relativa calma . "Relativo" significa en comparación con los valores cercanos típicos, lo que sugiere suavizar la serie. Un liso robusto es deseable precisamente porque no debe estar influenciado por algunos picos locales. "Silencioso" significa que la variación alrededor de esa suavidad es pequeña. Nuevamente, es deseable una estimación robusta de la variación local. Finalmente, un "pico" sería un gran residuo como un múltiplo de la variación local.
Para implementar esta receta , debemos elegir (a) qué tan cerca significa "cerca", (b) una receta para suavizar y (c) una receta para encontrar la variación local. Puede que tenga que experimentar con (a), así que hagámoslo un parámetro fácilmente controlable. Las buenas opciones disponibles para (b) y (c) son Lowess y IQR , respectivamente. Aquí hay una R
implementación:
library(zoo) # For the local (moving window) IQR
f <- function(x, width=7) { # width = size of moving window in time steps
w <- width / length(x)
y <- lowess(x, f=w) # The smooth
r <- zoo(x - y$y) # Its residuals, structured for the next step
z <- rollapply(r, width, IQR) # The running estimate of variability
r/z # The diagnostic series: residuals scaled by IQRs
}
Como un ejemplo de su uso, considere estos datos simulados donde se agregan dos picos sucesivos a un período de silencio (dos en una fila deberían ser más difíciles de detectar que un pico aislado):
> x <- c(rnorm(192, mean=0, sd=1), rnorm(96, mean=0, sd=0.1), rnorm(192, mean=0, sd=1))
> x[240:241] <- c(1,-1) # Add a local spike
> plot(x)
Aquí está el diagrama de diagnóstico:
> u <- f(x)
> plot(u)
A pesar de todo el ruido en los datos originales, esta trama detecta maravillosamente los picos (relativamente pequeños) en el centro. Automatice la detección escaneando f(x)
valores grandes (mayores que aproximadamente 5 en valor absoluto: experimente para ver qué funciona mejor con datos de muestra).
> spikes <- u[abs(u) >= 5]
240 241 273
9.274959 -9.586756 6.319956
La detección espuria en el tiempo 273 fue un valor atípico local aleatorio. Puede refinar la prueba para excluir (la mayoría) tales valores espurios modificando f
para buscar los valores simultáneamente altas de los diagnósticos r/z
valores y bajos de la RIC en funcionamiento, z
. Sin embargo, aunque el diagnóstico tiene una escala e interpretación universal (sin unidades), el significado de un IQR "bajo" depende de las unidades de los datos y debe determinarse a partir de la experiencia.