Wie reduziere ich die Anzahl der Datenpunkte in einer Reihe?

11

Ich habe seit über 10 Jahren keine Statistik mehr studiert (und dann nur noch einen Grundkurs), daher ist meine Frage vielleicht etwas schwer zu verstehen.

Auf jeden Fall möchte ich die Anzahl der Datenpunkte in einer Reihe reduzieren. Die x-Achse ist die Anzahl der Millisekunden seit Beginn der Messung und die y-Achse ist der Messwert für diesen Punkt.

Oft gibt es Tausende von Datenpunkten, aber ich brauche möglicherweise nur ein paar Hundert. Meine Frage lautet also: Wie reduziere ich die Anzahl der Datenpunkte genau?

Wie heißt der Prozess? (Damit ich es googeln kann) Gibt es bevorzugte Algorithmen (ich werde es in C # implementieren)

Hoffe du hast ein paar Hinweise. Entschuldigung für meinen Mangel an korrekter Terminologie.


Edit: Weitere Details finden Sie hier:

Die Rohdaten, die ich erhalten habe, sind Herzfrequenzdaten und in Form von Millisekunden seit dem letzten Schlag. Bevor ich die Daten zeichne, berechne ich die Anzahl der Millisekunden aus der ersten Probe und die BPM (Schläge pro Minute) an jedem Datenpunkt (60000 / Timesincelastbeat).

Ich möchte die Daten visualisieren, dh in einem Liniendiagramm darstellen. Ich möchte die Anzahl der Punkte in der Grafik von Tausenden auf einige Hundert reduzieren.

Eine Möglichkeit wäre, die durchschnittliche BPM für jede Sekunde in der Serie oder vielleicht alle 5 Sekunden oder so zu berechnen. Das wäre ziemlich einfach gewesen, wenn ich gewusst hätte, dass ich für jede dieser Perioden mindestens eine Probe haben würde (Sekunden in Intervallen von 5 Sekunden).

Rob Hyndman
quelle
Ich habe das vergessen: Die Punkte entlang der x-Achse haben unterschiedliche Abstände.
Ich bin mir nicht sicher, ob ich das verstehe. Hast du keine y-Achse?
Ach, entschuldigung. Ich habe falsch geschrieben. Ich habe es jetzt oben geändert.
Ich denke auch, dass Sie ein bisschen mehr Informationen liefern müssen. Zum Beispiel kann ich das Diagramm immer noch nicht visualisieren. Was ist dein Ziel?
Ok, tut mir Leid. Ich habe oben einige weitere Details hinzugefügt.

Antworten:

10

Sie haben zwei Probleme: zu viele Punkte und wie Sie die verbleibenden Punkte glätten können.

Ausdünnen Ihrer Probe

Wenn zu viele Beobachtungen in Echtzeit eingehen, können Sie Ihre Stichprobe jederzeit mit einfachen Zufallsstichproben verdünnen . Beachten Sie, dass auch dies der Fall sein muss, dass die Anzahl der Punkte sehr groß sein muss.

Angenommen, Sie haben N Punkte und möchten nur n davon. Erzeugen Sie dann n Zufallszahlen aus einer diskreten gleichmäßigen U (0, N-1) -Verteilung. Dies wären die Punkte, die Sie verwenden.

Wenn Sie dies nacheinander tun möchten, dh an jedem Punkt, an dem Sie entscheiden, ob Sie es verwenden möchten oder nicht, akzeptieren Sie einfach einen Punkt mit der Wahrscheinlichkeit p . Wenn Sie also p = 0,01 setzen , würden Sie (im Durchschnitt) 1 von hundert Punkten akzeptieren.

Wenn Ihre Daten ungleichmäßig verteilt sind und Sie nur dichte Punktebereiche verdünnen möchten, können Sie Ihre Ausdünnungsfunktion etwas ausgefeilter gestalten. Zum Beispiel anstelle von p , was ist mit:

1pexp(λt)

λtt1p

λp

Glätten

Möglicherweise so etwas wie ein einfaches Schema mit gleitendem Durchschnitt. Oder Sie könnten sich für etwas Fortgeschritteneres entscheiden, wie einen Kernel-Glätter (wie andere vorgeschlagen haben). Sie müssen darauf achten, dass Sie nicht zu viel glätten, da ich davon ausgehe, dass ein plötzlicher Abfall in Ihrem Szenario sehr schnell erkannt werden sollte.

Für diese Art von Dingen sollten C # -Bibliotheken verfügbar sein.

Fazit

Bei Bedarf verdünnen, dann glatt streichen.

csgillespie
quelle
Ah, interessant, aber ich muss vorhersehbar sein, dh jedes Mal, wenn ich die Daten betrachte, das gleiche Ergebnis erzielen.
Generieren Sie in diesem Fall die n Indizes der von Ihnen ausgewählten Punkte und speichern Sie diese Indizes.
Csgillespie
Oder lagern Sie den Samen vor der Probenahme im RNG.
Dirk Eddelbuettel
Dirks Lösung bezüglich des Samens ist wahrscheinlich die bessere Option.
Csgillespie
Die Berechnung von Durchschnittswerten pro Sekunde ist in Ordnung, aber was mache ich, wenn für eine bestimmte Sekunde keine Daten vorliegen? Ich denke, ich könnte eine Interpolation von den Sekunden davor und danach machen, aber es wäre großartig mit einer bestimmten (benannten) Methode dafür, also versuche ich nicht, etwas zu erfinden, das bereits erfunden wurde.
9

Nun, ich denke, das Wort, nach dem Sie suchen, ist "Sampling", aber ich bin mir nicht sicher, warum Sie es tun möchten. Tausende von Datenpunkten sind nicht sehr viele. Oder möchten Sie nur eine kleinere Anzahl von Punkten mit gleichem Abstand zeichnen? Das nennt man normalerweise "Binning".

Ist Ihr Ziel, eine Visualisierung zu generieren? In diesem Fall möchten Sie möglicherweise die Rohdaten behalten, sie als Streudiagramm darstellen und dann eine Art zentrale Tendenz (Regressionsgerade, Spline usw.) überlagern, um zu kommunizieren, was auch immer die Takehome-Nachricht sein sollte.

Oder ist es Ihr Ziel, die Ergebnisse auf irgendeine Weise numerisch zusammenzufassen? In diesem Fall möchten Sie Ihr Problem möglicherweise genauer erläutern!

Harlan
quelle
Ja, Visualisierung ist das, was ich will. Ich habe der Frage weitere Informationen hinzugefügt.
Seconding Plotten von Rohdaten mit einer Glättungslinie.
JoFrhwld
Drittes Zeichnen von Rohdaten mit einer Glättungslinie --- Möglicherweise möchten Sie auch die Änderung des BPM über die Zeit als separate Visualisierung darstellen.
John
5

Die Berechnung von Durchschnittswerten führt zu einem anderen Datensatz als die einfache Reduzierung der Anzahl der Datenpunkte. Wenn ein Herzschlag pro Minute viel schneller ist als der andere Herzschlag, verlieren Sie das Signal durch Ihren Glättungsprozess.

Wenn Sie 125-125-0-125-125 als 100 zusammenfassen, unterscheidet sich die Geschichte, die die Daten erzählen, durch Ihre Glättung.

Manchmal überspringt das Herz sogar Schläge und ich glaube, dass dies ein Ereignis ist, das interessant ist, jedoch die aufgezeichneten Herzfrequenzdaten betrachten möchte.

Ich würde daher vorschlagen, dass Sie den Abstand zwischen zwei Punkten mit einer Formel wie berechnen d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Sie legen in Ihrem Programm einen Mindestabstand fest. Dann durchlaufen Sie Ihre Daten und löschen nach jedem Punkt alle folgenden Punkte, für die d kleiner als Ihr Mindestabstand ist.

Da die Zeiteinheit und die BPM nicht identisch sind, sollten Sie sich überlegen, wie Sie die Einheiten sinnvoll skalieren können. Um diese Aufgabe richtig zu erledigen, sollten Sie mit den Ärzten sprechen, die am Ende Ihre Grafiken interpretieren und sie fragen müssen, welche Informationen sie für wesentlich halten.

Christian
quelle
Interessantes Posting. Ich werde das auch untersuchen. Du hast vermutlich recht.
2

Wenn BPM über viele Samples hinweg gleich bleibt (oder sich infinitesimal auf eine Weise ändert, über die Sie sich keine Sorgen machen), können Sie Ihre Daten auf eine signifikante Ziffer kürzen, die Ihnen wirklich wichtig ist, und dann die Längencodierung ausführen.

Zum Beispiel in R diese Daten:

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

hat diesen Ausgang

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

Sie geben nicht genügend Informationen an. Warum möchten Sie die Datenpunkte reduzieren? Ein paar tausend sind heutzutage nichts mehr.

Wenn Sie jedes Mal dasselbe Ergebnis erzielen möchten, wenn Sie dieselben Daten anzeigen, möchten Sie möglicherweise einfach Durchschnittswerte ablegen. Sie haben einen variablen Abstand auf Ihrer x-Achse. Vielleicht versuchen Sie das konsequent zu machen? In diesem Fall würden Sie eine Behälterbreite von vielleicht 50 ms oder 100 ms einstellen und dann alle Punkte dort mitteln. Stellen Sie die Behälterbreite so groß ein, wie Sie benötigen, um die Datenpunkte auf die Größe des gewünschten Satzes zu reduzieren.

Es ist wirklich eine schwierige Frage, ohne einen Grund zu beantworten, warum Sie Daten loswerden.

John
quelle
Ok, tut mir Leid. Ich habe oben einige weitere Details hinzugefügt.
1

Zum Reduzieren Ihrer Datenpunkte können Sie den Ramer-Douglas-Peucker-Algorithmus verwenden, der sehr einfach zu verstehen und zu implementieren ist. Das abgetastete Signal ist dem ursprünglichen sehr ähnlich.

Kamran Bigdely
quelle