¿Es posible hacer agrupaciones de series temporales basadas en la forma de la curva?

47

Tengo datos de ventas para una serie de puntos de venta, y quiero clasificarlos según la forma de sus curvas a lo largo del tiempo. Los datos se ven más o menos así (pero obviamente no son aleatorios y faltan algunos datos):

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)

Me gustaría saber cómo puedo agrupar en función de la forma de las curvas en R. He considerado el siguiente enfoque:

  1. Cree una nueva columna transformando linealmente var0 de cada tienda a un valor entre 0.0 y 1.0 para toda la serie de tiempo.
  2. Agrupe estas curvas transformadas usando el kmlpaquete en R.

Tengo dos preguntas:

  1. ¿Es este un enfoque exploratorio razonable?
  2. ¿Cómo puedo transformar mis datos en el formato de datos longitudinal que kmlcomprenda? ¡Cualquier fragmento R sería muy apreciado!
fmark
fuente
2
puede obtener algunas ideas de una pregunta anterior sobre la agrupación de trayectorias de datos longitudinales individuales stats.stackexchange.com/questions/2777/…
Jeromy Anglim
1
@ Jeromy Anglin Gracias por el enlace. ¿Tuviste suerte con kml?
fmark
He echado un vistazo rápido, pero por el momento estoy usando un análisis de clúster personalizado basado en características seleccionadas de las series de tiempo individuales (p. Ej., Media, inicial, final, variabilidad, presencia de cambios abruptos, etc.).
Jeromy Anglim
¿Es esto un duplicado? stats.stackexchange.com/questions/3238/…
Rob Hyndman
@Rob Esta pregunta no parece suponer intervalos de tiempo irregulares, pero de hecho están cerca uno del otro (no recordaba la otra pregunta en el momento de mis escritos).
chl

Respuestas:

26

Se discutieron varias instrucciones para analizar los datos longitudinales en el enlace proporcionado por @Jeromy, por lo que te sugiero que las leas cuidadosamente, especialmente las relacionadas con el análisis de datos funcionales. Intente buscar en Google "Agrupación funcional de datos longitudinales", o la caja de herramientas PACE Matlab que se ocupa específicamente de la agrupación basada en modelos de trayectorias muestreadas irregularmente (Peng y Müller, agrupación basada en distancia de procesos estocásticos escasamente observados, con aplicaciones para subastas en línea , Anales de Estadística Aplicada 2008 2: 1056). Me imagino que puede haber un buen marco estadístico para las series de tiempo financieras, pero no sé sobre eso.

kmltniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Los datos faltantes se manejan mediante una ligera modificación de la medida de distancia anterior (ajuste de Gower) asociada al esquema de imputación similar al vecino más cercano (para calcular el criterio de Calinski). Como no me represento cómo se verían sus datos reales, no puedo decir si funcionará. Al menos, funciona con curvas de crecimiento longitudinal, forma "polinómica", pero dudo que le permita detectar patrones muy específicos (como mínimos / máximos locales en puntos de tiempo específicos con puntos de tiempo que difieren entre grupos, por una traducción para ejemplo). Si está interesado en agrupar curvas posiblemente desalineadas, definitivamente debe buscar otras soluciones; La agrupación funcional y la alineación , de Sangalli et al., Y sus referencias pueden proporcionar un buen punto de partida.

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)

Las siguientes dos cifras son los datos simulados sin procesar y la solución de cinco grupos (según el criterio de Calinski, también utilizado en el paquete fpc ). No muestro la versión escalada .

texto alternativo

texto alternativo

chl
fuente
1
Gracias por tu respuesta muy detallada chi. Me estoy kmlejecutando mis datos, pero como usted sugirió, se agrupa principalmente en función de la magnitud en lugar de la forma de la curva, por lo que estoy intentando algunos pasos de preprocesamiento para ver si puedo mejorar las cosas. El trabajo de Sangalli et al. parece muy prometedor para lo que quiero hacer; sin embargo, no puedo encontrar una implementación de su enfoque. Probablemente no tengo tiempo para crear mi propia implementación de su trabajo para este proyecto, sin embargo. ¿Conoces alguna implementación de FOSS?
fmark
@fmark No hay implementación de OSS que yo sepa (sin embargo, el trabajo es bastante reciente); usan k-means y k-medoids que están disponibles en R. En mi opinión, las partes más críticas son generar curvas de plantilla e implementar la función de deformación. Para eso, puede encontrar información adicional mirando el análisis de morfometría / procruste, o buscando el código de la caja de herramientas Matlab PACE (pero esto debería estar lleno de EM o cosas así). Mi mejor recomendación sería: pedirle al autor cualquier implementación gratuita de su algoritmo.
chl
2
Informaré si obtengo una respuesta afirmativa :) Su alineación k-mean en papel para el agrupamiento de curvas tiene más detalles de implementación que también podrían ser útiles para alguien que quiera hacer esto por sí mismo.
fmark
1
¿Por qué no simplemente eliminar la media (y tal vez dividir por la devaluación estándar) y luego hacer esto? Entonces los resultados serían mucho más sobre la forma, y ​​menos sobre la magnitud ...
naught101
9

Un enfoque alternativo fue publicado por stats.se regular en Wang, Xiaozhe, Kate Smith y Rob Hyndman.

'Agrupación basada en características para datos de series temporales'. Minería de datos y descubrimiento de conocimiento 13, no. 3 (2006): 335–364 .

Escriben:

Este artículo propone un método para la agrupación de series de tiempo basado en sus características estructurales. A diferencia de otras alternativas, este método no agrupa los valores de puntos utilizando una métrica de distancia, sino que se agrupa en función de las características globales extraídas de las series de tiempo. Las medidas de características se obtienen de cada serie individual y se pueden alimentar a algoritmos de agrupamiento arbitrario, incluido un algoritmo de red neuronal no supervisado, un mapa autoorganizado o un algoritmo de agrupamiento jerárquico. Las medidas globales que describen las series de tiempo se obtienen mediante la aplicación de operaciones estadísticas que capturan mejor las características subyacentes: tendencia, estacionalidad, periodicidad, correlación serial, asimetría, curtosis, caos, no linealidad y auto-similitud. Dado que el método se agrupa utilizando medidas globales extraídas, Reduce la dimensionalidad de la serie temporal y es mucho menos sensible a los datos faltantes o ruidosos. Además, proporcionamos un mecanismo de búsqueda para encontrar la mejor selección del conjunto de características que debe usarse como entradas de agrupamiento.

El código R está disponible en el blog de Rob .

fmark
fuente
6

Podrías mirar el trabajo de Eamonn Keogh (UC Riverside) sobre la agrupación de series de tiempo. Su sitio web tiene muchos recursos. Creo que proporciona ejemplos de código de Matlab, por lo que tendrías que traducir esto a R.

Tampón irlandés
fuente