Livellamento dei dati delle serie temporali


14

Sto costruendo un'applicazione Android che registra i dati dell'accelerometro durante il sonno, in modo da analizzare le tendenze del sonno e facoltativamente svegliare l'utente vicino al momento desiderato durante il sonno leggero.

Ho già creato il componente che raccoglie e memorizza i dati, nonché l'allarme. Devo ancora affrontare la bestia della visualizzazione e del salvataggio dei dati sul sonno in un modo davvero significativo e chiaro, uno che preferibilmente si presta anche all'analisi.

Un paio di immagini dicono duemila parole: (posso pubblicare solo un link a causa della bassa reputazione)

Ecco i dati non filtrati, la somma dei movimenti, raccolti a intervalli di 30 secondi

E gli stessi dati, levigati dalla mia stessa manifestazione di livellamento medio mobile

modifica) entrambi i grafici riflettono la calibrazione: esiste un filtro minimo "noise" e un filtro cutoff massimo, nonché un livello di attivazione dell'allarme (la linea bianca)

Sfortunatamente, nessuna di queste è una soluzione ottimale: la prima è un po 'difficile da capire per l'utente medio e la seconda, che è più facile da capire, nasconde molto di ciò che sta realmente accadendo. In particolare la media rimuove il dettaglio dei picchi di movimento, e penso che possano essere significativi.

Quindi perché questi grafici sono così importanti? Queste serie temporali vengono visualizzate per tutta la notte come feedback per l'utente e verranno archiviate per la revisione / analisi in un secondo momento. Il livellamento ridurrà idealmente i costi di memoria (sia RAM che di archiviazione) e renderà più veloce il rendering su questi telefoni / dispositivi affamati di risorse.

Chiaramente c'è un modo migliore per appianare i dati: ho alcune idee vaghe, come usare la regressione lineare per capire cambiamenti "bruschi" nei movimenti e modificare il mio livellamento della media mobile secondo. Ho davvero bisogno di ulteriori indicazioni e input prima di immergermi a fondo in qualcosa che potrebbe essere risolto in modo più ottimale.

Grazie!

Risposte:


16

Innanzitutto, i requisiti di compressione e analisi / presentazione non sono necessariamente gli stessi, anzi, per l'analisi potresti voler conservare tutti i dati grezzi e avere la possibilità di dividerli e tagliarli in vari modi. E ciò che funziona meglio per te dipenderà molto da ciò che vuoi uscirne. Ma ci sono una serie di trucchi standard che potresti provare:

  • Usa le differenze anziché i dati non elaborati
  • Utilizzare il limite per rimuovere il rumore di basso livello. (Combina con la differenziazione per ignorare le piccole modifiche.)
  • Utilizzare la varianza in un determinato intervallo di tempo anziché nella media per acquisire il livello di attività anziché il movimento
  • Modifica la base dei tempi da intervalli fissi a corse a lunghezza variabile e accumula in un singolo punto dati sequenze di modifiche per le quali alcuni criteri sono validi (ad esempio, differenze nella stessa direzione, fino a una certa soglia)
  • Trasforma i dati da valori reali in ordinali (ad es. Basso, medio, alto); potresti anche farlo su intervalli di tempo piuttosto che su singoli campioni, ad esempio il livello di attività per ogni tratto di 5 minuti
  • Usa un kernel di convoluzione appropriato * per smussare più sottilmente della tua media mobile o selezionare caratteristiche di interesse come cambiamenti bruschi.
  • Utilizzare una libreria FFT per calcolare uno spettro di potenza

L'ultimo potrebbe essere un po 'costoso per i tuoi scopi, ma probabilmente ti darebbe alcune opzioni di presentazione molto utili, in termini di "ritmi del sonno" e simili. (Non so quasi nulla di Android, ma è immaginabile che alcuni / molti / tutti i portatili possano avere hardware DSP incorporato di cui puoi trarre vantaggio.)


* Data la convoluzione centrale nell'elaborazione del segnale digitale, è sorprendentemente difficile trovare un'introduzione accessibile online. O almeno in 3 minuti di googling. Suggerimenti benvenuti!


10

Esistono molti algoritmi di livellamento non parametrico tra cui spline e loess. Ma appianeranno anche gli improvvisi cambiamenti. Così saranno i filtri passa-basso. Penso che potresti aver bisogno di una levigatura a base di wavelet che permetta i salti improvvisi ma attenua ancora il rumore.

Dai un'occhiata a Percival e Walden (2000) e al pacchetto R associato . Sebbene tu voglia una soluzione Java, gli algoritmi nel pacchetto R sono open-source e potresti essere in grado di tradurli.


3

Questo è in qualche modo tangenziale a ciò che stai chiedendo, ma potrebbe valere la pena dare un'occhiata al filtro Kalman.


1

Il livellamento di Savitzky-Golay potrebbe essere una buona risposta. È un'implementazione estremamente efficiente del livellamento dei minimi quadrati su una finestra temporale scorrevole (una convoluzione su quei dati) che si riduce alla semplice moltiplicazione dei dati in ogni finestra temporale per costanti fisse. È possibile adattare valori, derivati, secondi derivati ​​e superiori.

Sei tu a scegliere quanto sono difficili i risultati, in base alla dimensione della finestra temporale scorrevole e al grado di adattamento polinomiale su quella finestra temporale. Questo è stato originariamente sviluppato per la cromatografia, dove i picchi sono una parte essenziale dei risultati. Una proprietà desiderabile del livellamento SG è che le posizioni delle cime siano preservate. Ad esempio, una finestra da 5 a 11 punti con una curva cubica riduce il rumore ma conserva ancora i picchi.

C'è un buon articolo su Wikipedia, sebbene sia indicato come filtro Savitzky-Golay (facendo una leggera violenza alla terminologia normale dalla teoria del controllo dei sistemi e dall'analisi delle serie temporali, così come il documento originale, dove viene correttamente chiamato smoothing). Inoltre, tieni presente che c'è un errore nell'argomento di Wikipedia nell'articolo Wikipedia per le formule per le seconde stime derivate - vedi la sezione Talk per quell'articolo. EDIT: l'articolo di Wikipedia è stato corretto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.