Dieser Beitrag ist die Fortsetzung eines anderen Beitrags, der sich auf eine allgemeine Methode zur Erkennung von Ausreißern in Zeitreihen bezieht . Grundsätzlich bin ich an dieser Stelle an einer robusten Methode interessiert, um die Periodizität / Saisonalität einer allgemeinen Zeitreihe zu ermitteln, die von vielen Störungen betroffen ist. Aus Entwicklersicht hätte ich gerne eine einfache Oberfläche wie:
unsigned int discover_period(vector<double> v);
Wo v
ist das Array mit den Samples und der Rückgabewert ist die Periode des Signals. Das Wichtigste ist, dass ich auch in Bezug auf das analysierte Signal keine Vermutung anstellen kann. Ich habe bereits einen Ansatz ausprobiert, der auf der Autokorrelation des Signals basiert (Erkennen der Peaks eines Korrelogramms), aber er ist nicht so robust, wie ich es gerne hätte.
quelle
Antworten:
Wenn Sie wirklich keine Ahnung haben, wie hoch die Periodizität ist, ist es wahrscheinlich am besten, die Frequenz zu finden, die dem Maximum der spektralen Dichte entspricht. Das Spektrum bei niedrigen Frequenzen wird jedoch vom Trend beeinflusst, daher müssen Sie zuerst die Serie abwerten. Die folgende R-Funktion sollte für die meisten Serien den Job erledigen. Es ist alles andere als perfekt, aber ich habe es an ein paar Dutzend Beispielen getestet und es scheint in Ordnung zu funktionieren. Es wird 1 für Daten zurückgegeben, die keine starke Periodizität aufweisen, andernfalls für die Länge des Zeitraums.
Update: Version 2 der Funktion. Dies ist viel schneller und scheint robuster zu sein.
quelle
findfrequency
Wenn Sie erwarten, dass der Prozess stationär ist - die Periodizität / Saisonalität wird sich mit der Zeit nicht ändern -, ist möglicherweise so etwas wie ein Chi-Quadrat-Periodogramm (siehe z. B. Sokolove und Bushell, 1978) eine gute Wahl. Es wird üblicherweise zur Analyse von circadianen Daten verwendet, die extrem viel Rauschen enthalten können, von denen jedoch sehr stabile Periodizitäten erwartet werden.
Bei diesem Ansatz wird keine Annahme über die Form der Wellenform getroffen (abgesehen davon, dass sie von Zyklus zu Zyklus konsistent ist), jedoch muss jedes Rauschen einen konstanten Mittelwert haben und nicht mit dem Signal korreliert sein.
Die letzten beiden Zeilen sind nur ein Beispiel, das zeigt, dass die Periode einer reinen trigonometrischen Funktion auch mit viel additivem Rauschen identifiziert werden kann.
Wie geschrieben, ist das letzte Argument (
alpha
) im Aufruf überflüssig. Die Funktion gibt einfach die 'beste' Periode zurück, die sie finden kann.return
Kommentieren Sie die erste Anweisung aus, und kommentieren Sie die zweite aus, um eine Liste aller auf der Ebene signifikanten Zeiträume zurückzugebenalpha
.Diese Funktion prüft nicht, ob Sie identifizierbare Zeiträume eingegeben haben. Sie kann auch nicht mit Bruchperioden arbeiten. Bei Bedarf ist auch keine Mehrfachvergleichssteuerung integriert Schauen Sie sich mehrere Perioden an. Aber ansonsten sollte es einigermaßen robust sein.
quelle
Möglicherweise möchten Sie klarer definieren, was Sie möchten (für sich selbst, wenn nicht hier). Wenn Sie nach der statistisch signifikantesten stationären Periode suchen, die in Ihren verrauschten Daten enthalten ist, müssen Sie im Wesentlichen zwei Routen wählen:
1) Berechnen Sie eine robuste Autokorrelationsschätzung und nehmen Sie den maximalen Koeffizienten
2) Berechnen Sie eine robuste Leistungsspektraldichteschätzung und nehmen Sie das Maximum des Spektrums
Das Problem bei Nr. 2 ist, dass Sie für alle verrauschten Zeitreihen eine große Leistung bei niedrigen Frequenzen erhalten, was die Unterscheidung erschwert. Es gibt einige Techniken, um dieses Problem zu lösen (z. B. Vorbleichen und dann Schätzen der PSD). Wenn der wahre Zeitraum Ihrer Daten jedoch lang genug ist, ist die automatische Erkennung problematisch.
Am besten ist es wahrscheinlich, eine robuste Autokorrelationsroutine zu implementieren, wie sie in Kapitel 8.6, 8.7 in Theorie und Methoden der robusten Statistik von Maronna, Martin und Yohai zu finden ist. Die Suche bei Google nach "robustem Durbin-Levinson" wird ebenfalls zu einigen Ergebnissen führen.
Wenn Sie nur nach einer einfachen Antwort suchen, bin ich mir nicht sicher, ob es eine gibt. Die Periodenerkennung in Zeitreihen kann kompliziert sein, und es kann zu viel sein, nach einer automatisierten Routine zu fragen, die Magie ausführen kann.
quelle
Sie können die Hilbert-Transformation aus der DSP-Theorie verwenden, um die Momentanfrequenz Ihrer Daten zu messen. Die Website http://ta-lib.org/ enthält Open-Source-Code zur Messung der dominanten Zykluszeit von Finanzdaten. die relevante Funktion heißt HT_DCPERIOD; Sie können dies möglicherweise verwenden oder den Code an Ihre Zwecke anpassen.
quelle
Ein anderer Ansatz könnte die empirische Moduszerlegung sein. Das R-Paket heißt EMD und wurde vom Erfinder des Verfahrens entwickelt:
Die Methode wurde aus gutem Grund als "empirisch" eingestuft, und es besteht die Gefahr, dass die intrinsischen Modusfunktionen (die einzelnen additiven Komponenten) vertauscht werden. Andererseits ist die Methode sehr intuitiv und kann für eine schnelle visuelle Überprüfung der Zyklizität hilfreich sein.
quelle
In Bezug auf Rob Hyndmans Beitrag über https://stats.stackexchange.com/a/1214/70282
Die find.freq-Funktion funktioniert hervorragend. Auf dem täglichen Datensatz, den ich verwende, wurde die Häufigkeit mit 7 korrekt berechnet.
Als ich es nur an den Wochentagen ausprobierte, wurde erwähnt, dass die Häufigkeit 23 ist, was bemerkenswert nahe an 21,42857 = 29,6 * 5/7 liegt, was der durchschnittlichen Anzahl von Arbeitstagen pro Monat entspricht. (Oder umgekehrt 23 * 7/5 ist 32.)
Wenn ich auf meine täglichen Daten zurückblicke, experimentierte ich mit der Vermutung, dass ich die erste Periode genommen, daraus gemittelt und dann die nächste Periode gefunden habe, usw. Siehe unten:
Das obige ergibt (7,28) oder (7,35), je nachdem, ob die Folge mit 1 oder f beginnt. (Siehe Kommentar oben.)
Was bedeuten würde, dass die saisonalen Perioden für MSTs (...) (7,28) oder (7,35) sein sollten.
Die Logik scheint in Anbetracht der Empfindlichkeit der Algorithmusparameter empfindlich gegenüber Anfangsbedingungen zu sein. Der Mittelwert von 28 und 35 liegt bei 31,5, was in etwa der durchschnittlichen Länge eines Monats entspricht.
Ich vermute, ich habe das Rad neu erfunden. Wie heißt dieser Algorithmus? Gibt es irgendwo eine bessere Implementierung in R?
Später habe ich den obigen Code ausgeführt, indem ich alle Starts von 1 bis 7 ausprobiert habe, und ich habe 35,35,28,28,28,28,28,28 für die zweite Periode erhalten. Der Durchschnitt liegt bei 30 Tagen pro Monat. Interessant...
Irgendwelche Gedanken oder Kommentare?
quelle
Mit dem Ljung-Box-Test kann man auch herausfinden, welcher saisonale Unterschied die beste Stationarität erreicht. Ich habe an einem anderen Thema gearbeitet und es tatsächlich für die gleichen Zwecke verwendet. Probieren Sie verschiedene Zeiträume wie 3 bis 24 aus, um monatliche Daten zu erhalten. Und testen Sie jeden von ihnen mit der Ljung-Box und speichern Sie die Chi-Square-Ergebnisse. Und wählen Sie die Periode mit dem niedrigsten Chi-Quadrat-Wert.
Hier ist ein einfacher Code, um das zu tun.
quelle