Comment réduire le nombre de points de données dans une série?

11

Je n'ai pas étudié les statistiques depuis plus de 10 ans (et puis juste un cours de base), alors peut-être que ma question est un peu difficile à comprendre.

Quoi qu'il en soit, ce que je veux faire, c'est réduire le nombre de points de données dans une série. L'axe des x est le nombre de millisecondes depuis le début de la mesure et l'axe des y est la lecture pour ce point.

Il y a souvent des milliers de points de données, mais je n'en ai besoin que de quelques centaines. Ma question est donc la suivante: comment réduire avec précision le nombre de points de données?

Comment s'appelle le processus? (Donc je peux le google) Y a-t-il des algorithmes préférés (je vais l'implémenter en C #)

J'espère que vous avez des indices. Désolé pour mon manque de terminologie appropriée.


Edit: Plus de détails viennent ici:

Les données brutes que j'ai obtenues sont des données de fréquence cardiaque, et sous forme de nombre de millisecondes depuis le dernier battement. Avant de tracer les données, je calcule le nombre de millisecondes à partir du premier échantillon et le bpm (battements par minute) à chaque point de données (60000 / timesincelastbeat).

Je veux visualiser les données, c'est-à-dire les tracer dans un graphique linéaire. Je veux réduire le nombre de points dans le graphique de milliers à quelques centaines.

Une option serait de calculer le bpm moyen pour chaque seconde de la série, ou peut-être toutes les 5 secondes environ. Cela aurait été assez facile si je savais que j'aurais au moins un échantillon pour chacune de ces périodes (secondes de 5 secondes d'intervalle).

Rob Hyndman
la source
J'oubliais ceci: les points le long de l'axe x viennent avec un espacement variable.
Je ne suis pas sûr de comprendre. Vous n'avez pas d'axe y?
Ah désolé. J'ai mal tapé. Je l'ai maintenant changé ci-dessus.
Je pense également que vous devez fournir un peu plus d'informations. Par exemple, je ne peux toujours pas visualiser le graphique. Quel est ton but?
D'accord désolé. J'ai ajouté plus de détails ci-dessus.

Réponses:

10

Vous avez deux problèmes: trop de points et comment lisser les points restants.

Diluer votre échantillon

Si vous avez trop d'observations qui arrivent en temps réel, vous pouvez toujours utiliser un échantillonnage aléatoire simple pour affiner votre échantillon. Notez que pour que cela soit également vrai, le nombre de points devrait être très grand.

Supposons que vous ayez N points et que vous n'en vouliez que n . Générez ensuite n nombres aléatoires à partir d'une distribution discrète uniforme U (0, N-1) . Ce sont les points que vous utilisez.

Si vous voulez le faire séquentiellement, c'est-à-dire qu'à chaque point vous décidez de l'utiliser ou non, alors acceptez simplement un point avec une probabilité p . Donc, si vous définissez p = 0,01, vous accepteriez (en moyenne) 1 point sur cent.

Si vos données sont réparties de manière inégale et que vous souhaitez uniquement affiner les régions denses de points, alors rendez votre fonction d'amincissement un peu plus sophistiquée. Par exemple, au lieu de p , qu'en est-il:

1pexp(λt)

λtt1p

λp

Lissage

Peut-être quelque chose comme un simple schéma de type moyenne mobile. Ou vous pouvez opter pour quelque chose de plus avancé comme un lisseur de noyau (comme d'autres l'ont suggéré). Vous devrez faire attention à ne pas trop lisser, car je suppose qu'une baisse soudaine doit être détectée très rapidement dans votre scénario.

Il devrait y avoir des bibliothèques C # disponibles pour ce genre de choses.

Conclusion

Diluer si nécessaire, puis lisser.

csgillespie
la source
Ah, intéressant, mais j'en ai besoin pour être prévisible, c'est-à-dire pour avoir le même résultat à chaque fois que je regarde les données.
Dans ce cas, générez les n index des points que vous choisissez et stockez ces index.
csgillespie
Ou stockez les graines dans le RNG avant l'échantillonnage.
Dirk Eddelbuettel
La solution de Dirk concernant la graine est probablement la meilleure option.
csgillespie
Calculer des moyennes par seconde est correct, mais ce que je fais quand il n'y a pas de données pour une seconde spécifique. Je suppose que je pourrais faire une interpolation des secondes avant et après, mais ce serait génial avec une méthode spécifique (nommée) pour cela, donc je n'essaie pas d'inventer quelque chose déjà inventé.
9

Eh bien, je pense que le mot que vous recherchez est "échantillonnage", mais je ne sais pas pourquoi vous voulez le faire. Des milliers de points de données ne sont pas très nombreux. Ou cherchez-vous simplement à tracer un plus petit nombre de points également espacés? Cela s'appelle généralement «binning».

Votre objectif est-il de générer une visualisation? Dans ce cas, vous souhaiterez peut-être conserver les données brutes, les tracer sous forme de nuage de points, puis superposer une sorte de tendance centrale (ligne de régression, spline, etc.) pour communiquer quel que soit le message de la maison.

Ou votre objectif est-il de résumer numériquement les résultats d'une manière ou d'une autre? Dans ce cas, vous voudrez peut-être expliquer votre problème plus en détail!

Harlan
la source
Oui, la visualisation est ce que je veux. J'ai ajouté quelques informations supplémentaires dans la question.
seconder le traçage des données brutes avec une ligne de lissage.
JoFrhwld
tiers traçage des données brutes avec une ligne de lissage --- Vous pouvez également tracer le changement de BPM au fil du temps comme une visualisation distincte.
John
5

Le calcul des moyennes conduit à un ensemble de données différent de la simple réduction du nombre de points de données. Si un rythme cardiaque par minute est beaucoup plus rapide que les autres battements cardiaques, vous perdrez le signal lors de votre processus de lissage.

Si vous résumez 125-125-0-125-125 comme 100, l'histoire que les données racontent est différente grâce à votre lissage.

Parfois, le cœur saute même des battements et je crois que c'est un événement intéressant pour qui veut cependant regarder les données de fréquence cardiaque tracées.

Je vous propose donc de calculer la distance entre deux points avec une formule comme d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Vous définissez une distance minimale dans votre programme. Ensuite, vous parcourez vos données et après chaque point, vous supprimez tous les points suivants pour lesquels d est inférieur à votre distance minimale.

Comme l'unité de temps et de bpm n'est pas la même, vous voudrez peut-être réfléchir à la façon de trouver un moyen de mettre à l'échelle les unités de manière significative. Pour bien faire cette tâche, vous devez parler aux médecins qui doivent finalement interpréter vos graphiques et leur demander quelles informations ils considèrent comme essentielles.

Christian
la source
Affichage intéressant. J'examinerai cela aussi. Vous avez probablement raison.
2

Si le BPM reste le même sur de nombreux échantillons (ou change de façon infinitésimale d'une manière qui ne vous inquiète pas), vous pouvez tronquer vos données à un chiffre significatif qui vous tient vraiment à cœur, puis exécuter le codage de longueur.

Par exemple, dans R, ces données:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

a cette sortie

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2
russellpierce
la source
1

Vous ne fournissez pas suffisamment d'informations. Pourquoi voulez-vous réduire les points de données. Quelques milliers, ce n'est rien de nos jours.

Étant donné que vous souhaitez obtenir le même résultat chaque fois que vous affichez les mêmes données, vous souhaitez peut-être simplement regrouper les moyennes. Vous avez un espacement variable sur votre axe x. Peut-être que vous essayez de rendre cela cohérent? Dans ce cas, vous définissez une largeur de bac de peut-être 50 ms ou 100, puis faites la moyenne de tous les points. Rendez la largeur du bac aussi grande que nécessaire pour réduire les points de données à la taille de l'ensemble souhaité.

C'est vraiment une question difficile à répondre sans raison pour laquelle vous vous débarrassez des données.

John
la source
D'accord désolé. J'ai ajouté plus de détails ci-dessus.
1

Pour réduire vos points de données, vous pouvez utiliser l' algorithme Ramer – Douglas – Peucker qui est très facile à comprendre et à mettre en œuvre. Le signal échantillonné sera très similaire à celui d'origine.

Kamran Bigdely
la source