Ich habe eine etwas laute Zeitreihe, die auf verschiedenen Ebenen schwebt.
Zum Beispiel die folgenden Daten:
Ich habe die durchgezogenen Liniendaten zur Verfügung und möchte eine Schätzung für die gestrichelte Linie erhalten. Es sollte stückweise konstant sein.
Welche Algorithmen sollten Sie hier ausprobieren?
Meine bisherigen Ideen drehen sich um 0-Grad-P-Splines (aber wie finde ich heraus, wo die Knoten platziert werden sollen?) Oder Strukturbruchmodelle. Ein Regressionsbaum ist die beste Idee, die ich derzeit habe, aber im Idealfall würde ich nach einer Methode suchen, die die Tatsache berücksichtigt, dass die beiden Ebenen bei y = 250 gleiche y-Werte haben. Wenn ich das richtig verstehe, würde ein Regressionsbaum diese beiden Intervalle in zwei verschiedene Gruppen mit jeweils unterschiedlichen Mittelwerten aufteilen.
Der R-Code, der es generiert hat, ist folgender:
set.seed(20181118)
true_fct = stepfun(c(100, 200, 250), c(200, 250, 300, 250))
x = 1:400
y = true_fct(x) + rt(length(x), df=1)
plot(x, y, type="l")
lines(x, true_fct(x), lty=2, lwd=3)
quelle
Antworten:
Eine einfache, robuste Methode, um mit solchen Störungen umzugehen, ist die Berechnung von Medianen.
Ein rollierender Median über ein kurzes Fenster erkennt alle bis auf die kleinsten Sprünge, während Mediane der Antwort innerhalb von Intervallen zwischen erkannten Sprüngen ihre Pegel zuverlässig schätzen. (Sie können diese letztere Schätzung durch eine robuste Schätzung ersetzen, die von den Ausreißern nicht beeinflusst wird.)
Sie sollten diesen Ansatz mit realen oder simulierten Daten abstimmen, um akzeptable Fehlerraten zu erzielen. Zum Beispiel fand ich es für die Simulation in der Frage gut, das zweite und das 98. Perzentil zu verwenden, um Schwellenwerte für die Erkennung der Sprünge festzulegen. Unter anderen Umständen - beispielsweise wenn viele Sprünge auftreten könnten - würden zentralere Perzentile besser funktionieren.
Hier ist das Ergebnis, das (a) die drei Sprünge als rote Punkte und (b) die vier geschätzten Ebenen als hellblaue Linien zeigt.
Es wird geschätzt, dass die Sprünge bei den Indizes 100, 200, 250 auftreten (genau dort, wo sie durch die Simulation auftreten), und die resultierenden Werte werden auf 199,6, 249,8, 300,0 und 250,2 geschätzt: alle innerhalb von 0,4 der tatsächlichen zugrunde liegenden Werte.
Dieses hervorragende Verhalten bleibt bei wiederholten Simulationen bestehen (Entfernen des
set.seed
Befehls am Anfang).Hier ist der
R
Code.quelle
zoo::rollmedian
eine ähnliche Funktion in Betracht ziehen , um Ihren Code zu vereinfachen.zoo
aber entschieden, es nicht zu benutzen, weil ich faul bin! Es war schneller und einfacher zu schreiben,rollmed
als die Argumentaufrufe für jede Funktion zu überprüfen, die möglicherweise bereits verfügbar ist. Außerdem gefällt mir, wierollmed
deutlich zeigt, was ich tue, anstatt die Details hinter einer Black Box zu verstecken.zoo
, ich war mir nicht sicher, ob Sie es nichtWenn Sie immer noch an einer Glättung mit L0-Strafen interessiert sind, würde ich einen Blick auf die folgende Referenz werfen: "Visualisierung genomischer Veränderungen durch segmentierte Glättung mit einer L0-Strafe" - DOI: 10.1371 / journal.pone.0038230 (eine nette Einführung in die Whittaker Smoother finden Sie in P. Eilers Papier "A Perfect Smoother" (DOI: 10.1021 / ac034173t). Um Ihr Ziel zu erreichen, müssen Sie natürlich ein wenig an der Methode arbeiten.
Grundsätzlich benötigen Sie 3 Zutaten:
Natürlich müssten Sie auch die optimale Glättungsmenge auswählen. Dies wird von meinen Zimmermannsaugen für dieses Beispiel gemacht. Sie können die Kriterien in DOI verwenden: 10.1371 / journal.pone.0038230 (S. 5, aber ich habe es in Ihrem Beispiel nicht versucht).
Unten finden Sie einen kleinen Code. Ich habe einige Kommentare als Leitfaden hinterlassen.
PS. Dies ist meine erste Antwort auf Cross Validated. Ich hoffe es ist nützlich und klar genug :-)
quelle
Ich würde in Betracht ziehen, Ruey Tsays Artikel Ausreißer, Pegelverschiebungen und Varianzänderungen in Zeitreihen-Differenzierungsmodellen mit AR1- und 21-Ausreißern zu verwenden.
Wir haben die Differenzierung deaktiviert und die Pegelverschiebungen werden speziell angezeigt.
quelle