No he estudiado estadísticas durante más de 10 años (y luego solo un curso básico), por lo que tal vez mi pregunta sea un poco difícil de entender.
De todos modos, lo que quiero hacer es reducir el número de puntos de datos en una serie. El eje x es el número de milisegundos desde el inicio de la medición y el eje y es la lectura para ese punto.
A menudo hay miles de puntos de datos, pero es posible que solo necesite unos pocos cientos. Entonces mi pregunta es: ¿cómo reduzco con precisión la cantidad de puntos de datos?
¿Cómo se llama el proceso? (Para que pueda googlearlo) ¿Hay algún algoritmo preferido (lo implementaré en C #)
Espero que tengas algunas pistas. Perdón por mi falta de terminología adecuada.
Editar: Más detalles vienen aquí:
Los datos sin procesar que obtuve son datos de frecuencia cardíaca y en forma de número de milisegundos desde el último latido. Antes de trazar los datos, calculo el número de milisegundos de la primera muestra y los bpm (latidos por minuto) en cada punto de datos (60000 / timesincelastbeat).
Quiero visualizar los datos, es decir, trazarlos en un gráfico lineal. Quiero reducir el número de puntos en el gráfico de miles a algunos cientos.
Una opción sería calcular el promedio de bpm por cada segundo en la serie, o tal vez cada 5 segundos más o menos. Eso hubiera sido bastante fácil si supiera que tendría al menos una muestra para cada uno de esos períodos (segundos de intervalos de 5 segundos).
fuente
Respuestas:
Tiene dos problemas: demasiados puntos y cómo suavizar los puntos restantes.
Adelgazando su muestra
Si tiene demasiadas observaciones llegando en tiempo real, siempre podría usar un muestreo aleatorio simple para diluir su muestra. Tenga en cuenta que para que esto también sea cierto, el número de puntos debería ser muy grande.
Supongamos que tiene N puntos y solo quiere n de ellos. Luego, genere n números aleatorios a partir de una distribución discreta uniforme U (0, N-1) . Estos serían los puntos que usa.
Si desea hacer esto secuencialmente, es decir, en cada punto que decida usarlo o no, simplemente acepte un punto con probabilidad p . Entonces, si establece p = 0.01 , aceptaría (en promedio) 1 punto en cien.
Si sus datos se distribuyen de manera desigual y solo desea adelgazar regiones densas de puntos, simplemente haga que su función de adelgazamiento sea un poco más sofisticada. Por ejemplo, en lugar de p , ¿qué pasa con:
donde es un número positivo es el tiempo transcurrido desde la última observación. Si el tiempo entre dos puntos es grande, es decir , grande , la probabilidad de aceptar un punto será uno. Por el contrario, si dos puntos están juntos, la probabilidad de aceptar un punto será .λ t t 1−p
Deberá experimentar con los valores de y .λ p
Suavizado
Posiblemente algo así como un simple esquema de tipo de promedio móvil. O podría optar por algo más avanzado como un kernel más suave (como otros sugirieron). Tendrá que tener cuidado de no suavizar demasiado, ya que supongo que una caída repentina se debe detectar muy rápidamente en su escenario.
Debería haber bibliotecas C # disponibles para este tipo de cosas.
Conclusión
Fino si es necesario, luego liso.
fuente
Bueno, creo que la palabra que estás buscando es "muestreo", pero no estoy seguro de por qué quieres hacerlo. Miles de puntos de datos no son muchos. ¿O solo busca trazar un número menor de puntos igualmente espaciados? Eso generalmente se llama "binning".
¿Tu objetivo es generar una visualización? En ese caso, es posible que desee conservar los datos en bruto, trazarlos como un diagrama de dispersión, y luego superponer algún tipo de tendencia central (línea de regresión, spline, lo que sea) para comunicar lo que sea el mensaje para llevar a casa.
¿O es su objetivo resumir numéricamente los resultados de alguna manera? ¡En ese caso, es posible que desee explicar su problema con más detalle!
fuente
Calcular promedios conduce a un conjunto de datos diferente que simplemente reducir la cantidad de puntos de datos. Si un latido por minuto es mucho más rápido que los otros latidos, perderá la señal a través de su proceso de suavizado.
Si resume 125-125-0-125-125 como 100 que la historia que cuentan los datos es diferente a través de su suavizado.
A veces, el corazón incluso omite los latidos y creo que es un evento interesante para el que, sin embargo, quiere ver los datos trazados de frecuencia cardíaca.
Por lo tanto, le propondría que calcule la distancia entre dos puntos con una fórmula como
d=sqrt((time1-time2)^2 + (bpm1-bpm2))
.Establece una distancia mínima en su programa. Luego itera a través de sus datos y después de cada punto elimina todos los puntos siguientes para los cuales d es menor que su distancia mínima.
Como la unidad de tiempo y las ppm no son las mismas, es posible que desee pensar en cómo encontrar una manera de escalar las unidades de manera significativa. Para hacer esta tarea correctamente, debe hablar con los médicos que al final deben interpretar sus gráficos y preguntarles qué información consideran esencial.
fuente
Si BPM se mantiene igual en muchas muestras (o cambia infinitamente de una manera que no le preocupa), puede truncar sus datos a un dígito significativo que realmente le interese y luego ejecutar Run Length Encoding.
Por ejemplo, en R estos datos:
tiene esta salida
fuente
No estás proporcionando suficiente información. ¿Por qué quieres reducir los puntos de datos? Unos pocos miles no son nada en estos días.
Dado que desea el mismo resultado cada vez que ve los mismos datos, tal vez quiera simplemente agrupar promedios. Tiene espaciado variable en su eje x. ¿Quizás estás tratando de hacer eso consistente? En ese caso, establecería un ancho de depósito de quizás 50 ms, o 100, y luego promediaría todos los puntos allí. Haga que el ancho del contenedor sea tan grande como sea necesario para reducir los puntos de datos al tamaño del conjunto que desea.
Realmente es una pregunta difícil de responder sin una razón por la cual te estás deshaciendo de los datos.
fuente
Para reducir sus puntos de datos, puede usar el algoritmo Ramer – Douglas – Peucker que es muy fácil de entender e implementar. La señal muestreada será muy similar a la original.
fuente