„Grupowanie” szeregów czasowych w R.


38

Mam zestaw danych szeregów czasowych. Każda seria obejmuje ten sam okres, chociaż rzeczywiste daty w każdej serii czasowej mogą nie być dokładnie w jednej linii.

To znaczy, jeśli szeregi czasowe miałyby zostać odczytane w matrycy 2D, wyglądałoby to tak:

date     T1   T2   T3 .... TN
1/1/01   100  59   42      N/A
2/1/01   120  29   N/A     42.5
3/1/01   110  N/A  12      36.82
4/1/01   N/A  59   40      61.82
5/1/01    05  99   42      23.68
...
31/12/01  100  59   42     N/A

etc 

Chcę napisać skrypt R, który podzieli szeregi czasowe {T1, T2, ... TN} na „rodziny”, w których rodzina jest zdefiniowana jako zbiór szeregów, które „mają tendencję do poruszania się ze sobą w sympatii”.

W części „grupowanie” będę musiał wybrać / zdefiniować rodzaj miary odległości. Nie jestem do końca pewien, jak sobie z tym poradzić, ponieważ mam do czynienia z szeregami czasowymi, a para szeregów, które mogą poruszać się ze współczuciem w jednym przedziale, może nie robić tego w kolejnym przedziale.

Jestem pewien, że jest tu znacznie więcej doświadczonych / sprytnych ludzi, więc byłbym wdzięczny za wszelkie sugestie, pomysły na temat tego, jakiego algorytmu / heurystyki użyć do pomiaru odległości i jak wykorzystać to w grupowaniu szeregów czasowych.

Domyślam się, że NIE ma ustalonej solidnej metody statystycznej, aby to zrobić, więc byłbym bardzo zainteresowany, aby zobaczyć, jak ludzie podchodzą / rozwiązują ten problem - myśląc jak statystyki.


1
Możesz być także zainteresowany odpowiedziami na to pytanie, stats.stackexchange.com/q/2777/1036
Andy W


1
Istnieje metoda statystyczna oparta na procesach Dirichleta, która działa dla zestawów danych, w których punkty czasowe nie są takie same dla wszystkich próbek.
Dario

Odpowiedzi:


24

W strumieniowaniu danych i eksploracji baz danych szeregów czasowych powszechnym podejściem jest przekształcenie szeregu w symboliczną reprezentację, a następnie użycie metryki podobieństwa, takiej jak odległość euklidesowa, w celu zgrupowania szeregu. Najpopularniejsze reprezentacje to SAX (Keogh & Lin) lub nowszy iSAX (Shieh & Keogh):

Powyższe strony zawierają również odniesienia do wskaźników odległości i grupowania. Keogh i załoga prowadzą powtarzalne badania i są bardzo otwarci na opublikowanie swojego kodu. Możesz wysłać do nich e-maila i zapytać. Sądzę jednak, że mają tendencję do pracy w MATLAB / C ++.

Niedawno podjęto wysiłek, aby stworzyć implementację Java i R.

Nie wiem, jak daleko to jest - jest ukierunkowane na wyszukiwanie motywów, ale w zależności od tego, jak daleko się posunęły, powinno mieć niezbędne bity, które potrzebujesz, aby połączyć coś dla swoich potrzeb (iSAX i wskaźniki odległości: ponieważ ta część jest wspólna dla grupowania i znajdowania motywów).


1
Wygląda to na dobry, możliwy do wyjścia punkt początkowy. dzięki za linki.
morficzny

4
Cholera jasna, myślę, że strona SAX jest najbrzydszą stroną, jaką kiedykolwiek widziałem!
naught101

18

Innym sposobem powiedzenia „zmierzać do współczucia” jest „zintegrowany”.

Istnieją dwa standardowe sposoby obliczania kointegracji : metoda Engle-Granger i procedura Johansena. Są one omówione w „Analizie zintegrowanych i zintegrowanych szeregów czasowych z R” (Pfaff 2008) i powiązanym pakiecie R urca . Gorąco polecam książkę, jeśli chcesz zastosować te metody w R.

Polecam również przyjrzeć się temu pytaniu na wielowymiarowych szeregach czasowych , aw szczególności na kursie Ruey Tsay w U. Chicago, który zawiera wszystkie niezbędne kody R.


Kilka lat temu przeszedłem przez proces kointegracji - ale wydawało mi się to strasznie skomplikowane (nie rozumiałem tego!). Miałem nadzieję, że będzie mniej teoretyczne (tj. Bardziej praktyczne) rozwiązanie ...
morficzny

3
Metoda Engle-Grangera nie jest szczególnie skomplikowana: wystarczy pobrać resztki regresji między dwiema seriami i ustalić, czy ma ona pierwiastek jednostkowy. Jest to z pewnością praktyczne: stosuje się go regularnie w szerokim spektrum problemów. To powiedziawszy, wyobrażam sobie, że jakakolwiek odpowiedź na twoje pytanie będzie wymagała pewnej wiedzy statystycznej (na przykład powinieneś zrozumieć takie rzeczy jak stacjonarność, niezależność itp.) ...
Shane

czy istnieje lepszy sposób, aby to zrobić, niż przetestowanie wszystkich serii w parach pod kątem kointegracji (mając na uwadze ten sam ideał, aby połączyć klastry razem?) Również czy ta sugestia nie byłaby zależna od faktu, że same serie są zintegrowane na początku?
Andy W

@Andy: Jestem pewien, że jest lepszy sposób i czekam na wiadomość. To dość podstawowe podejście.
Shane

1
> nie mogę zasugerować niczego innego, ale kointegracja jest zarówno bardzo krucha („założenia parametryczne” zwariowały w szeregu) w praktyce, jak i nieodpowiednia dla danego zadania: na każdym etapie polega ona na tworzeniu grupowania hierarchicznego, co najwyżej łączenia dwóch szereg do jednego (średnia zintegrowana).
user603

4

Szeregi czasowe grupowania są dość często wykonywane przez dynamacistów populacji, szczególnie tych, którzy badają owady, aby zrozumieć trendy dotyczące wybuchu i zapaści. Poszukaj pracy na ćmy cygańskiej, budowormie świerkowym, chrząszczu sosnowym i modrzewiu modrzewiowym.

W przypadku faktycznego grupowania możesz wybrać dowolną metrykę odległości, którą chcesz, każda z nich ma prawdopodobnie swoje mocne strony i tygodniowość w stosunku do rodzaju grupowanych danych, Kaufmann i Rousseeuw 1990. Znajdowanie grup w danych. Wprowadzenie do analizy skupień jest dobrym miejscem do rozpoczęcia. Pamiętaj, że metoda grupowania nie „obchodzi”, że używasz szeregów czasowych, a jedynie przygląda się wartościom zmierzonym w tym samym momencie. Jeśli twoje dwa szeregi czasowe nie są wystarczająco zsynchronizowane w ciągu ich życia, nie będą (a być może nie powinny) klastra.

Problemem będzie określenie liczby klastrów (rodzin), które będą używane po zgrupowaniu szeregów czasowych. Istnieją różne sposoby wyboru odcięcia klastrów informacyjnych, ale tutaj literatura nie jest tak dobra.


1
y1,t

1
@ user603 Czy możesz wyjaśnić: „Musisz albo uznać, że seria jest silnie skorelowana z własną przeszłością, umieszczając każdy y1, t jako swój własny wymiar (tzn. uzyskując wymiary N * T)”, proszę?
B_Miner

2

Zobacz moją odpowiedź na podobne pytanie tutaj . Krótko mówiąc, zrób szybką transformację Fouriera danych, odrzuć zbędne częstotliwości, jeśli twoje dane wejściowe były wartościowe, oddziel rzeczywistą i urojoną część dla każdego elementu szybkiej transformacji Fouriera i użyj pakietu Mclust w R, aby wykonać model- oparte na grupowaniu na rzeczywistych i urojonych częściach każdego elementu każdej serii czasowej. Pakiet automatyzuje optymalizację pod kątem liczby klastrów i ich gęstości.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.