Es scheint, dass Sie innerhalb von Intervallen relativer Ruhe nach Spitzen suchen . "Relativ" bedeutet im Vergleich zu typischen Werten in der Nähe, was darauf hindeutet, die Reihe zu glätten . Eine robuste Glätte ist gerade deshalb wünschenswert, weil sie nicht durch einige lokale Spitzen beeinflusst werden sollte. "Ruhig" bedeutet, dass die Variation um diese Glätte gering ist. Auch hier ist eine robuste Schätzung der lokalen Variation wünschenswert. Schließlich wäre eine "Spitze" ein großes Residuum als Vielfaches der lokalen Variation.
Um dieses Rezept zu implementieren , müssen wir auswählen, (a) wie nahe "in der Nähe" bedeutet, (b) ein Rezept zum Glätten und (c) ein Rezept zum Finden lokaler Variationen. Möglicherweise müssen Sie mit (a) experimentieren, also machen wir es zu einem leicht steuerbaren Parameter. Gute, leicht verfügbare Auswahlmöglichkeiten für (b) und (c) sind Lowess bzw. IQR . Hier ist eine R
Implementierung:
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
}
Betrachten Sie als Beispiel für die Verwendung diese simulierten Daten, bei denen zwei aufeinanderfolgende Spitzen zu einer Ruheperiode hinzugefügt werden (zwei in einer Reihe sollten schwerer zu erkennen sein als eine isolierte Spitze):
> 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)
Hier ist das diagnostische Diagramm:
> u <- f(x)
> plot(u)
Trotz des Rauschens in den Originaldaten erkennt dieses Diagramm die (relativ kleinen) Spitzen in der Mitte auf wunderbare Weise. Automatisieren Sie die Erkennung, indem Sie f(x)
nach größeren Werten suchen (größer als etwa 5 im absoluten Wert: Experimentieren Sie, um herauszufinden, was mit Probendaten am besten funktioniert).
> spikes <- u[abs(u) >= 5]
240 241 273
9.274959 -9.586756 6.319956
Die falsche Erkennung zum Zeitpunkt 273 war ein zufälliger lokaler Ausreißer. Sie können den Test verfeinern , um (die meisten) derartigen Störwerte auszuschließen, indem Sie ändern f
, um nach gleichzeitig hohen Werten der Diagnose r/z
und niedrigen Werten des laufenden IQR zu suchen z
. Obwohl die Diagnose eine universelle (einheitlose) Skala und Interpretation hat, hängt die Bedeutung eines "niedrigen" IQR von den Einheiten der Daten ab und muss aus Erfahrung bestimmt werden.