Hice esta pregunta en StackOverflow, y me recomendaron que la hiciera aquí.
Tengo dos series temporales de datos de acelerómetro 3D que tienen diferentes bases de tiempo (los relojes comenzaron en diferentes momentos, con un ligero desplazamiento durante el tiempo de muestreo), además de contener muchos espacios de diferente tamaño (debido a retrasos asociados con la escritura para separar dispositivos flash).
Los acelerómetros que estoy usando son los económicos GCDC X250-2 . Estoy ejecutando los acelerómetros en su mayor ganancia, por lo que los datos tienen un ruido de fondo significativo.
Cada serie de tiempo tiene aproximadamente 2 millones de puntos de datos (más de una hora a 512 muestras / seg) y contiene alrededor de 500 eventos de interés, donde un evento típico abarca entre 100 y 150 muestras (200-300 ms cada una). Muchos de estos eventos se ven afectados por interrupciones de datos durante las escrituras flash.
Entonces, los datos no son prístinos, y ni siquiera son muy bonitos. Pero mi inspección del globo ocular muestra que contiene claramente la información que me interesa. (Puedo publicar tramas, si es necesario).
Los acelerómetros se encuentran en entornos similares, pero están moderadamente acoplados, lo que significa que puedo decir a simple vista qué eventos coinciden con cada acelerómetro, pero hasta ahora no he tenido éxito en el software. Debido a limitaciones físicas, los dispositivos también están montados en diferentes orientaciones, donde los ejes no coinciden, pero están tan cerca de la ortogonal como podría hacerlos. Entonces, por ejemplo, para acelerómetros de 3 ejes A y B, + Ax se asigna a -By (arriba-abajo), + Az se asigna a -Bx (izquierda-derecha) y + Ay se asigna 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, yc) extraer las diferencias de comportamiento entre los dos acelerómetros (como la torsión o flexionando).
La naturaleza de los datos de la serie temporal hace que numpy.correlate () de Python sea inutilizable. También he mirado el paquete de R's Zoo, pero no he avanzado con él. He buscado ayuda en diferentes campos del análisis de señales, pero no he progresado.
¿Alguien tiene alguna pista de lo que puedo hacer o enfoques que debería investigar?
Actualización 28 de febrero de 2011: se agregaron algunas parcelas aquí que muestran ejemplos de los datos.
Respuestas:
La pregunta se refiere al cálculo de la correlación entre dos series de tiempo muestreadas irregularmente (procesos estocásticos unidimensionales) y su uso para encontrar el desplazamiento de tiempo donde están correlacionadas al máximo (su "diferencia de fase").
Este problema generalmente no se aborda en el análisis de series temporales, porque se supone que los datos de las series temporales se recopilan sistemáticamente (a intervalos regulares de tiempo). Es más bien la provincia de la geoestadística , que se refiere a las generalizaciones multidimensionales de las series de tiempo. El conjunto de datos geoestadísticos arquetípicos consiste en mediciones de muestras geológicas en ubicaciones espaciadas 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 mediana) de 2/2 --la "semivariancia" - donde denota un valor medido en el punto y la distancia entre y está restringida a estar dentro de un intervalo llamado "retraso". Si suponemos que el proceso es estacionario y tiene una covarianza, entonces la expectativa de la semivariancia es igual a la covarianza máxima (igual a para cualquier ) menos la covarianza entre(z(p)−z(q))2/2 z(p) p p q Z Var(Z(p)) p Z(p) y . Esta agrupación en rezagos hace frente al problema del espacio irregular.Z(q)
Cuando se realiza un par ordenado de mediciones en cada punto, se puede calcular de manera similar el variograma cruzado empírico entre las 's y las ' s y, por lo tanto, estimar la covarianza en cualquier retraso . Desea la versión unidimensional del variograma cruzado. Los paquetes R gstat y sgeostat , entre otros, estimarán variogramas cruzados. No se preocupe si sus datos son unidimensionales; Si el software no funciona con ellos directamente, simplemente introduzca una segunda coordenada constante: eso hará que parezcan bidimensionales.(z(p),w(p)) z w
Con dos millones de puntos, debería ser capaz de detectar pequeñas desviaciones de la estacionariedad. Es posible que la diferencia de fase entre las dos series temporales también varíe con el tiempo. Haga frente a esto calculando el variograma cruzado por separado para diferentes ventanas espaciadas a lo largo del período de tiempo.
@cardinal ya ha mencionado 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ísticas espaciales para hacer su trabajo por usted y utilizar técnicas de geoestadística para analizar estos datos. En cuanto a la eficiencia computacional, tenga en cuenta que la convolución completa (variograma cruzado) no es necesaria: solo necesita sus valores cerca de la diferencia de fase. Esto hace que el esfuerzo sea , no , donde es el número de rezagos para calcular, por lo que podría ser factible incluso con un software listo para usar. Si no, el algoritmo de convolución directa es fácil de implementar.O ( n 2 ) kO(nk) O(n2) k
fuente