Est-il possible de regrouper des séries chronologiques en fonction de la forme de la courbe?

47

J'ai des données sur les ventes pour une série de points de vente et je souhaite les classer en fonction de la forme de leurs courbes au fil du temps. Les données ressemblent à peu près à ceci (mais ne sont évidemment pas aléatoires et ont des données manquantes):

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)

Je voudrais savoir comment je peux regrouper en fonction de la forme des courbes dans R. J'avais envisagé l'approche suivante:

  1. Créez une nouvelle colonne en transformant linéairement la variable var0 de chaque magasin en une valeur comprise entre 0,0 et 1,0 pour toute la série chronologique.
  2. Regroupez ces courbes transformées à l'aide du kmlpackage de R.

J'ai deux questions:

  1. Est-ce une approche exploratoire raisonnable?
  2. Comment puis-je transformer mes données dans le format de données longitudinal qui kmlcomprendra? Tous les extraits R seraient très appréciés!
fmark
la source
2
vous pourriez avoir quelques idées d'une question précédente sur le regroupement de trajectoires de données longitudinales individuelles stats.stackexchange.com/questions/2777/…
Jeromy Anglim
1
@ Jeromy Anglin Merci pour le lien. Avez-vous eu de la chance avec kml?
Mark
J'ai jeté un coup d'œil mais, pour le moment, j'utilise une analyse par grappes personnalisée basée sur certaines caractéristiques de la série temporelle (moyenne, initiale, finale, variabilité, présence de changements brusques, etc.).
Jeromy Anglim
Est-ce un doublon? stats.stackexchange.com/questions/3238/…
Rob Hyndman
@Rob Cette question ne semble pas reposer sur des intervalles de temps irréguliers, mais en réalité, ils sont proches l'un de l'autre (je ne me suis pas rappelé de l'autre question au moment de mes écrits).
chl

Réponses:

26

Plusieurs liens d’analyse des données longitudinales ont été discutés dans le lien fourni par @Jeromy. Je vous suggère donc de les lire attentivement, en particulier ceux sur l’analyse fonctionnelle des données. Essayez googler pour "Clustering fonctionnel de données longitudinales" ou la boîte à outils PACE Matlab qui concerne spécifiquement le clustering de trajectoires échantillonnées de manière irrégulière (Peng et Müller, Clustering basé sur la distance de processus stochastiques peu observés, avec applications aux enchères en ligne , Annals of Applied Statistics 2008 2: 1056). J'imagine qu'il peut exister un bon cadre statistique pour les séries chronologiques financières, mais je ne le sais pas.

Le kmlpaquet repose essentiellement sur k-moyennes, travaillant (par défaut) sur des distances euclidiennes entre les mesures observées sur individus. Ce que l’on appelle une trajectoire n’est que la série de valeurs observées pour chaque individu , ettniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Les données manquantes sont traitées par une légère modification de la mesure de distance précédente (ajustement de Gower) associée à un schéma d'imputation de type voisin le plus proche (pour le calcul du critère de Calinski). Comme je ne me représente pas à quoi ressembleraient vos vraies données, je ne peux pas dire si cela fonctionnera. Au moins, cela fonctionne avec les courbes de croissance longitudinales, la forme "polynomiale", mais je doute que cela vous permette de détecter des motifs très spécifiques (comme les minima / maxima locaux à des instants spécifiques avec des instants différant entre les grappes, par une translation de exemple). Si vous souhaitez regrouper des courbes éventuellement mal alignées, vous devez alors impérativement rechercher d'autres solutions. Le regroupement fonctionnel et l'alignement , de Sangalli et al., Et les références qui y figurent peuvent constituer un bon point de départ.

Ci-dessous, je vous montre un code pouvant vous aider à l'expérimenter (ma valeur de départ est généralement fixée à 101, si vous souhaitez reproduire les résultats). Fondamentalement, pour utiliser, il kmlvous suffit de construire un clusterizLongDataobjet (un idnombre pour la première colonne et les mesures dans les colonnes suivantes).t

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)

Les deux figures suivantes représentent les données brutes simulées et la solution à cinq grappes (selon le critère de Calinski, également utilisé dans le package fpc ). Je ne montre pas la version mise à l' échelle .

texte alternatif

texte alternatif

chl
la source
1
Merci pour votre réponse très détaillée chi. J'ai kmlutilisé mes données, mais comme vous l'avez suggéré, la classification est principalement basée sur la magnitude plutôt que sur la forme de la courbe. J'essaie donc quelques étapes de prétraitement pour voir si je peux améliorer les choses. Le travail de Sangalli et al. semble très prometteur pour ce que je veux faire - je ne trouve cependant pas de mise en œuvre de leur approche. Je n'ai probablement pas le temps de créer ma propre mise en œuvre de leur travail pour ce projet, cependant. Êtes-vous au courant de la mise en œuvre de logiciels libres?
Fmark
@fmark Pas d'implémentation de logiciel libre à ma connaissance (le travail est cependant assez récent); ils utilisent k-means et k-medoids, tous deux disponibles en R. À mon avis, les éléments les plus critiques sont la génération de courbes de gabarit et la mise en oeuvre de la fonction de déformation. Pour cela, vous pouvez trouver des informations supplémentaires en consultant l’analyse morphométrie / procruste, ou en recherchant le code de la boîte à outils Matlab PACE (mais cela devrait être plein d’EM ou de choses du genre). Ma meilleure recommandation serait la suivante: demandez à l'auteur d'implémenter gratuitement son algorithme.
chl
2
Je ferai rapport si j'obtiens une affirmation :) Leur alignement k-mean en papier pour le regroupement de courbes contient quelques détails supplémentaires sur l'implémentation qui pourraient également être utiles à quelqu'un qui souhaite le faire lui-même.
Mark
1
Pourquoi ne pas simplement supprimer la moyenne (et peut-être diviser par la dévation standard), puis le faire? Ensuite, les résultats seraient beaucoup plus
axés
9

Une approche alternative a été publiée par un habitué des statistiques de Wang, Xiaozhe, Kate Smith et Rob Hyndman.

'Clustering basé sur les caractéristiques pour les données de série temporelle'. Exploration de données et découverte de connaissances 13, no. 3 (2006): 335–364 .

Ils écrivent:

Cet article propose une méthode de regroupement des séries chronologiques en fonction de leurs caractéristiques structurelles. Contrairement à d'autres solutions, cette méthode ne regroupe pas les valeurs de points à l'aide d'une métrique de distance, mais plutôt des grappes basées sur des entités globales extraites de la série chronologique. Les mesures de caractéristiques sont obtenues à partir de chaque série individuelle et peuvent être intégrées dans des algorithmes de classification arbitraires, notamment un algorithme de réseau neuronal non supervisé, une carte auto-organisatrice ou un algorithme de classification hiérarchique. Les mesures globales décrivant les séries chronologiques sont obtenues en appliquant des opérations statistiques qui capturent au mieux les caractéristiques sous-jacentes: tendance, saisonnalité, périodicité, corrélation en série, asymétrie, kurtosis, chaos, non-linéarité et similitude. Depuis que les grappes de méthodes utilisent des mesures globales extraites, il réduit la dimensionnalité de la série chronologique et est beaucoup moins sensible aux données manquantes ou bruitées. Nous fournissons en outre un mécanisme de recherche permettant de trouver la meilleure sélection parmi l'ensemble de fonctionnalités à utiliser comme entrées de clustering.

Le code R est disponible sur le blog de Rob .

fmark
la source
6

Vous pouvez regarder le travail de Eamonn Keogh (UC Riverside) sur le regroupement de séries chronologiques. Son site Web a beaucoup de ressources. Je pense qu'il fournit des exemples de code Matlab, vous devrez donc traduire cela en R.

Tampon irlandais
la source