Ist es möglich, Zeitreihencluster basierend auf der Kurvenform zu erstellen?

47

Ich habe Verkaufsdaten für eine Reihe von Filialen und möchte sie anhand der Form ihrer Kurven im Zeitverlauf kategorisieren. Die Daten sehen ungefähr so ​​aus (sind aber offensichtlich nicht zufällig und enthalten einige fehlende Daten):

n.quarters <- 100
n.stores <- 20
if (exists("test.data")){
  rm(test.data)
}
for (i in 1:n.stores){
  interval <- runif(1, 1, 200)
  new.df <- data.frame(              
    var0 = interval + c(0, cumsum(runif(49, -5, 5))),
    date = seq.Date(as.Date("1990-03-30"), by="3 month", length.out=n.quarters),
    store = rep(paste("Store", i, sep=""), n.quarters))
  if (exists("test.data")){
    test.data <- rbind(test.data, new.df)    
  } else {
    test.data <- new.df
  }
}
test.data$store <- factor(test.data$store)

Ich würde gerne wissen, wie ich anhand der Form der Kurven in R Cluster bilden kann . Ich hatte den folgenden Ansatz in Betracht gezogen:

  1. Erstellen Sie eine neue Spalte, indem Sie die Variable "var0" jedes Geschäfts für die gesamte Zeitreihe linear auf einen Wert zwischen 0,0 und 1,0 transformieren.
  2. Bündeln Sie diese transformierten Kurven mit dem kmlPaket in R.

Ich habe zwei Fragen:

  1. Ist das ein vernünftiger explorativer Ansatz?
  2. Wie kann ich meine Daten in das Längsschnittdatenformat umwandeln, kmldas es versteht? Beliebige R-Schnipsel wären sehr dankbar!
fmark
quelle
2
Sie könnten ein paar Ideen aus einer früheren Frage zum Clustering einzelner longitudinaler Datenverläufe erhalten. stats.stackexchange.com/questions/2777/…
Jeromy Anglim
1
@ Jeromy Anglin Danke für den Link. Hattest du Glück mit kml?
5.
Ich habe einen kurzen Blick darauf geworfen, verwende jedoch momentan eine angepasste Clusteranalyse auf der Grundlage ausgewählter Merkmale der einzelnen Zeitreihen (z. B. Mittelwert, Anfang, Ende, Variabilität, Vorhandensein abrupter Änderungen usw.).
Jeromy Anglim
Ist das ein Duplikat? stats.stackexchange.com/questions/3238/…
Rob Hyndman
@Rob Diese Frage scheint keine unregelmäßigen Zeitintervalle anzunehmen, aber in der Tat sind sie nahe beieinander (ich habe zum Zeitpunkt meiner Schriften nicht an die andere Frage erinnert).
Chl

Antworten:

26

In dem von @Jeromy bereitgestellten Link wurden verschiedene Anweisungen zur Analyse von Längsschnittdaten erörtert. Daher empfehle ich Ihnen, diese sorgfältig zu lesen, insbesondere die Anweisungen zur Analyse von Funktionsdaten. Versuchen Sie, nach "Functional Clustering of Longitudinal Data" oder der PACE Matlab-Toolbox zu suchen, die sich speziell mit dem modellbasierten Clustering unregelmäßig abgetasteter Trajektorien befasst (Peng und Müller, abstandsbasiertes Clustering spärlich beobachteter stochastischer Prozesse, mit Anwendungen für Online-Auktionen) . Annals of Applied Statistics 2008 2: 1056). Ich kann mir vorstellen, dass es einen guten statistischen Rahmen für finanzielle Zeitreihen gibt, aber das weiß ich nicht.

kmltniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Fehlende Daten werden durch eine geringfügige Modifikation des vorhergehenden Abstandsmaßes (Gower-Anpassung) behandelt, das einem nächsten nachbarschaftlichen Imputationsschema zugeordnet ist (zur Berechnung des Calinski-Kriteriums). Da ich mir nicht vorstelle, wie Ihre realen Daten aussehen würden, kann ich nicht sagen, ob es funktionieren wird. Zumindest funktioniert es mit longitudinalen Wachstumskurven, "polynomialer" Form, aber ich bezweifle, dass Sie damit sehr spezifische Muster (wie lokale Minima / Maxima zu bestimmten Zeitpunkten mit Zeitpunkten, die sich zwischen Clustern unterscheiden) durch eine Übersetzung für erkennen können Beispiel). Wenn Sie daran interessiert sind, möglicherweise falsch ausgerichtete Kurven zu gruppieren, müssen Sie auf jeden Fall andere Lösungen in Betracht ziehen. Funktionales Clustering und Alignment von Sangalli et al. Und Referenzen darin können einen guten Ausgangspunkt liefern.

kmlclusterizLongDataidt

library(lattice)
xyplot(var0 ~ date, data=test.data, groups=store, type=c("l","g"))

tw <- reshape(test.data, timevar="date", idvar="store", direction="wide")
parallel(tw[,-1], horizontal.axis=F, 
         scales=list(x=list(rot=45, 
                            at=seq(1,ncol(tw)-1,by=2), 
                            labels=substr(names(tw[,-1])[seq(1,ncol(tw)-1,by=2)],6,100), 
                            cex=.5)))

library(kml)
names(tw) <- c("id", paste("t", 1:(ncol(tw)-1)))
tw.cld <- as.cld(tw)
cld.res <- kml(tw.cld,nbRedrawing=5)
plot(tw.cld)

Die nächsten beiden Zahlen sind die simulierten Rohdaten und die Fünf-Cluster-Lösung (gemäß dem Calinski-Kriterium, das auch im fpc- Paket verwendet wird). Ich zeige die skalierte Version nicht .

Alt-Text

Alt-Text

chl
quelle
1
Vielen Dank für Ihre sehr ausführliche Antwort Chi. Ich habe kmlmeine Daten in Betrieb genommen, aber wie Sie angedeutet haben, basiert die Clusterbildung hauptsächlich auf der Größe und nicht auf der Kurvenform. Daher versuche ich, einige Vorverarbeitungsschritte durchzuführen, um festzustellen, ob ich die Situation verbessern kann. Die Arbeit von Sangalli et al. sieht sehr vielversprechend aus für das, was ich tun möchte - ich kann jedoch keine Umsetzung ihres Ansatzes finden. Ich habe wahrscheinlich keine Zeit, meine eigene Implementierung ihrer Arbeit für dieses Projekt zu erstellen. Sind Ihnen FOSS-Implementierungen bekannt?
7.
@fmark Meines Wissens nach keine OSS-Implementierung (die Arbeit ist jedoch recht neu); Sie verwenden k-means und k-medoids, die beide in R verfügbar sind. Meiner Meinung nach besteht der kritischste Teil darin, Schablonenkurven zu generieren und die Warping-Funktion zu implementieren. Sie können zusätzliche Informationen finden, indem Sie sich Morphometrie / Procruste-Analyse ansehen oder den Code der Matlab PACE-Toolbox nachschlagen (dies sollte jedoch voller EM oder ähnlicher Dinge sein). Meine beste Empfehlung wäre: Fragen Sie den Autor nach einer kostenlosen Implementierung seines Algorithmus.
Chl
2
Ich melde mich zurück, wenn ich eine Bestätigung erhalte :) Ihre Papier- K-Mittelwert-Ausrichtung für Kurven-Clustering enthält einige weitere Implementierungsdetails, die auch für jemanden nützlich sein könnten, der dies selbst tun möchte.
Markieren Sie den
1
Warum nicht einfach den Mittelwert entfernen (und vielleicht durch die Standardabweichung dividieren) und dies dann tun? Dann würden die Ergebnisse viel mehr über die Form und weniger über die Größe sein ...
naught101
9

Ein alternativer Ansatz wurde von einer Statistik-Redaktion in Wang, Xiaozhe, Kate Smith und Rob Hyndman veröffentlicht.

'Merkmalbasiertes Clustering für Zeitreihendaten'. Data Mining und Knowledge Discovery 13, No. 3 (2006): 335–364 .

Sie schreiben:

In diesem Artikel wird eine Methode zur Zusammenfassung von Zeitreihen anhand ihrer strukturellen Eigenschaften vorgeschlagen. Im Gegensatz zu anderen Alternativen werden bei dieser Methode keine Punktwerte mithilfe einer Abstandsmetrik gruppiert, sondern es werden Cluster basierend auf globalen Features erstellt, die aus den Zeitreihen extrahiert wurden. Die Merkmalsmaße werden aus jeder einzelnen Reihe erhalten und können in beliebige Cluster-Algorithmen eingespeist werden, einschließlich eines unbeaufsichtigten neuronalen Netzwerk-Algorithmus, einer selbstorganisierenden Karte oder eines hierarchischen Cluster-Algorithmus. Globale Kennzahlen zur Beschreibung der Zeitreihen werden durch Anwendung statistischer Operationen ermittelt, die die zugrunde liegenden Merkmale am besten erfassen: Trend, Saisonalität, Periodizität, serielle Korrelation, Schiefe, Kurtosis, Chaos, Nichtlinearität und Selbstähnlichkeit. Da die Methode mithilfe extrahierter globaler Kennzahlen gruppiert wird, Es reduziert die Dimensionalität der Zeitreihen und reagiert weniger empfindlich auf fehlende oder verrauschte Daten. Wir bieten außerdem einen Suchmechanismus, um die beste Auswahl aus dem Funktionsumfang zu finden, der als Clustering-Eingaben verwendet werden soll.

Der R-Code ist auf Robs Blog verfügbar .

fmark
quelle
6

Sie können sich die Arbeit von Eamonn Keogh (UC Riverside) zum Thema Zeitreihenclustering ansehen. Seine Website hat viele Ressourcen. Ich denke, er stellt Matlab-Codebeispiele zur Verfügung, sodass Sie dies in R übersetzen müssen.

Irish Buffer
quelle