Ten post jest kontynuacją kolejnego postu związanego z ogólną metodą wykrywania wartości odstających w szeregach czasowych . Zasadniczo w tym momencie interesuje mnie solidny sposób odkrywania okresowości / sezonowości ogólnych szeregów czasowych dotkniętych dużym hałasem. Z punktu widzenia programisty chciałbym prosty interfejs, taki jak:
unsigned int discover_period(vector<double> v);
Gdzie v
jest tablica zawierająca próbki, a zwracana wartość to okres sygnału. Chodzi o to, że znowu nie mogę przyjąć żadnego założenia dotyczącego analizowanego sygnału. Próbowałem już podejścia opartego na autokorelacji sygnału (wykrywanie szczytów korelogramu), ale nie jest ono solidne, jak bym chciał.
time-series
algorithms
frequency
real-time
gianluca
źródło
źródło
Odpowiedzi:
Jeśli naprawdę nie masz pojęcia, co to jest okresowość, prawdopodobnie najlepszym rozwiązaniem jest znalezienie częstotliwości odpowiadającej maksymalnej gęstości widmowej. Jednak na spektrum przy niskich częstotliwościach będzie miał wpływ trend, więc najpierw musisz odrzucić serię. Następująca funkcja R powinna wykonać zadanie dla większości serii. Jest daleki od ideału, ale przetestowałem go na kilkudziesięciu przykładach i wydaje się, że działa dobrze. Zwróci 1 dla danych, które nie mają silnej okresowości, a długość okresu w przeciwnym razie.
Aktualizacja: Wersja 2 funkcji. Jest to znacznie szybsze i wydaje się bardziej niezawodne.
źródło
findfrequency
Jeśli oczekujesz, że proces będzie stacjonarny - okresowość / sezonowość nie zmieni się w czasie - wtedy coś w rodzaju okresogramu chi-kwadrat (patrz np. Sokolove i Bushell, 1978) może być dobrym wyborem. Jest powszechnie stosowany w analizie danych okołodobowych, które mogą mieć bardzo duże ilości hałasu, ale oczekuje się, że będą miały bardzo stabilne okresy.
Podejście to nie zakłada założenia kształtu fali (poza tym, że jest on spójny między cyklami), ale wymaga, aby każdy szum miał stałą średnią i nie był skorelowany z sygnałem.
Ostatnie dwa wiersze są tylko przykładem, pokazującym, że może on identyfikować okres czystej funkcji trygonometrycznej, nawet przy dużej ilości szumów addytywnych.
Jak napisano, ostatni argument (
alpha
) w wywołaniu jest zbędny, funkcja po prostu zwraca „najlepszy” okres, jaki można znaleźć; odkomentuj pierwszereturn
stwierdzenie i skomentuj drugie, aby zwrócić listę wszystkich istotnych okresów na poziomiealpha
.Ta funkcja nie dokonuje żadnego sprawdzenia poprawności poczytalności, aby upewnić się, że wprowadziłeś identyfikowalne okresy, ani nie (może to) działać z okresami ułamkowymi, ani nie ma wbudowanej kontroli wielokrotnego porównania, jeśli zdecydujesz się spójrz na wiele okresów. Ale poza tym powinien być dość solidny.
źródło
Możesz lepiej zdefiniować, co chcesz (dla siebie, jeśli nie tutaj). Jeśli to, czego szukasz, jest najistotniejszym statystycznie okresem stacjonarnym zawartym w zaszumionych danych, istnieją zasadniczo dwie trasy:
1) obliczyć solidne oszacowanie autokorelacji i przyjąć maksymalny współczynnik
2) obliczyć solidne oszacowanie gęstości widmowej mocy i przyjąć maksimum widma
Problem z numerem 2 polega na tym, że dla każdej hałaśliwej serii czasowej otrzymasz dużą moc na niskich częstotliwościach, co utrudnia rozróżnienie. Istnieją pewne techniki rozwiązania tego problemu (np. Wstępne wybielanie, a następnie oszacowanie PSD), ale jeśli prawdziwy okres na podstawie danych jest wystarczająco długi, automatyczne wykrywanie będzie trudne.
Najlepszym rozwiązaniem jest prawdopodobnie wdrożenie solidnej procedury autokorelacji, takiej jak opisana w rozdziale 8.6, 8.7 w Solidnej statystyki - teorii i metod autorstwa Maronny, Martina i Yohai. Wyszukanie w Google hasła „solidny durbin-levinson” również przyniesie pewne rezultaty.
Jeśli szukasz prostej odpowiedzi, nie jestem pewien, czy istnieje. Wykrywanie okresu w szeregach czasowych może być skomplikowane, a prośba o zautomatyzowaną procedurę, która może wykonywać magię, może być zbyt duża.
źródło
Możesz użyć transformacji Hilberta z teorii DSP do pomiaru chwilowej częstotliwości twoich danych. Witryna http://ta-lib.org/ ma otwarty kod źródłowy do pomiaru dominującego okresu cyklu danych finansowych; odpowiednia funkcja nosi nazwę HT_DCPERIOD; możesz to wykorzystać lub dostosować kod do swoich celów.
źródło
Innym podejściem może być rozkład w trybie empirycznym. Pakiet R nazywa się EMD opracowany przez wynalazcę metody:
Metodę tę nazwano „Empiryczną” nie bez powodu i istnieje ryzyko, że funkcje trybu wewnętrznego (poszczególne składniki dodatków) zostaną pomieszane. Z drugiej strony metoda jest bardzo intuicyjna i może być pomocna w szybkiej wizualnej kontroli cykliczności.
źródło
W nawiązaniu do postu Roba Hyndmana powyżej https://stats.stackexchange.com/a/1214/70282
Funkcja find.freq działa doskonale. W codziennym zestawie danych, którego używam, poprawnie wyliczyła częstotliwość na 7.
Kiedy wypróbowałem to tylko w dni robocze, wspomniałem, że częstotliwość wynosi 23, co jest niezwykle zbliżone do 21,42857 = 29,6 * 5/7, co jest średnią liczbą dni roboczych w miesiącu. (Lub odwrotnie: 23 * 7/5 to 32.)
Patrząc wstecz na moje codzienne dane, eksperymentowałem z przeczuciem, biorąc pierwszy okres, uśredniając go, a następnie znajdując następny okres itp. Zobacz poniżej:
Powyższe daje (7,28) lub (7,35) w zależności od tego, czy sekwencja zaczyna się od 1 czy f. (Patrz komentarz powyżej.)
Co oznaczałoby, że okresy sezonowe dla msts (...) powinny wynosić (7,28) lub (7,35).
Logika wydaje się wrażliwa na warunki początkowe, biorąc pod uwagę czułość parametrów algorytmu. Średnia z 28 i 35 wynosi 31,5, co jest zbliżone do średniej długości miesiąca.
Podejrzewam, że wymyśliłem koło na nowo, jak nazywa się ten algorytm? Czy jest gdzieś lepsza implementacja w R?
Później uruchomiłem powyższy kod, próbując wszystkich początków od 1 do 7, i otrzymałem 35.325.28,28,28,28 za drugi okres. Średnia oblicza się do 30, co jest średnią liczbą dni w miesiącu. Ciekawy...
Wszelkie myśli lub komentarze?
źródło
Można również użyć testu Ljunga-Boxa, aby dowiedzieć się, która różnica sezonowa osiąga najlepszą stacjonarność. Pracowałem nad innym tematem i wykorzystałem to w rzeczywistości do tych samych celów. Wypróbuj różne okresy, np. Od 3 do 24, aby uzyskać dane miesięczne. Przetestuj każdy z nich przez Ljung-Box i zapisz wyniki Chi-Square. I wybierz okres o najniższej wartości chi-kwadrat.
Oto prosty kod, aby to zrobić.
źródło