È possibile eseguire il clustering di serie temporali in base alla forma della curva?


47

Ho dati di vendita per una serie di punti vendita e desidero categorizzarli in base alla forma delle loro curve nel tempo. I dati sono più o meno così (ma ovviamente non sono casuali e hanno alcuni dati mancanti):

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)

Vorrei sapere come posso raggruppare in base alla forma delle curve in R. Avevo considerato il seguente approccio:

  1. Crea una nuova colonna trasformando linearmente var0 di ciascun negozio in un valore compreso tra 0,0 e 1,0 per l'intera serie temporale.
  2. Raggruppa queste curve trasformate usando il kmlpacchetto in R.

Ho due domande:

  1. È un approccio esplorativo ragionevole?
  2. Come posso trasformare i miei dati nel formato dati longitudinale che kmlcapirà? Qualsiasi frammento di R sarebbe molto apprezzato!

2
potresti avere alcune idee da una domanda precedente sul raggruppamento di singole traiettorie di dati longitudinali stats.stackexchange.com/questions/2777/…
Jeromy Anglim,

1
@Jeromy Anglin Grazie per il link. Hai avuto fortuna con kml?
fmark

Ho avuto una rapida occhiata, ma per il momento sto usando un'analisi cluster personalizzata basata su funzionalità selezionate delle singole serie temporali (ad esempio, media, iniziale, finale, variabilità, presenza di cambiamenti improvvisi, ecc.).
Jeromy Anglim,


@Rob Questa domanda non sembra assumere intervalli di tempo irregolari, ma in effetti sono vicini l'uno all'altro (non ho ricordato l'altra domanda al momento dei miei scritti).
chl

Risposte:


26

Diverse indicazioni per l'analisi dei dati longitudinali sono state discusse nel link fornito da @Jeromy, quindi suggerirei di leggerle attentamente, specialmente quelle sull'analisi dei dati funzionali. Prova a cercare su Google "Clustering funzionale di dati longitudinali" o la toolbox PACE Matlab che si occupa in particolare del raggruppamento basato su modelli di traiettorie campionate in modo irregolare (Peng e Müller, clustering basato sulla distanza di processi stocastici scarsamente osservati, con applicazioni alle aste online , Annals of Applied Statistics 2008 2: 1056). Posso immaginare che potrebbe esserci un buon quadro statistico per le serie temporali finanziarie, ma non lo so.

kmltnioyio=(yio1,yio2,...,yiot)d(yio,yj)=t-1ΣK=1t(yioK-yjK)2. I dati mancanti vengono gestiti attraverso una leggera modifica della misura della distanza precedente (regolazione di Gower) associata a uno schema di imputazione simile al vicino più vicino (per il calcolo del criterio di Calinski). Dato che non mi rappresento come sarebbero i tuoi dati reali, non posso dire se funzioneranno. Almeno, funziona con curve di crescita longitudinali, forma "polinomiale", ma dubito che ti consentirà di rilevare modelli molto specifici (come minimi / massimi locali in punti temporali specifici con punti temporali che differiscono tra i cluster, mediante una traduzione per esempio). Se sei interessato a raggruppare curve forse disallineate, allora devi assolutamente esaminare altre soluzioni; Il raggruppamento funzionale e l'allineamento , di Sangalli et al., E i relativi riferimenti possono fornire un buon punto di partenza.

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)

Le prossime due figure sono i dati simulati grezzi e la soluzione a cinque cluster (secondo il criterio di Calinski, utilizzato anche nel pacchetto fpc ). Non mostro la versione ridimensionata .

testo alternativo

testo alternativo


1
Grazie per la tua risposta molto dettagliata. Ho kmleseguito i miei dati, ma come hai suggerito, il clustering si basa principalmente sulla grandezza piuttosto che sulla forma della curva, quindi sto provando alcuni passaggi di pre-elaborazione per vedere se posso migliorare le cose. Il lavoro di Sangalli et al. sembra molto promettente per quello che voglio fare - non riesco comunque a trovare un'implementazione del loro approccio. Probabilmente non ho tempo per creare la mia realizzazione del loro lavoro per questo progetto, comunque. Sei a conoscenza di implementazioni FOSS?
fmark

@fmark Per quanto ne so, l'implementazione OSS (il lavoro è piuttosto recente); usano k-medie e k-medoidi che sono entrambi disponibili in R. A mio avviso, le parti più critiche sono generare curve di modello e implementare la funzione di deformazione. Per questo, potresti trovare ulteriori informazioni guardando l'analisi della morfometria / procruste o cercando il codice della toolbox Matlab PACE (ma questo dovrebbe essere pieno di EM o cose del genere). La mia migliore raccomandazione sarebbe: chiedere all'autore qualsiasi implementazione gratuita del loro algoritmo.
chl

2
Riferirò se ottengo un affermativo :) Il loro allineamento di carta k-mean per il raggruppamento di curve ha alcuni dettagli di implementazione che potrebbero anche essere utili a qualcuno che vuole farlo da solo.
fmark

1
Perché non semplicemente rimuovere la media (e forse dividere per la deviazione standard), e quindi farlo? Quindi i risultati sarebbero molto più sulla forma, e meno sulla grandezza ...
nought101

9

Un approccio alternativo è stato pubblicato da uno statsse regolare in Wang, Xiaozhe, Kate Smith e Rob Hyndman.

"Clustering basato su caratteristiche per dati di serie storiche". Data mining e Knowledge Discovery 13, n. 3 (2006): 335–364 .

Loro scrivono:

Questo documento propone un metodo per raggruppare le serie storiche in base alle loro caratteristiche strutturali. A differenza di altre alternative, questo metodo non raggruppa i valori dei punti usando una metrica della distanza, ma raggruppa in base alle caratteristiche globali estratte dalle serie temporali. Le misure delle caratteristiche sono ottenute da ogni singola serie e possono essere inserite in algoritmi di clustering arbitrari, tra cui un algoritmo di rete neurale non supervisionato, una mappa auto-organizzante o un algoritmo di clustering gerarchico. Le misure globali che descrivono le serie temporali sono ottenute applicando operazioni statistiche che meglio catturano le caratteristiche sottostanti: tendenza, stagionalità, periodicità, correlazione seriale, asimmetria, curtosi, caos, non linearità e auto-somiglianza. Poiché il metodo raggruppa utilizzando le misure globali estratte, riduce la dimensionalità delle serie temporali ed è molto meno sensibile ai dati mancanti o rumorosi. Forniamo inoltre un meccanismo di ricerca per trovare la migliore selezione dal set di funzionalità da utilizzare come input del clustering.

Il codice R è disponibile sul blog di Rob .


6

Potresti guardare il lavoro di Eamonn Keogh (UC Riverside) sul raggruppamento di serie storiche. Il suo sito Web ha molte risorse. Penso che fornisca esempi di codice Matlab, quindi dovresti tradurlo in R.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.