Detectar pasos en series de tiempo

8

Adjunto una foto de la serie de tiempo de la que estoy hablando. La parte superior es la serie original, la parte inferior es la serie diferenciada.

Cada punto de datos es una lectura promedio de 5 minutos de un medidor de tensión. Este medidor de tensión se coloca en una máquina. Las áreas ruidosas corresponden a las áreas donde se enciende la máquina, las áreas limpias son cuando la máquina se apaga. Si observa el área encerrada en un círculo rojo, hay pasos anómalos en la lectura que me gustaría poder detectar automáticamente.

Estoy completamente perplejo sobre cómo podría hacer esto, ¿alguna idea?

ingrese la descripción de la imagen aquí

mohamedmoussa
fuente
¿Qué son los pasos anómalos? ¿Es la máquina apagada? ¿Pude ver patten similar en círculo rojo en la otra parte de la serie? ¿Me perdí algo que ver en la trama?
vinux
Esto parece dificil. Mi primer pensamiento: modelar el estado activado / desactivado (oculto) por una cadena de Markov. El fenómeno que desea detectar es la aparición de algunos valores importantes en las series diferenciadas cuando la máquina está apagada, por lo que si puede calcular en cada momento la probabilidad de que la máquina esté apagada, puede detectarla como " valores importantes cuando la probabilidad de apagado es alta ".
Elvis
Tuve un segundo pensamiento. Lo publicaré ...
Elvis

Respuestas:

14

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 Rimplementació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)

Datos simulados

Aquí está el diagrama de diagnóstico:

> u <- f(x)
> plot(u)

Trama de diagnóstico

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 fpara buscar los valores simultáneamente altas de los diagnósticos r/zvalores 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.

whuber
fuente
El último párrafo se basó en datos simulados muy similares, pero no exactamente iguales a los que se muestran aquí. En esta gráfica de diagnóstico está claro que hay otros valores espurios de hasta aproximadamente 7.5 de tamaño y los dos picos tienen valores alrededor de 14.
whuber
Buena respuesta: esto parece prometedor. Muchas gracias. Te contactaré más tarde con mis resultados.
mohamedmoussa
Solo un seguimiento rápido: hice algo similar a lo que usted hizo, pero tuve acceso a la desviación estándar de los datos dentro de cada punto de datos (es decir, dentro de cada período de 5 minutos). Me dividí por la ETS suavizada y obtuve algunos resultados bastante buenos.
mohamedmoussa
wow, me perdí eso! (+1!)
Elvis
3

Aquí hay una sugerencia de dos centavos.

Denotan la serie diferenciada. Dado y un punto , defina XtΔ>0t

a(Δ,t)=12Δ+1|Xt|.

Por ejemplo, digamos , el valor de caracteriza las zonas de apagado / encendido por valores bajos / altos.Δ=50a(Δ,t)

Un paso anómalo es un punto donde : deberá realizar algunos ajustes en para detectar lo que desea y evitar falsos positivos cuando la máquina se encienda. Primero lo intentaría con y .t|Xt|>αa(Δ,t)α,ΔΔ=50α=4

Alternativamente, puede ver los puntos donde para a (por ejemplo, , ), que pueden ayudar el ajuste fino (en ese caso, tomaría un valor menor para ).ta(δ,t)>αa(Δ,t)δΔδ=10Δ=100α

Elvis
fuente
¿Es posible escribir un código R para implementar esto? ¡Gracias!
user9292