11 votos

¿Cómo correlacionar dos series temporales con huecos y bases temporales diferentes?

Pregunté esta pregunta en StackOverflow, y me han recomendado que lo pregunte aquí.


Tengo dos series temporales de datos del acelerómetro 3D que tienen diferentes bases de tiempo (los relojes se iniciaron en momentos diferentes, con algún ligero deslizamiento durante el tiempo de muestreo), además de contener muchos huecos de diferente tamaño (debido a los retrasos asociados a la escritura en dispositivos flash separados).

Los acelerómetros que estoy utilizando son los económicos GCDC X250-2 . Estoy utilizando los acelerómetros en su máxima ganancia, por lo que los datos tienen un piso de ruido significativo.

Cada una de las series temporales tiene unos 2 millones de puntos de datos (más de una hora a 512 muestras/seg), y contienen unos 500 eventos de interés, donde un evento típico abarca 100-150 muestras (200-300 ms cada una). Muchos de estos eventos se ven afectados por las interrupciones de datos durante las escrituras flash.

Por lo tanto, los datos no son prístinos, y ni siquiera son muy bonitos. Pero mi inspección ocular muestra que contiene claramente la información que me interesa. (Puedo publicar gráficos, si es necesario).

Los acelerómetros están en entornos similares, pero sólo están moderadamente acoplados, lo que significa que puedo saber a ojo qué eventos coinciden de cada acelerómetro, pero no he tenido éxito hasta ahora en hacerlo en el software. Debido a las limitaciones físicas, los dispositivos también están montados en diferentes orientaciones, donde los ejes no coinciden, pero son lo más cercano a la ortogonalidad que pude hacer. Así, por ejemplo, para los acelerómetros de 3 ejes A y B, +Ax corresponde a -By (arriba-abajo), +Az corresponde a -Bx (izquierda-derecha), y +Ay corresponde a -Bz (adelante-atrás).

Mi objetivo inicial es correlacionar los eventos de choque en el eje vertical, aunque eventualmente me gustaría a) descubrir automáticamente el mapeo del eje, b) correlacionar la actividad en los ases mapeados, y c) extraer las diferencias de comportamiento entre los dos acelerómetros (como la torsión o la flexión).

La naturaleza de los datos de las series temporales hace que numpy.correlate() de Python sea inutilizable. También he mirado el paquete Zoo de R, pero no he avanzado con él. He buscado ayuda en diferentes campos del análisis de señales, pero no he hecho ningún progreso.

¿Alguien tiene alguna pista sobre lo que puedo hacer, o enfoques que debería investigar?

Actualización del 28 de febrero de 2011: Añadidas algunas parcelas aquí mostrando ejemplos de los datos.

1 votos

@BobC, tal vez uno de los moderadores pueda hacer migrar tu post a este sitio. Eso sería lo más razonable. En cuanto a tus preguntas técnicas, en primer lugar, ¿estás utilizando la FFT para hacer la correlación? Eso debería ser factible para 2 millones de puntos de datos en un ordenador medio decente. La relación señal/ruido parece razonablemente alta, así que debería ser posible. Una forma rápida y sucia sería rellenar los datos que faltan con la última muestra disponible o con ceros. El deslizamiento de las diferencias del intervalo de muestreo puede ser la "característica" más difícil de tratar de sus datos.

0 votos

@cardinal: Efectivamente, probé una FFT, sólo para obtener basura como resultado. Las características "interesantes" fácilmente visibles en los datos son indistinguibles del ruido en la FFT. Sin embargo, he hecho FFTs sólo en el conjunto de datos completo: Tal vez una FFT de ventana móvil proporcionaría mejores resultados, pero todavía no he podido encontrar una forma computacionalmente eficiente de implementarla. Sospecho que una transformada Wavelet podría ayudar, pero no estoy familiarizado con ella (pero estoy aprendiendo poco a poco).

1 votos

@BobC, lo que quería decir es que si consideraste una implementación basada en la FFT para calcular la correlación. La convolución directa es $O(n^2)$ pero una implementación basada en la FFT reduciría esta $O(n \log n)$ , lo que lo hace factible. En cuanto a la FFT en sí, con 2 millones de puntos de datos, su resolución de frecuencia será muy alta. Cualquier desviación en el muestreo y otras cosas están obligadas a lavar la señal en una base de frecuencia. Sin embargo, deberías ser capaz de agregar muchos intervalos para sacar la señal del ruido. Algo así como un enfoque Welch o tal vez una técnica de ventana personalizada.

13voto

jldugger Puntos 7490

La pregunta se refiere a cálculo de la correlación entre dos series temporales de muestreo irregular (procesos estocásticos unidimensionales) y utilizarlo para encontrar el desfase temporal en el que se correlacionan al máximo (su "diferencia de fase").

Este problema no suele abordarse en el análisis de series temporales, porque se supone que los datos de las series temporales se recogen de forma sistemática (a intervalos regulares de tiempo). Es más bien competencia de geoestadística que se refiere a las generalizaciones multidimensionales de las series temporales. El conjunto de datos geoestadísticos arquetípico consiste en mediciones de muestras geológicas en lugares espaciados irregularmente.

Con un espaciado irregular, las distancias entre pares de ubicaciones varían: no hay dos distancias iguales. La geoestadística supera esto con el variograma empírico . Esto calcula un valor "típico" (a menudo la media o la mediana) de $(z(p) - z(q))^2 / 2$ --la "semivarianza"-- donde $z(p)$ denota un valor medido en el punto $p$ y la distancia entre $p$ y $q$ se limita a estar dentro de un intervalo llamado "retardo". Si suponemos que el proceso $Z$ es estacionario y tiene una covarianza, entonces la expectativa de la semivarianza es igual a la covarianza máxima (igual a $Var(Z(p))$ para cualquier $p$ ) menos la covarianza entre $Z(p)$ y $Z(q)$ . Esta división en rezagos resuelve el problema del espaciamiento irregular.

Cuando un par ordenado de medidas $(z(p), w(p))$ en cada punto, se puede calcular de forma similar el variograma cruzado empírico entre el $z$ y el $w$ y así estimar la covarianza en cualquier retardo. Quieres la versión unidimensional del variograma cruzado. El R paquetes gstat y sgeostat entre otros, estimará los variogramas cruzados. No se preocupe por que sus datos sean unidimensionales; si el software no trabaja con ellos directamente, simplemente introduzca una segunda coordenada constante: eso hará que aparezcan bidimensionales.

Con dos millones de puntos deberías ser capaz de detectar pequeñas desviaciones de la estacionalidad. Es posible que la diferencia de fase entre las dos series temporales también varíe con el tiempo. Para ello, calcule el variograma cruzado por separado para diferentes ventanas espaciadas a lo largo del periodo de tiempo.

@cardinal ya ha sacado a relucir la mayoría de estos puntos en los comentarios. La principal contribución de esta respuesta es apuntar hacia el uso de paquetes de estadística espacial para hacer el trabajo por ti y utilizar técnicas de geoestadística para analizar estos datos. En cuanto a la eficiencia computacional, hay que tener en cuenta que no se necesita la convolución completa (variograma cruzado): sólo se necesitan sus valores cerca de la diferencia de fase. Esto hace que el esfuerzo $O(nk)$ no $O(n^2)$ , donde $k$ es el número de rezagos que hay que computar, por lo que podría ser factible incluso con un software ya preparado. Si no, el algoritmo de convolución directa es fácil de implementar.

0 votos

@whuber, buenos comentarios y sugerencias. Si estoy leyendo bien la pregunta, creo que una de las principales preocupaciones es la incertidumbre del punto de tiempo del muestreo. Esto puede ser un poco diferente del marco típico de geoestadística donde, creo, el espaciamiento es irregular, pero todavía se supone conocido (al menos con alta precisión). Creo que un modelo aproximado es, si el $n$ El punto de la serie uno se encuentra en el momento $t_n = n t$ , para los fijos $t$ entonces el $n$ El punto de la serie 2 está en $\tau_n = t_n + \alpha + \beta n$ donde $\alpha$ es probablemente del orden de unos pocos milisegundos y $\beta$ es probablemente diminuto.

0 votos

@Cardinal No he entendido eso de la pregunta. No se me ocurre una forma de estimar $\beta$ que no sería muy intensivo en términos computacionales. Quizá dividiendo las series temporales en grupos en los que el efecto neto de $\beta$ ¿es insignificante?

0 votos

@whuber, @BobC, estoy haciendo una conjetura semi-educada basada en la experiencia pasada tratando con problemas y cuestiones similares. La mayoría de los enfoques que he visto son computacionalmente intensivos y no impresionan. Un intento podría ser a través de algo como deformación temporal dinámica o lo que Ramsay y Silverman llaman registro de curvas . No tengo claro si alguna de estas opciones sería factible en un conjunto de datos de este tamaño.

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