Séries chronologiques 'clustering' in R


38

J'ai un ensemble de données chronologiques. Chaque série couvre la même période, bien que les dates réelles dans chaque série chronologique ne soient pas toutes "alignées" exactement.

Autrement dit, si la série chronologique devait être lue dans une matrice 2D, elle ressemblerait à ceci:

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 

Je veux écrire un script R qui séparera la série temporelle {T1, T2, ... TN} en "familles", une famille étant définie comme un ensemble de séries qui "ont tendance à se déplacer dans la sympathie" les unes avec les autres.

Pour la partie "clustering", je devrai sélectionner / définir un type de mesure de distance. Je ne sais pas trop comment procéder, car je traite de séries chronologiques, et une série de séries pouvant émouvoir par sympathie sur un intervalle peut ne pas l'être dans un intervalle ultérieur.

Je suis sûr qu'il y a beaucoup plus de personnes expérimentées / intelligentes que moi ici, donc je vous serais reconnaissant de toute suggestion ou idée sur l'algorithme / l'heuristique à utiliser pour la mesure de distance et sur la façon de l'utiliser pour regrouper les séries chronologiques.

À mon avis, il n’ya PAS de méthode statistique bien établie pour le faire. Je serais donc très intéressé de voir comment les gens abordent / résolvent ce problème - pensant comme un statisticien.


1
Vous pouvez également être intéressé par les réponses à cette question, stats.stackexchange.com/q/2777/1036
Andy W


1
Il existe une méthode statistique basée sur les processus de Dirichlet qui fonctionne pour les jeux de données où les points horaires ne sont pas les mêmes pour tous les échantillons.
Dario

Réponses:


24

Dans le flux de données et l'extraction de bases de données de séries chronologiques, une approche courante consiste à transformer la série en représentation symbolique, puis à utiliser une métrique de similarité, telle que la distance euclidienne, pour regrouper les séries. Les représentations les plus populaires sont SAX (Keogh & Lin) ou le plus récent iSAX (Shieh & Keogh):

Les pages ci-dessus contiennent également des références aux métriques de distance et au clustering. Keogh et son équipe sont engagés dans des recherches reproductibles et très réceptifs à la publication de leur code. Donc, vous pouvez leur envoyer un courriel et demander. Je pense qu’ils ont tendance à fonctionner dans MATLAB / C ++.

Il y a eu un effort récent pour produire une implémentation Java et R:

Je ne sais pas jusqu'où il se trouve - il est axé sur la recherche de motif, mais, selon leur degré d'avancement, il devrait disposer des éléments nécessaires pour mettre en place quelque chose pour vos besoins (métriques iSAX et distance: puisque cette partie est commune au regroupement et à la recherche de motif).


1
Cela ressemble à un bon point de départ pratique. merci pour les liens.
Morpheous

4
Bon sang, je pense que la page SAX est la page Web la plus laide que j'ai jamais vue!
naught101

18

Une autre façon de dire "ont tendance à être sympathiques" est "cointégrée".

Il existe deux méthodes standard de calcul de la cointégration : la méthode Engle-Granger et la procédure de Johansen. Celles-ci sont traitées dans «Analyse de séries chronologiques intégrées et cointégrées avec R» (Pfaff 2008) et dans le package R urca associé . Je recommande fortement le livre si vous souhaitez poursuivre ces méthodes dans R.

Je vous recommande également de regarder cette question sur les séries temporelles multivariées et, en particulier, sur le cours de Ruey Tsay à l'Université de Chicago, qui comprend tout le code R nécessaire.


J'avais traversé la cointégration il y a quelques années - mais cela me semblait terriblement compliqué (je ne le comprenais pas!). J'espérais qu'il y aurait une solution moins théorique (c'est-à-dire plus pratique) ...
morpheous

3
La méthode Engle-Granger n’est pas particulièrement compliquée: il suffit de prendre les résidus d’une régression entre les deux séries et de déterminer s’il existe une racine unitaire. Ceci est certainement pratique: il est utilisé régulièrement pour un large éventail de problèmes. Ceci dit, j'imagine que toute réponse à votre question nécessitera des connaissances statistiques (par exemple, vous devez comprendre des choses comme la stationnarité, l'indépendance, etc.) ...
Shane

Y a-t-il un meilleur moyen de le faire que de tester toutes les séries de paires pour la co-intégration (avec le même idéal en tête pour regrouper les séries ensemble?) Cette suggestion ne dépend-elle pas non plus du fait que les séries elles-mêmes sont intégrées au début?
Andy W

@Andy: Je suis sûr qu'il existe un meilleur moyen et j'ai hâte d'en entendre parler. C'est une jolie approche de base.
Shane

1
> Je ne peux pas suggérer autre chose, mais la cointégration est à la fois très fragile (série générique «d'hypothèses paramétriques») et peu adaptée à la tâche à accomplir: à chaque étape, cela revient à faire un clustering hiérarchique série à un (la moyenne co-intégrée).
user603

4

Les dynamacistes de la population, en particulier ceux qui étudient les insectes, effectuent assez souvent des séries de grappes pour comprendre les tendances en matière d'épidémie et d'effondrement. Cherchez des travaux sur la spongieuse, la tordeuse de l'épinette, le dendroctone du pin ponderosa et la tordeuse du mélèze.

Pour le regroupement réel, vous pouvez choisir la métrique de distance de votre choix. Chacune a probablement ses forces et son week-end par rapport au type de données regroupées, Kaufmann et Rousseeuw 1990. Recherche de groupes dans les données. Une introduction à l'analyse par grappes est un bon point de départ. Rappelez-vous que la méthode de regroupement n'a pas d'importance si vous utilisez une série chronologique, elle se contente de regarder les valeurs mesurées au même moment. Si vos deux séries chronologiques ne sont pas suffisamment synchronisées au cours de leur durée de vie, elles ne seront pas (et ne devraient peut-être pas) être regroupées.

Ce qui vous posera problème, c’est de déterminer le nombre de grappes (familles) à utiliser une fois la série chronologique établie. Il existe différentes manières de sélectionner une limite de grappes d'informations, mais ici la littérature n'est pas très bonne.


1
y1,t

1
@ user603 Pouvez-vous expliquer "Vous devez également reconnaître qu'une série est fortement corrélée à son propre passé en plaçant chaque y1, t comme une dimension qui lui est propre (c.-à-d. donnant lieu à N * T dimensions)" s'il vous plaît?
B_Miner

2

Voir ma réponse à une question similaire ici . En résumé, faites une transformation de Fourier rapide des données, éliminez les fréquences redondantes si vos données d'entrée étaient réellement valables, séparez les parties réelle et imaginaire de chaque élément de la transformation de Fourier rapide et utilisez le paquetage Mclust dans R pour modéliser regroupement basé sur les parties réelles et imaginaires de chaque élément de chaque série temporelle. Le progiciel automatise l’optimisation en fonction du nombre de clusters et de leurs densités.


0

Vous pouvez également utiliser le package clustDDist, qui applique la méthode des leaders et la méthode de classification hiérarchique avec différentes mesures d'erreur:

http://r-forge.r-project.org/projects/clustddist/

La distance euclidienne au carré favorise les configurations de distributions qui ont un pic élevé et donc mesurent

4(X,y)=(X-y)2y
est parfois préféré.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.