'Raggruppamento' di serie storiche in R


38

Ho un insieme di dati di serie storiche. Ogni serie copre lo stesso periodo, anche se le date effettive di ciascuna serie temporale potrebbero non "allinearsi" esattamente.

Vale a dire, se le serie temporali fossero lette in una matrice 2D, sarebbe simile a questa:

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 

Voglio scrivere uno script R che separerà le serie temporali {T1, T2, ... TN} in "famiglie" in cui una famiglia è definita come un insieme di serie che "tendono a muoversi in simpatia" l'una con l'altra.

Per la parte "clustering", dovrò selezionare / definire un tipo di misura della distanza. Non sono del tutto sicuro di come procedere, dal momento che ho a che fare con le serie temporali e un paio di serie che possono muoversi in simpatia su un intervallo, potrebbero non farlo in un intervallo successivo.

Sono sicuro che ci sono persone molto più esperte / intelligenti di me qui, quindi sarei grato per eventuali suggerimenti, idee su quale algoritmo / euristico usare per la misura della distanza e su come usarlo nel raggruppare le serie temporali.

La mia ipotesi è che NON esiste un solido metodo statistico per farlo, quindi sarei molto interessato a vedere come le persone affrontano / risolvono questo problema - pensando come uno statistico.


1
Potresti anche essere interessato alle risposte a questa domanda, stats.stackexchange.com/q/2777/1036
Andy W


1
Esiste un metodo statistico basato sui processi di Dirichlet che funziona per set di dati in cui i punti temporali non sono gli stessi per tutti i campioni.
Dario,

Risposte:


24

Nel flusso di dati e nel mining di database di serie temporali, un approccio comune è quello di trasformare le serie in una rappresentazione simbolica, quindi utilizzare una metrica di somiglianza, come la distanza euclidea, per raggruppare le serie. Le rappresentazioni più popolari sono SAX (Keogh & Lin) o il più recente iSAX (Shieh & Keogh):

Le pagine sopra contengono anche riferimenti a metriche di distanza e clustering. Keogh e l'equipaggio sono impegnati nella ricerca riproducibile e sono piuttosto ricettivi a rilasciare il loro codice. Quindi potresti inviarli via email e chiedere. Credo che tendano a funzionare in MATLAB / C ++.

C'è stato un recente sforzo per produrre un'implementazione Java e R:

Non so quanto sia lungo - è orientato alla ricerca di motivi, ma, a seconda di quanto sono arrivati, dovrebbe avere le parti necessarie per mettere insieme qualcosa per le tue esigenze (iSAX e metriche di distanza: poiché questa parte è comune al raggruppamento e alla ricerca di motivi).


1
Sembra un buon punto di partenza tracciabile. grazie per i collegamenti.
morphea

4
Merda, penso che la pagina SAX sia la pagina web più brutta che abbia mai visto!
naught101

18

Un altro modo di dire "tendono a muoversi con simpatia" è "cointegrato".

Esistono due modi standard per calcolare la cointegrazione : il metodo Engle-Granger e la procedura Johansen. Questi sono trattati in "Analisi di serie temporali integrate e cointegrate con R" (Pfaff 2008) e nel relativo pacchetto R urca . Consiglio vivamente il libro se si desidera perseguire questi metodi in R.

Consiglio anche di esaminare questa domanda in serie temporali multivariate e, in particolare, nel corso di Ruey Tsay a U. Chicago, che include tutto il codice R necessario.


Mi ero imbattuto nell'integrazione monetaria qualche anno fa - ma mi sembrava terribilmente complicato (non l'ho capito!). Speravo che ci sarebbe stata una soluzione meno teorica (cioè più pratica) ...
morphheous

3
Il metodo Engle-Granger non è particolarmente complicato: basta prendere i residui di una regressione tra le due serie e determinare se ha una radice unitaria. Questo è certamente pratico: viene utilizzato regolarmente per un'ampia gamma di problemi. Detto questo, immagino che qualsiasi risposta alla tua domanda richiederà alcune conoscenze statistiche (ad esempio, dovresti capire cose come la stazionarietà, l'indipendenza, ecc.) ...
Shane,

c'è un modo migliore per farlo che testare tutte le serie a coppie per la co-integrazione (con lo stesso ideale in mente per raggruppare le serie insieme?) Inoltre questo suggerimento non dipenderà dal fatto che le serie stesse sono integrate all'inizio?
Andy W

@Andy: sono sicuro che ci sia un modo migliore e non vedo l'ora di sentirlo. Questo è un approccio piuttosto semplice.
Shane,

1
> non posso suggerire nient'altro, ma la cointegrazione è al tempo stesso molto fragile ("assunzioni parametriche" in serie selvagge) nella pratica e poco adatta per il compito da svolgere: ad ogni passo, equivale a fare un raggruppamento gerarchico, al massimo fondendo due serie a una (la media co-integrata).
user603

4

Le serie temporali di clustering sono eseguite abbastanza comunemente dai dinamacisti della popolazione, in particolare quelli che studiano gli insetti per comprendere le tendenze di scoppio e collasso. Cerca lavoro su falena zingara, budoworm di abete rosso, scarabeo di pino mugo e larice di larice.

Per l'effettivo clustering puoi scegliere qualsiasi metrica di distanza ti piaccia, ognuna probabilmente ha i suoi punti di forza e di debolezza relativi al tipo di dati che vengono raggruppati, Kaufmann e Rousseeuw 1990. Trovare gruppi in dati. Un'introduzione all'analisi dei cluster è un buon punto di partenza. Ricorda, al metodo del clustering non importa che stai utilizzando una serie temporale, guarda solo i valori misurati nello stesso momento. Se le tue due serie temporali non sono abbastanza sincronizzate per tutta la loro durata, non saranno (e forse non dovrebbero) raggrupparsi.

Il punto in cui si verificano problemi è la determinazione del numero di cluster (famiglie) da utilizzare dopo aver raggruppato le serie storiche. Esistono vari modi per selezionare un cut-off di cluster informativi, ma qui la letteratura non è così buona.


1
y1,t

1
@ user603 Puoi spiegare "Devi riconoscere che una serie è fortemente correlata al proprio passato mettendo ogni y1, t come una dimensione propria (ovvero risultando in dimensioni N * T)" per favore?
B_Miner

2

Vedi la mia risposta a una domanda simile qui . Per farla breve, esegui una rapida trasformazione di Fourier dei dati, scarta le frequenze ridondanti se i tuoi dati di input erano valutati in modo reale, separa le parti reali e immaginarie per ogni elemento della trasformata di Fourier veloce e usa il pacchetto Mclust in R per fare modello- cluster basato sulle parti reali e immaginarie di ciascun elemento di ogni serie temporale. Il pacchetto automatizza l'ottimizzazione del numero di cluster e delle loro densità.


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.