Come posso ridurre il numero di punti dati in una serie?


11

Non ho studiato le statistiche per oltre 10 anni (e quindi solo un corso base), quindi forse la mia domanda è un po 'difficile da capire.

Comunque, quello che voglio fare è ridurre il numero di punti dati in una serie. L'asse x è il numero di millisecondi dall'inizio della misurazione e l'asse y è la lettura per quel punto.

Spesso ci sono migliaia di punti dati, ma potrei averne bisogno solo di alcune centinaia. Quindi la mia domanda è: come posso ridurre con precisione il numero di punti dati?

Come si chiama il processo? (Quindi posso cercarlo su Google) Esistono algoritmi preferiti (lo implementerò in C #)

Spero che tu abbia qualche indizio. Ci scusiamo per la mancanza di una terminologia adeguata.


Modifica: maggiori dettagli vengono qui:

I dati grezzi che ho ottenuto sono dati sulla frequenza cardiaca e sotto forma di numero di millisecondi dall'ultimo battito. Prima di tracciare i dati, calcolo il numero di millisecondi dal primo campione e i bpm (battiti al minuto) in ciascun punto di dati (60000 / volte in continuo).

Voglio visualizzare i dati, cioè tracciarli in un grafico a linee. Voglio ridurre il numero di punti nel grafico da migliaia a alcune centinaia.

Un'opzione sarebbe quella di calcolare il bpm medio per ogni secondo della serie, o forse ogni 5 secondi circa. Sarebbe stato abbastanza facile se avessi saputo che avrei avuto almeno un campione per ciascuno di quei periodi (secondi di intervalli di 5 secondi).


Ho dimenticato questo: i punti lungo l'asse x vengono con spaziatura variabile.

Non sono sicuro di aver capito. Non hai un asse y?

Mi dispiace. Ho sbagliato a scrivere. Ora l'ho cambiato sopra.

Penso anche che sia necessario fornire ulteriori informazioni. Ad esempio, non riesco ancora a visualizzare il grafico. Qual è il tuo obiettivo?

Ok scusa. Ho aggiunto alcuni dettagli sopra.

Risposte:


10

Hai due problemi: troppi punti e come smussare i punti rimanenti.

Assottigliamento del campione

Se hai troppe osservazioni in arrivo in tempo reale, puoi sempre utilizzare un semplice campionamento casuale per assottigliare il campione. Nota, anche per questo è vero, il numero di punti dovrebbe essere molto grande.

Supponiamo di avere N punti e di volerne solo n . Quindi genera n numeri casuali da una distribuzione uniforme U (0, N-1) discreta . Questi sarebbero i punti che usi.

Se vuoi farlo in sequenza, cioè in ogni punto in cui decidi di usarlo o meno, allora accetta un punto con probabilità p . Quindi se imposti p = 0,01 accetteresti (in media) 1 punto su cento.

Se i tuoi dati sono distribuiti in modo non uniforme e vuoi solo assottigliare aree di punti densi, allora rendi la tua funzione di assottigliamento un po 'più sofisticata. Ad esempio, invece di p , che dire di:

1pexp(λt)

dove è un numero positivo e è il tempo trascorso dall'ultima osservazione. Se il tempo tra due punti è grande, cioè grande , la probabilità di accettare un punto sarà una. Al contrario, se due punti sono vicini, la probabilità di accettare un punto sarà .λtt1p

Dovrai sperimentare i valori di e .λp

lisciatura

Forse qualcosa come un semplice schema di tipo a media mobile. Oppure potresti scegliere qualcosa di più avanzato come un kernel più fluido (come altri hanno suggerito). Dovrai stare attento a non lisciarti troppo, dato che presumo che un calo improvviso dovrebbe essere raccolto molto rapidamente nel tuo scenario.

Dovrebbero esserci librerie C # disponibili per questo tipo di cose.

Conclusione

Sottile se necessario, quindi liscio.


Ah, interessante, ma ho bisogno che sia prevedibile, cioè che abbia lo stesso risultato ogni volta che visualizzo i dati.

In tal caso, genera gli indici n dei punti scelti e memorizza tali indici.
csgillespie,

O conservare il seme nell'RNG prima del campionamento.
Dirk Eddelbuettel,

La soluzione di Dirk per quanto riguarda il seme è probabilmente l'opzione migliore.
csgillespie,

Il calcolo delle medie per ogni secondo è ok, ma cosa faccio quando non ci sono dati per un secondo specifico. Immagino di poter fare un po 'di interpolazione dai secondi precedenti e successivi, ma sarebbe fantastico con un metodo specifico (chiamato) per questo, quindi non provo a inventare qualcosa di già inventato.

9

Beh, penso che la parola che stai cercando sia "campionamento", ma non sono sicuro del motivo per cui vuoi farlo. Migliaia di punti dati non sono molti. O stai solo cercando di tracciare un numero minore di punti equidistanti? Questo di solito si chiama "binning".

Il tuo obiettivo è generare una visualizzazione? In tal caso, potresti voler conservare i dati grezzi, tracciarli come uno scattergraph, quindi sovrapporre una sorta di tendenza centrale (linea di regressione, spline, qualunque cosa) per comunicare qualunque sia il messaggio del takehome.

O il tuo obiettivo è riassumere numericamente i risultati in qualche modo? In tal caso, potresti voler spiegare il tuo problema in modo più dettagliato!


Sì, la visualizzazione è ciò che voglio. Ho aggiunto alcune informazioni in più nella domanda.

in secondo luogo tracciare dati grezzi con una linea di livellamento.
JoFrhwld,

terzo tracciamento di dati grezzi con una linea di smussatura --- Potresti voler tracciare anche la modifica di BPM nel tempo come visualizzazione separata.
Giovanni

5

Il calcolo delle medie porta a un set di dati diverso dalla semplice riduzione del numero di punti dati. Se un battito cardiaco al minuto è molto più veloce degli altri battiti cardiaci, perderai il segnale durante il processo di livellamento.

Se si sommano 125-125-0-125-125 come 100 rispetto alla storia che i dati raccontano è diversa attraverso il livellamento.

A volte il cuore salta anche i battiti e credo che sia un evento così interessante per cui vuole guardare i dati della frequenza cardiaca tracciati.

Propongo quindi di calcolare la distanza tra due punti con una formula simile d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Hai impostato una distanza minima nel tuo programma. Quindi si esegue l'iterazione dei dati e dopo ogni punto si eliminano tutti i punti seguenti per i quali d è inferiore alla distanza minima.

Poiché l'unità di tempo e il bpm non sono gli stessi, potresti pensare a come trovare un modo per ridimensionare le unità in modo significativo. Per fare bene questo compito, dovresti parlare con i dottori che alla fine devono interpretare i tuoi grafici e chiedere loro quali informazioni considerano essenziali.


Pubblicazione interessante. Ci penserò anche io. Probabilmente hai ragione.

2

Se BPM rimane lo stesso su molti campioni (o cambia in modo infinitesimale in un modo di cui non ti preoccupi) puoi troncare i tuoi dati a una cifra significativa che ti interessa davvero e quindi eseguire Run Length Encoding.

Ad esempio, in R questi dati:

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

ha questo output

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

1

Non stai fornendo informazioni sufficienti. Perché vuoi ridurre i punti dati. Qualche migliaio non è niente in questi giorni.

Dato che si desidera lo stesso risultato ogni volta che si visualizzano gli stessi dati, forse si desidera semplicemente bin media. Hai una spaziatura variabile sull'asse x. Forse stai cercando di renderlo coerente? In tal caso, imposteresti una larghezza del contenitore di forse 50 msec, o 100, e quindi fai la media di tutti i punti lì dentro. Aumenta la larghezza del cestino di cui hai bisogno per ridurre i punti dati alla dimensione del set desiderato.

È davvero una domanda difficile a cui rispondere senza un motivo per cui ti stai sbarazzando dei dati.


Ok scusa. Ho aggiunto alcuni dettagli sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.