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 R
implementaçã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)
Aqui está o gráfico de diagnóstico:
> u <- f(x)
> plot(u)
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 f
para procurar simultaneamente valores altos do diagnóstico r/z
e 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.