Detectando etapas em séries temporais

8

Anexei uma foto da série temporal de que estou falando. A parte superior é a série original, a parte inferior é a série diferenciada.

Cada ponto de dados é uma leitura média de 5 minutos de um medidor de tensão. Este extensômetro é colocado em uma máquina. As áreas ruidosas correspondem às áreas em que a máquina está ligada, as áreas limpas são quando a máquina é desligada. Se você olhar para a área circulada em vermelho, há etapas anômalas na leitura que eu gostaria de poder detectar automaticamente.

Estou completamente perplexo sobre como posso fazer isso - alguma idéia?

insira a descrição da imagem aqui

mohamedmoussa
fonte
O que são etapas anômalas? é que a máquina está desligada? Eu pude ver patten semelhante no círculo vermelho na outra parte da série? Perdi algo para ver na trama?
Vinux
Isso parece difícil. Meu primeiro pensamento: modelar o estado (oculto) de ligar / desligar por uma cadeia de Markov. O fenômeno que você deseja detectar é a ocorrência de alguns valores importantes nas séries diferenciadas quando a máquina está desligada; portanto, se você puder calcular a cada momento a probabilidade de a máquina estar desligada, poderá detectá-la como " valores importantes quando a probabilidade de off é alta ".
Elvis
Eu tive um segundo pensamento. Vou postar isso ...
Elvis

Respostas:

14

Parece que você está procurando picos em intervalos de relativa calma . "Relativo" significa comparado aos valores típicos próximos, o que sugere suavizar a série. Uma suavidade robusta é desejável precisamente porque não deve ser influenciada por alguns picos locais. "Silencioso" significa que a variação em torno desse liso é pequena. Novamente, é desejável uma estimativa robusta da variação local. Finalmente, um "pico" seria um grande residual como um múltiplo da variação local.

Para implementar esta receita , precisamos escolher (a) o quão próximo "próximo" significa, (b) uma receita para suavizar e (c) uma receita para encontrar variações locais. Você pode ter que experimentar com (a), então vamos torná-lo um parâmetro facilmente controlável. As opções boas e prontamente disponíveis para (b) e (c) são Lowess e IQR , respectivamente. Aqui está uma Rimplementação:

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 exemplo de seu uso, considere esses dados simulados em que dois picos sucessivos são adicionados a um período silencioso (dois em uma linha devem ser mais difíceis de detectar do que um pico isolado):

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

Dados simulados

Aqui está o gráfico de diagnóstico:

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

Gráfico de diagnóstico

Apesar de todo o ruído nos dados originais, esse gráfico detecta lindamente os picos (relativamente pequenos) no centro. Automatize a detecção varrendo f(x)valores largish (maiores que cerca de 5 em valor absoluto: experimente para ver o que funciona melhor com dados de amostra).

> spikes <- u[abs(u) >= 5]
      240       241       273 
 9.274959 -9.586756  6.319956

A detecção espúria no tempo 273 foi um erro local aleatório. Você pode refinar o teste para excluir (a maioria) esses valores espúrios, modificando fpara procurar simultaneamente valores altos do diagnóstico r/ze valores baixos do IQR em execução z. No entanto, embora o diagnóstico tenha uma escala e interpretação universal (sem unidade), o significado de um QI "baixo" depende das unidades dos dados e deve ser determinado a partir da experiência.

whuber
fonte
O último parágrafo foi baseado em dados simulados muito parecidos, mas não exatamente iguais aos mostrados aqui. Neste enredo diagnóstico é claro, existem outros valores espúrios até cerca de 7,5 em tamanho e os dois picos têm valores em torno de 14.
whuber
Boa resposta - isso parece promissor. Muito obrigado. Voltarei a você mais tarde com meus resultados.
mohamedmoussa
Apenas um acompanhamento rápido - fiz algo semelhante ao que você fez, mas tive acesso ao desvio padrão dos dados dentro de cada ponto de dados (ou seja, dentro de cada período de 5 minutos). Dividi pela DST suavizada e obtive bons resultados.
mohamedmoussa
uau, eu senti falta disso! (+1!)
Elvis
3

Aqui está uma sugestão de dois centavos.

Indique a série diferenciada. Dado e um ponto , defina XtΔ>0t

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

Vamos dizer que , o valor de caracteriza as zonas off / on por valores baixo / alto.Δ=50a(Δ,t)

Um passo anômalo é um ponto onde - você precisará fazer alguns ajustes em para detectar o que deseja e evitar falso positivo quando a máquina for ligada. Eu tentaria primeiro com e .t|Xt|>αa(Δ,t)α,ΔΔ=50α=4

Como alternativa, você pode ver os pontos onde para a (por exemplo, , ), que podem ajudar o ajuste fino (nesse caso, você usaria um valor menor para ).ta(δ,t)>αa(Δ,t)δΔδ=10Δ=100α

Elvis
fonte
é possível escrever um código R para implementar isso? Obrigado!
user9292