Lissage des données de séries chronologiques

14

Je construis une application Android qui enregistre les données de l'accéléromètre pendant le sommeil, afin d'analyser les tendances du sommeil et éventuellement de réveiller l'utilisateur à une heure souhaitée pendant le sommeil léger.

J'ai déjà construit le composant qui collecte et stocke les données, ainsi que l'alarme. Je dois encore aborder la bête de l'affichage et de la sauvegarde des données de sommeil d'une manière vraiment significative et claire, qui se prête de préférence également à l'analyse.

Quelques images disent deux mille mots: (Je ne peux publier qu'un seul lien en raison d'une faible représentation)

Voici les données non filtrées, la somme des mouvements, collectées à des intervalles de 30 secondes

Et les mêmes données, lissées par ma propre manifestation de lissage de la moyenne mobile

modifier) ​​les deux graphiques reflètent l'étalonnage - il y a un filtre `` bruit '' minimum et un filtre de coupure maximum, ainsi qu'un niveau de déclenchement d'alarme (la ligne blanche)

Malheureusement, aucune de ces solutions n'est optimale - la première est un peu difficile à comprendre pour l'utilisateur moyen, et la seconde, qui est plus facile à comprendre, cache une grande partie de ce qui se passe réellement. En particulier, la moyenne supprime le détail des pointes de mouvement - et je pense que cela peut être significatif.

Alors pourquoi ces graphiques sont-ils si importants? Ces séries chronologiques sont affichées tout au long de la nuit en tant que rétroaction à l'utilisateur et seront stockées pour examen / analyse plus tard. Le lissage réduira idéalement le coût de la mémoire (RAM et stockage) et accélérera le rendu sur ces téléphones / appareils privés de ressources.

De toute évidence, il existe un meilleur moyen de lisser les données - j'ai quelques idées vagues, telles que l'utilisation de la régression linéaire pour comprendre les changements «brusques» de mouvement et la modification de mon lissage de la moyenne mobile en fonction. J'ai vraiment besoin de plus de conseils et de commentaires avant de plonger tête première dans quelque chose qui pourrait être résolu de manière plus optimale.

Merci!

Jon
la source

Réponses:

16

Tout d'abord, les exigences de compression et d'analyse / présentation ne sont pas nécessairement les mêmes - en effet, pour l'analyse, vous souhaiterez peut-être conserver toutes les données brutes et avoir la possibilité de les découper et de les découper de différentes manières. Et ce qui fonctionne le mieux pour vous dépendra beaucoup de ce que vous voulez en retirer. Mais il existe un certain nombre d'astuces standard que vous pouvez essayer:

  • Utilisez des différences plutôt que des données brutes
  • Utilisez le seuillage pour supprimer le bruit de bas niveau. (Combinez avec la différenciation pour ignorer les petits changements.)
  • Utilisez la variance sur une certaine fenêtre de temps plutôt que sur la moyenne, pour capturer le niveau d'activité plutôt que le mouvement
  • Changez la base de temps d'intervalles fixes en cycles de longueur variable et accumulez en un seul point de données des séquences de changements pour lesquelles certains critères sont valables (par exemple, différences dans la même direction, jusqu'à un certain seuil)
  • Transformer les données des valeurs réelles en ordinales (par exemple faible, moyen, élevé); vous pouvez également le faire sur des bacs de temps plutôt que sur des échantillons individuels - par exemple, le niveau d'activité pour chaque tronçon de 5 minutes
  • Utilisez un noyau de convolution approprié * pour lisser plus subtilement que votre moyenne mobile ou choisissez des caractéristiques intéressantes telles que des changements brusques.
  • Utiliser une bibliothèque FFT pour calculer un spectre de puissance

Le dernier peut être un peu cher pour vos besoins, mais vous donnerait probablement des options de présentation très utiles, en termes de "rythmes de sommeil" et autres. (Je ne sais pratiquement rien d'Android, mais il est concevable que certains / plusieurs / tous les combinés puissent avoir intégré du matériel DSP dont vous pouvez profiter.)


* Étant donné la centralité de la convolution pour le traitement numérique du signal, il est étonnamment difficile de trouver une intro accessible en ligne. Ou au moins en 3 minutes de recherche sur Google. Suggestions bienvenues!

talkie-walkie
la source
10

Il existe de nombreux algorithmes de lissage non paramétriques, y compris les splines et le loess. Mais ils atténueront également les changements soudains. Il en sera de même pour les filtres passe-bas. Je pense que vous pourriez avoir besoin d'un lisseur à base d'ondelettes qui permet les sauts brusques tout en atténuant le bruit.

Consultez Percival et Walden (2000) et le package R associé . Bien que vous souhaitiez une solution java, les algorithmes du package R sont open-source et vous pourrez peut-être les traduire.

Rob Hyndman
la source
3

Cela est quelque peu tangentiel à ce que vous demandez, mais cela vaut peut-être la peine de jeter un œil au filtre de Kalman.

NPE
la source
1

Le lissage Savitzky-Golay pourrait être une bonne réponse. C'est une implémentation extrêmement efficace du lissage des moindres carrés sur une fenêtre temporelle coulissante (une convolution sur ces données) qui se résume à multiplier les données dans chaque fenêtre temporelle par des constantes fixes. Vous pouvez ajuster des valeurs, des dérivés, des dérivés secondaires et plus.

Vous choisissez dans quelle mesure vous autorisez les résultats, en fonction de la taille de la fenêtre temporelle coulissante et du degré d'ajustement polynomial sur cette fenêtre temporelle. Cela a été développé à l'origine pour la chromatographie, où les pics sont une partie essentielle des résultats. Une propriété souhaitable du lissage SG est que les emplacements des pics sont préservés. Par exemple, une fenêtre de 5 à 11 points avec un ajustement de courbe cubique réduit le bruit mais conserve les pics.

Il y a un bon article dans Wikipedia, bien qu'il soit appelé filtre Savitzky-Golay (faisant une légère violence à la terminologie normale de la théorie du contrôle des systèmes et de l'analyse des séries chronologiques, ainsi que l'article original, où il est correctement appelé lissage). Sachez également qu'il y a (un argument au-dessus) une erreur dans l'article Wikipédia pour les formules d'estimations dérivées secondes - voir la section Discussion de cet article. EDIT: l'article Wikipedia a été corrigé

gms
la source