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:
- 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.
- Regroupez ces courbes transformées à l'aide du
kml
package de R.
J'ai deux questions:
- Est-ce une approche exploratoire raisonnable?
- Comment puis-je transformer mes données dans le format de données longitudinal qui
kml
comprendra? Tous les extraits R seraient très appréciés!
r
time-series
clustering
fmark
la source
la source
kml
?Réponses:
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.
Let n i yi=(yi1,yi2,…,yit) d(yi,yj)=t−1∑tk=1(yik−yjk)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.
kml
paquet 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 , etCi-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, ilt
kml
vous suffit de construire unclusterizLongData
objet (unid
nombre pour la première colonne et les mesures dans les colonnes suivantes).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 .
la source
kml
utilisé 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?Une approche alternative a été publiée par un habitué des statistiques de Wang, Xiaozhe, Kate Smith et Rob Hyndman.
Ils écrivent:
Le code R est disponible sur le blog de Rob .
la source
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.
la source