Serie de tiempo 'agrupamiento' en R

38

Tengo un conjunto de datos de series de tiempo. Cada serie cubre el mismo período, aunque las fechas reales en cada serie de tiempo pueden no "alinearse" exactamente.

Es decir, si las series temporales se leyeran en una matriz 2D, se vería así:

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 

Quiero escribir un script R que separe las series temporales {T1, T2, ... TN} en 'familias' donde una familia se define como un conjunto de series que "tienden a moverse en simpatía" entre sí.

Para la parte de "agrupamiento", tendré que seleccionar / definir un tipo de medida de distancia. No estoy muy seguro de cómo hacerlo, ya que estoy tratando con series de tiempo, y un par de series que pueden moverse en simpatía durante un intervalo, pueden no hacerlo en un intervalo posterior.

Estoy seguro de que hay personas mucho más experimentadas / inteligentes que yo aquí, por lo que agradecería cualquier sugerencia, idea sobre qué algoritmo / heurístico usar para la medida de distancia y cómo usarlo para agrupar las series de tiempo.

Supongo que NO existe un método estadístico robusto establecido para hacer esto, por lo que estaría muy interesado en ver cómo las personas abordan / resuelven este problema, pensando como un estadístico.

morfeo
fuente
1
También puede estar interesado en las respuestas a esta pregunta, stats.stackexchange.com/q/2777/1036
Andy W
1
Existe un método estadístico basado en procesos de Dirichlet que funciona para conjuntos de datos donde los puntos de tiempo no son los mismos para todas las muestras.
Darío

Respuestas:

24

En la transmisión de datos y la minería de bases de datos de series de tiempo, un enfoque común es transformar la serie en una representación simbólica, luego usar una métrica de similitud, como la distancia euclidiana, para agrupar la serie. Las representaciones más populares son SAX (Keogh & Lin) o el nuevo iSAX (Shieh & Keogh):

Las páginas anteriores también contienen referencias a métricas de distancia y agrupamiento. Keogh y su equipo están interesados ​​en la investigación reproducible y bastante receptivos a la publicación de su código. Para que pueda enviarles un correo electrónico y preguntar. Sin embargo, creo que tienden a funcionar en MATLAB / C ++.

Hubo un esfuerzo reciente para producir una implementación Java y R:

No sé qué tan avanzado está: está orientado a la búsqueda de motivos, pero, dependiendo de cuán lejos hayan llegado, debería tener los bits necesarios que necesita para armar algo para sus necesidades (iSAX y métricas de distancia: ya que esta parte es común a la agrupación y la búsqueda de motivos).

ars
fuente
1
Esto parece un buen punto de partida manejable. gracias por los enlaces
morfeo
44
¡Santo cielo, creo que la página SAX es la página web más fea que he visto!
naught101
18

Otra forma de decir "tienden a moverse en simpatía" es "cointegrado".

Hay dos formas estándar de calcular la cointegración : el método de Engle-Granger y el procedimiento de Johansen. Estos están cubiertos en "Análisis de series de tiempo integradas y cointegradas con R" (Pfaff 2008) y el paquete de R urca relacionado . Recomiendo el libro si desea seguir estos métodos en R.

También le recomiendo que vea esta pregunta en series de tiempo multivariadas y, en particular, en el curso de Ruey Tsay en U. Chicago, que incluye todo el código R necesario.

Shane
fuente
Me encontré con la cointegración hace unos años, pero me pareció terriblemente complicado (¡no lo entendí!). Tenía la esperanza de que habría una solución menos teórica (es decir, más práctico) ...
Morpheous
3
El método Engle-Granger no es especialmente complicado: solo toma los residuos de una regresión entre las dos series y determina si tiene una raíz unitaria. Esto es ciertamente práctico: se usa regularmente para un amplio espectro de problemas. Dicho esto, me imagino que cualquier respuesta a su pregunta se requiere un cierto conocimiento estadístico ... (por ejemplo, usted debe entender cosas como la estacionalidad, la independencia, etc.)
Shane
¿Hay una mejor manera de hacer esto que probar todas las series en pares para la cointegración (con el mismo ideal en mente para agrupar las series juntas?) Además, esta sugerencia no dependería del hecho de que las series están integradas ¿al inicio?
Andy W
@Andy: Estoy seguro de que hay una mejor manera, y espero escuchar sobre eso. Este es un enfoque bastante básico.
Shane
1
> No puedo sugerir nada más, pero la cointegración es a la vez muy frágil ('suposiciones paramétricas' que se han vuelto locas) en la práctica y no es adecuada para la tarea en cuestión: en cada paso, equivale a hacer un agrupamiento jerárquico, como máximo fusionando dos serie a uno (la media cointegrada).
user603
4

La agrupación de series de tiempo se realiza con bastante frecuencia por parte de los dinamacistas de la población, especialmente aquellos que estudian los insectos para comprender las tendencias en brotes y colapso. Busque trabajo en la polilla gitana, el abejorro Spruce, el escarabajo del pino de montaña y el alerce budmoth.

Para el agrupamiento real, puede elegir la métrica de distancia que desee, cada uno probablemente tiene sus propias fortalezas y semanalidades en relación con el tipo de datos que se agrupan, Kaufmann y Rousseeuw 1990. Encontrar grupos en los datos. Una introducción al análisis de conglomerados es un buen lugar para comenzar. Recuerde, el método de agrupación no 'importa' que esté utilizando una serie de tiempo, solo analiza los valores medidos en el mismo punto de tiempo. Si sus dos series de tiempo no están sincronizadas lo suficiente durante su vida útil, no se agruparán (y quizás no deberían).

Donde tendrá problemas es determinar la cantidad de clústeres (familias) a usar después de haber agrupado las series de tiempo. Hay varias formas de seleccionar un límite de grupos informativos, pero aquí la literatura no es tan buena.

Chris
fuente
1
y1,t
1
@ user603 ¿Puede explicar "o bien debe reconocer que una serie está altamente correlacionada con su propio pasado poniendo cada y1, t como una dimensión propia (es decir, dando como resultado dimensiones N * T)" por favor?
B_Miner
2

Vea mi respuesta a una pregunta similar aquí . En pocas palabras, haga una transformación rápida de Fourier de los datos, descarte las frecuencias redundantes si sus datos de entrada fueron valorados de forma real, separe las partes real e imaginaria para cada elemento de la transformación rápida de Fourier y use el paquete Mclust en R para hacer el modelo. agrupamiento basado en las partes reales e imaginarias de cada elemento de cada serie de tiempo. El paquete automatiza la optimización sobre el número de clústeres y sus densidades.

Equilibrio impetuoso
fuente
0

También puede usar el paquete clustDDist, que realiza el método de líderes y el método de agrupamiento jerárquico con diferentes medidas de error:

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

re4 4(X,y)=(X-y)2y
tomaz
fuente