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).
la source
Réponses:
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:
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.
la source
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!
la source
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.
la source
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:
a cette sortie
la source
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.
la source
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.
la source