Suavizar datos de series de tiempo

14

Estoy creando una aplicación de Android que registra los datos del acelerómetro durante el sueño, para analizar las tendencias del sueño y, opcionalmente, despertar al usuario cerca del momento deseado durante el sueño ligero.

Ya he creado el componente que recopila y almacena datos, así como la alarma. Todavía necesito abordar la bestia de mostrar y guardar datos de sueño de una manera realmente significativa y clara, una que preferiblemente también se presta al análisis.

Un par de imágenes dicen dos mil palabras: (solo puedo publicar un enlace debido a la baja representación)

Aquí están los datos sin filtrar, la suma de movimiento, recopilados a intervalos de 30 segundos

Y los mismos datos, suavizados por mi propia manifestación de suavizado de promedio móvil

editar) ambos gráficos reflejan la calibración: hay un filtro de "ruido" mínimo y un filtro de corte máximo, así como un nivel de activación de alarma (la línea blanca)

Desafortunadamente, ninguna de estas son soluciones óptimas: la primera es un poco difícil de entender para el usuario promedio y la segunda, que es más fácil de entender, oculta mucho de lo que realmente está sucediendo. En particular, el promedio elimina el detalle de los picos en el movimiento, y creo que pueden ser significativos.

Entonces, ¿por qué son tan importantes estos cuadros? Estas series temporales se muestran durante toda la noche como comentarios para el usuario, y se almacenarán para su revisión / análisis más adelante. El suavizado idealmente reducirá el costo de memoria (tanto RAM como almacenamiento), y hará que el renderizado sea más rápido en estos teléfonos / dispositivos que carecen de recursos.

Claramente, hay una mejor manera de suavizar los datos: tengo algunas ideas vagas, como usar la regresión lineal para descubrir cambios "bruscos" en el movimiento y modificar mi suavizado de promedio móvil de acuerdo con esto. Realmente necesito más orientación e información antes de sumergirme de lleno en algo que podría resolverse de manera más óptima.

¡Gracias!

Jon
fuente

Respuestas:

16

En primer lugar, los requisitos para la compresión y el análisis / presentación no son necesariamente los mismos; de hecho, para el análisis es posible que desee conservar todos los datos sin procesar y tener la capacidad de cortarlos y cortarlos de varias maneras. Y lo que funcione mejor para usted dependerá mucho de lo que quiera obtener de él. Pero hay varios trucos estándar que puedes probar:

  • Use diferencias en lugar de datos sin procesar
  • Use el umbral para eliminar el ruido de bajo nivel. (Combine con la diferencia para ignorar pequeños cambios).
  • Use la variación en una ventana de tiempo en lugar del promedio, para capturar el nivel de actividad en lugar del movimiento
  • Cambie la base de tiempo de intervalos fijos a carreras de longitud variable y acumule en un solo punto de datos secuencias de cambios para los que se cumple algún criterio (por ejemplo, diferencias en la misma dirección, hasta cierto umbral)
  • Transformar datos de valores reales a ordinales (por ejemplo, bajo, medio, alto); También puede hacerlo en intervalos de tiempo en lugar de muestras individuales, por ejemplo, nivel de actividad para cada tramo de 5 minutos
  • Use un kernel * de convolución apropiado para suavizar más sutilmente que su promedio móvil o seleccione características de interés como cambios bruscos.
  • Use una biblioteca FFT para calcular un espectro de potencia

El último puede ser un poco costoso para sus propósitos, pero probablemente le brinde algunas opciones de presentación muy útiles, en términos de "ritmos de sueño" y demás. (No sé casi nada acerca de Android, pero es concebible que algunos / muchos / todos los teléfonos puedan haber incorporado un hardware DSP del que pueda beneficiarse).


* Dado lo central que es la convolución en el procesamiento de señales digitales, es sorprendentemente difícil encontrar una introducción accesible en línea. O al menos en 3 minutos de googlear. Sugerencias bienvenidas!

radio telefono
fuente
10

Hay muchos algoritmos de suavizado no paramétricos, incluidos splines y loess. Pero también suavizarán los cambios repentinos. También lo harán los filtros de paso bajo. Creo que podría necesitar un suavizador a base de wavelet que permita los saltos repentinos pero aún así suavice el ruido.

Vea Percival y Walden (2000) y el paquete R asociado . Aunque desea una solución Java, los algoritmos en el paquete R son de código abierto y es posible que pueda traducirlos.

Rob Hyndman
fuente
3

Esto es algo tangencial a lo que está preguntando, pero puede valer la pena echar un vistazo al filtro de Kalman.

NPE
fuente
1

El suavizado de Savitzky-Golay podría ser una buena respuesta. Es una implementación extremadamente eficiente de suavizado de mínimos cuadrados sobre una ventana de tiempo deslizante (una convolución sobre esos datos) que se reduce a multiplicar los datos en cada ventana de tiempo por constantes fijas. Puede ajustar valores, derivados, segundas derivadas y superiores.

Usted elige qué tan puntiagudo permite que sean los resultados, en función del tamaño de la ventana de tiempo deslizante y el grado de ajuste polinómico en esa ventana de tiempo. Fue desarrollado originalmente para la cromatografía, donde los picos son una parte esencial de los resultados. Una propiedad deseable del suavizado SG es que se conservan las ubicaciones de los picos. Por ejemplo, una ventana de 5 a 11 puntos con un ajuste de curva cúbica reduce el ruido pero aún conserva los picos.

Hay un buen artículo en Wikipedia, aunque se conoce como filtro Savitzky-Golay (violentamente la terminología normal de la teoría de control de sistemas y el análisis de series de tiempo, así como el documento original, donde se llama correctamente suavizado). También tenga en cuenta que hay (un argumento sobre) un error en el artículo de Wikipedia para las fórmulas de las estimaciones de la segunda derivada; consulte la sección Discusión para ese artículo. EDITAR: El artículo de Wikipedia fue corregido

gms
fuente