Zeitreihe 'Clustering' in R


38

Ich habe eine Reihe von Zeitreihendaten. Jede Serie deckt den gleichen Zeitraum ab, obwohl die tatsächlichen Daten in jeder Zeitreihe möglicherweise nicht alle genau aufeinander abgestimmt sind.

Das heißt, wenn die Zeitreihe in eine 2D-Matrix eingelesen würde, würde dies ungefähr so ​​aussehen:

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 

Ich möchte ein R-Skript schreiben, das die Zeitreihen {T1, T2, ... TN} in 'Familien' unterteilt, wobei eine Familie als eine Reihe von Reihen definiert wird, die "dazu neigen, sich in Sympathie zu bewegen".

Für den 'Clustering'-Teil muss ich eine Art Distanzmaß auswählen / definieren. Ich bin mir nicht ganz sicher, wie ich vorgehen soll, da ich es mit Zeitreihen zu tun habe und ein Paar von Reihen, die sich in einem Intervall mit Sympathie bewegen, dies möglicherweise in einem nachfolgenden Intervall nicht tut.

Ich bin mir sicher, dass es hier weitaus mehr erfahrene / klügere Leute gibt als ich. Daher wäre ich dankbar für Vorschläge, Ideen, welchen Algorithmus / welche Heuristik Sie für die Entfernungsmessung verwenden sollten und wie Sie diese beim Clustering der Zeitreihen verwenden können.

Ich vermute, dass es hierfür KEINE etablierte robuste statistische Methode gibt, daher würde ich mich sehr interessieren, wie die Leute dieses Problem angehen / lösen - wenn sie wie ein Statistiker denken.


1
Sie könnten auch an den Antworten auf diese Frage interessiert sein, stats.stackexchange.com/q/2777/1036
Andy W


1
Es gibt eine statistische Methode, die auf Dirichlet-Prozessen basiert und für Datensätze funktioniert, bei denen die Zeitpunkte nicht für alle Stichproben gleich sind.
Dario

Antworten:


24

Beim Daten-Streaming und Mining von Zeitreihendatenbanken besteht ein gängiger Ansatz darin, die Reihe in eine symbolische Darstellung umzuwandeln und dann eine Ähnlichkeitsmetrik wie die euklidische Entfernung zu verwenden, um die Reihe zu gruppieren. Die beliebtesten Darstellungen sind SAX (Keogh & Lin) oder der neuere iSAX (Shieh & Keogh):

Die obigen Seiten enthalten auch Verweise auf Entfernungsmetriken und Clustering. Keogh und seine Crew beschäftigen sich mit reproduzierbaren Recherchen und sind sehr empfänglich für die Veröffentlichung ihres Codes. Sie könnten sie also per E-Mail kontaktieren und fragen. Ich glaube, dass sie dazu neigen, in MATLAB / C ++ zu arbeiten.

Kürzlich wurde versucht, eine Java- und R-Implementierung zu erstellen:

Ich weiß nicht, wie weit es ist - es ist auf die Motivfindung ausgerichtet, aber je nachdem, wie weit sie gekommen sind, sollte es die erforderlichen Teile enthalten, die Sie benötigen, um etwas für Ihre Bedürfnisse zusammenzustellen (iSAX- und Entfernungsmetriken: da dieser Teil für Clustering und Motivfindung typisch ist).


1
Dies sieht nach einem guten, nachvollziehbaren Ausgangspunkt aus. danke für die links.
morphe

4
Heiliger Mist, ich denke, dass die SAX-Seite die hässlichste Webseite ist, die ich je gesehen habe!
Naught101

18

Eine andere Art zu sagen, "neige dazu, sich in Sympathie zu bewegen", ist "integriert".

Es gibt zwei Standardmethoden zur Berechnung der Kointegration : die Engle-Granger-Methode und das Johansen-Verfahren. Diese werden in "Analyse integrierter und kointegrierter Zeitreihen mit R" (Pfaff 2008) und dem dazugehörigen R urca-Paket behandelt . Ich kann das Buch nur empfehlen, wenn Sie diese Methoden in R verfolgen möchten.

Ich empfehle Ihnen auch, sich diese Frage zu multivariaten Zeitreihen und insbesondere zu Ruey Tsays Kurs an der Universität von Chicago anzusehen, der den gesamten erforderlichen R-Code enthält.


Ich war vor ein paar Jahren durch die Integration gekommen - aber es schien mir schrecklich kompliziert (ich habe es nicht verstanden!). Ich hatte gehofft, es gäbe eine weniger theoretische (dh praktischere) Lösung ...
morphe

3
Die Engle-Granger-Methode ist nicht besonders kompliziert: Sie nehmen einfach die Reste einer Regression zwischen den beiden Reihen und bestimmen, ob sie eine Einheitswurzel hat. Dies ist sicherlich praktisch: Es wird regelmäßig für ein breites Spektrum von Problemen verwendet. Trotzdem stelle ich mir vor, dass jede Antwort auf Ihre Frage etwas statistisches Wissen erfordert (zum Beispiel sollten Sie Dinge wie Stationarität, Unabhängigkeit usw. Verstehen) ...
Shane

Gibt es einen besseren Weg, dies zu tun, als alle paarweisen Serien auf ihre Ko-Integration zu testen (mit dem gleichen Ideal, um Serien zusammen zu gruppieren?)? Wäre dieser Vorschlag nicht auch von der Tatsache abhängig, dass die Serien selbst integriert sind zu Beginn?
Andy W

@Andy: Ich bin mir sicher, dass es einen besseren Weg gibt, und ich freue mich darauf, davon zu hören. Dies ist ein ziemlich grundlegender Ansatz.
Shane

1
> Ich kann nichts anderes vorschlagen, aber die Kointegration ist in der Praxis sehr fragil („parametrische Annahmen“, die durcheinander geraten sind) und für die jeweilige Aufgabe ungeeignet: Bei jedem Schritt werden hierarchische Cluster gebildet, höchstens zwei Serie zu Eins (der mitintegrierte Mittelwert).
user603

4

Clustering-Zeitreihen werden relativ häufig von Populationsdynamikern durchgeführt, insbesondere von solchen, die Insekten untersuchen, um Trends in Bezug auf Ausbruch und Kollaps zu verstehen. Arbeiten an Zigeunermotte, Fichtenknospe, Latschenkäfer und Lärchenknospe.

Für das eigentliche Clustering können Sie eine beliebige Distanzmetrik auswählen. Jede hat wahrscheinlich ihre eigenen Stärken und Schwächen im Verhältnis zur Art der Daten, die geclustert werden, Kaufmann und Rousseeuw 1990. Suchen von Gruppen in Daten. Eine Einführung in der Clusteranalyse ist ein guter Anfang. Denken Sie daran, dass es der Clustering-Methode nicht wichtig ist, dass Sie eine Zeitreihe verwenden, sondern nur die zum gleichen Zeitpunkt gemessenen Werte. Wenn Ihre beiden Zeitreihen über ihre Lebensdauer nicht synchron genug sind, werden sie nicht (und sollten es vielleicht auch nicht) zu einem Cluster.

Wenn Sie Probleme haben, müssen Sie die Anzahl der zu verwendenden Cluster (Familien) bestimmen, nachdem Sie die Zeitreihen geclustert haben. Es gibt verschiedene Möglichkeiten, einen Ausschnitt aus informativen Clustern auszuwählen, aber hier ist die Literatur nicht so gut.


1
y1,t

1
@ user603 Können Sie erklären, dass Sie entweder zugeben müssen, dass eine Reihe in hohem Maße mit ihrer eigenen Vergangenheit korreliert, indem Sie jedes y1, t als eigene Dimension eingeben (dh N * T-Dimensionen ergeben)?
B_Miner

2

Siehe meine Antwort auf eine ähnliche Frage hier . Kurz gesagt, machen Sie eine schnelle Fouriertransformation der Daten, verwerfen Sie redundante Frequenzen, wenn Ihre Eingabedaten reelle Werte hatten, trennen Sie den Real- und Imaginärteil für jedes Element der schnellen Fouriertransformation und verwenden Sie das Mclust-Paket in R, um die Modellierung durchzuführen. basiertes Clustering auf den Real- und Imaginärteilen jedes Elements jeder Zeitreihe. Das Paket automatisiert die Optimierung über die Anzahl der Cluster und deren Dichte.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.