Ich habe eine lange numerische Zeitreihendaten von etwa 200.000 Zeilen (nennen wir es Z ).
In einer Schleife unterteile ich x (etwa 30) aufeinanderfolgende Zeilen von Z gleichzeitig und behandle sie als Abfragepunkt q .
Ich möchte innerhalb von Z die y (~ 300) korrelierten Zeitreihensegmente der Länge x (am meisten korreliert mit q ).
Was ist ein effizienter Weg, dies zu erreichen?
Der folgende Code findet die 300 Segmente, nach denen Sie suchen und läuft in 8 Sekunden auf meinem nicht zu leistungsstarken Windows-Laptop, also sollte es schnell genug für Ihre Zwecke sein.
Zunächst wird eine 30-mal-199971-Matrix (% co_de%) erstellt, deren Spalten alle der Länge 30 "Zeitreihensegmente" enthalten, die Sie untersuchen möchten. Ein einzelner Aufruf von Zmat
, der auf dem Vektor cor()
und der Matrix q
arbeitet, berechnet dann alle gewünschten Korrelationskoeffizienten. Schließlich wird der resultierende Vektor untersucht, um die 300 Sequenzen mit den höchsten Korrelationskoeffizienten zu identifizieren.
Die naive Lösung ist in der Tat sehr langsam (mindestens einige Minuten - ich bin nicht geduldig genug):
%Vor%Sie können die Korrelation von Hand berechnen, von den ersten Momenten und Kommenten, aber es dauert noch einige Minuten.
%Vor%Sobald Sie die Zeitreihe der Korrelationen haben, Es ist leicht, die Position der Top 300 zu extrahieren.
%Vor%Tags und Links r subset time-series correlation