44 votos

Serie de tiempo 'clustering' en R

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

Es decir, si la serie de tiempo se leyera en una matriz 2D, se vería algo 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 guión R que separará 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 "agrupación", necesitaré seleccionar/definir un tipo de medida de distancia. No estoy muy seguro de cómo hacerlo, ya que estoy tratando con series temporales, y un par de series que pueden moverse en simpatía en un intervalo, puede no hacerlo en un intervalo posterior.

Estoy seguro de que hay mucha más gente con experiencia y habilidad que yo aquí, por lo que agradecería cualquier sugerencia, ideas sobre qué algoritmo/heurístico utilizar para la medida de la distancia y cómo utilizarlo para agrupar las series temporales.

Mi conjetura es que NO hay un método estadístico robusto establecido para hacer esto, así que estaría muy interesado en ver cómo la gente se acerca/resuelve este problema - pensando como un estadístico.

1 votos

También pueden interesarle las respuestas a esta pregunta, stats.stackexchange.com/q/2777/1036

1 votos

1 votos

Hay un método estadístico basado en procesos Dirichlet que funciona para conjuntos de datos en los que los puntos temporales no son los mismos para todas las muestras.

27voto

Omar Kooheji Puntos 384

En el flujo de datos y la minería de bases de datos de series temporales, un enfoque habitual consiste en transformar las series a una representación simbólica y, a continuación, utilizar una métrica de similitud, como la distancia euclídea, para agrupar las series. Las representaciones más populares son SAX (Keogh & Lin) o la más reciente iSAX (Shieh & Keogh):

Las páginas anteriores también contienen referencias a las métricas de distancia y a la agrupación. Keogh y su equipo se dedican a la investigación reproducible y son bastante receptivos a la publicación de su código. Así que puedes preguntarles por correo electrónico. Sin embargo, creo que suelen trabajar en MATLAB/C++.

Recientemente se ha intentado crear una aplicación en Java y R:

No sé cómo de avanzado está - está orientado a la búsqueda de motivos, pero, dependiendo de lo lejos que hayan llegado, debería tener las partes necesarias que necesitas para montar algo para tus necesidades (iSAX y métricas de distancia: ya que esta parte es común a la agrupación y a la búsqueda de motivos).

1 votos

Parece un buen punto de partida. Gracias por los enlaces.

5 votos

Joder, ¡creo que esa página SAX es la página web más fea que he visto nunca!

18voto

Jon Galloway Puntos 28243

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

Existen dos formas estándar de calcular cointegración : Método de Engle-Granger y procedimiento de Johansen. Estos temas se tratan en "Análisis de series temporales integradas y cointegradas con R" (Pfaff 2008) y el correspondiente R paquete urca . Recomiendo encarecidamente el libro si desea aplicar estos métodos en R.

También le recomiendo que consulte esta pregunta sobre series temporales multivariantes y, en particular, en Curso de Ruey Tsay en la Universidad de Chicago que incluye todo el código R necesario.

0 votos

Conocí la cointegración hace unos años, pero me parecía muy complicada (¡no la entendía!). Esperaba que hubiera una solución menos teórica (es decir, más práctica)...

3 votos

El método Engle-Granger no es especialmente complicado: basta con tomar los residuos de una regresión entre las dos series y determinar si tiene una raíz unitaria. Es ciertamente práctico: se utiliza regularmente para un amplio espectro de problemas. Dicho esto, imagino que cualquier respuesta a tu pregunta requerirá algunos conocimientos estadísticos (por ejemplo, deberías entender cosas como estacionariedad, independencia, etc.)...

0 votos

¿existe una forma mejor de hacerlo que comprobar la cointegración de todas las series emparejadas (con el mismo ideal en mente de agrupar las series?) Además, ¿no dependería esta sugerencia del hecho de que las propias series estén integradas al principio?

4voto

Julien Chastang Puntos 161

Los dinamicistas de poblaciones, sobre todo los que estudian los insectos para comprender las tendencias de brotes y colapsos, suelen agrupar las series temporales. Busque trabajos sobre la polilla gitana, el gusano barrenador del abeto, el escarabajo del pino de montaña y la polilla del brote del alerce.

Para la agrupación propiamente dicha, se puede elegir la métrica de distancia que se desee, cada una de las cuales tiene probablemente sus propios puntos fuertes y débiles en relación con el tipo de datos que se van a agrupar (Kaufmann y Rousseeuw, 1990). Encontrar grupos en los datos. Introducción al análisis de conglomerados es un buen punto de partida. Recuerde que al método de agrupación no le "importa" que esté utilizando una serie temporal, sólo se fija en los valores medidos en el mismo momento. Si sus dos series temporales no están lo suficientemente sincronizadas a lo largo de su vida, no se agruparán (y quizás no deberían hacerlo).

El problema es determinar el número de conglomerados (familias) que se utilizarán una vez agrupadas las series temporales. Hay varias formas de seleccionar un límite de conglomerados informativos, pero la bibliografía al respecto no es muy buena.

1 votos

Chris, la agrupación normal no sirve. O bien tienes que reconocer que una serie está altamente correlacionada con su propio pasado poniendo cada $y_{1,t}$ como una dimensión propia (es decir, resultando en N*T dimensiones) o se juntan todas las dimensiones, pero entonces (dada la alta correlación dentro de una serie) siempre se acabará con un único conglomerado. Además, la mayoría de los métodos de agrupación son inadecuados/desaconsejables para variables muy correlacionadas (existe una suposición más o menos flexible de agrupaciones esféricas).

1 votos

@user603 ¿Puedes explicar "O tienes que reconocer que una serie está altamente correlacionada con su propio pasado poniendo cada y1,t como una dimensión propia (es decir, resultando en N*T dimensiones)" por favor?

2voto

shyam Puntos 4133

Véase mi respuesta a una pregunta similar aquí . Resumiendo, haga una transformada rápida de Fourier de los datos, descarte las frecuencias redundantes si los datos de entrada son de valor real, separe las partes real e imaginaria de cada elemento de la transformada rápida de Fourier y utilice el paquete Mclust de R para realizar una agrupación basada en modelos de las partes real e imaginaria de cada elemento de cada serie temporal. El paquete automatiza la optimización sobre el número de conglomerados y sus densidades.

0voto

user2831 Puntos 11

También puede utilizar el paquete clustDDist, que realiza el método de líderes y el método de agrupación jerárquica con diferentes medidas de error:

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

La distancia euclidiana al cuadrado favorece los patrones de distribuciones que tienen un pico alto pronunciado y, por lo tanto, mide $$ d_4(x, y) = \frac{(x-y)^2}{y} $$ a veces es preferible.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X