2013-01-14 15 views
7

Ho una serie di dati (10.000 - 50.000 valori per ciascuna serie di misurazioni) e sono interessato a identificare automaticamente i massimi/minimi locali al di fuori della stima della densità della distribuzione di questi valori. In realtà, presumo che di solito ci dovrebbero essere due picchi, separati da un pozzo, e mi piacerebbe trovare quella fossa che separa i due picchi l'uno dall'altro al fine di dividere i dati in due parti per un'ulteriore elaborazione. Se possibile, mi piacerebbe anche sapere dove si trovano i picchi.Ricerca di massimi/minimi locali in R

Poiché la stima della densità può contenere modifiche locali molto piccole, mi piacerebbe avere la possibilità di regolare la "sensibilità". Il migliore che ho trovato finora è stato questa soluzione di @Tommy: https://stackoverflow.com/a/6836924/1003358 Ecco un esempio:

library(ggplot2) 

d <- density(faithful$eruptions, bw = "sj") 
loc.max <- d$x[localMaxima(d$y)] 

ggplot(faithful, aes(eruptions)) + geom_density(adjust=1/2) + 
    geom_vline(x=loc.max, col="red") + 
    xlab("Measured values") 

Identifying maxima in faithful dataset

Ora, i miei dati sono molto più rumoroso:

d <- density(my.df$Values, bw = "sj") 
loc.max <- d$x[localMaxima(d$y)] 

ggplot(my.df, aes(Values)) + geom_density(adjust=1/2) + 
    geom_vline(x=loc.max, col="red") + 
    xlab("Measured values") 

First attempt to identify maxima in my dataset

Cercando di regolare i parametri (notare che sono stati rilevati due "indesiderati" picchi nella coda):

d <- density(my.df$Values, bw="nrd", adjust=1.2) 
loc.max <- d$x[localMaxima(d$y)] 

ggplot(my.df, aes(Values)) + geom_density(adjust=1/2) + 
    geom_vline(x=loc.max, col="red") + 
    xlab("Measured values") 

Second attempt to detect peaks in my dataset

Quindi le domande sono:

1) Come identificare automaticamente i picchi reali all'interno di un set di dati come ad rumoroso? 2) Come trovare in modo affidabile i box che separano tali picchi?

+0

Come definite "vette reali"? –

+0

@SvenHohenstein Questa è una buona domanda. Sto avendo difficoltà a cogliere matematicamente questo concetto. Ci dovrebbe essere una finestra particolare intorno al picco all'interno del quale questo picco è il più grande valore. Inoltre, potrebbe essere utile un cut-off per la dimensione minima del picco (forse in relazione alla mediana). Se so che i miei dati sono bimodali, i due picchi più alti con una ragionevole finestra (lo ammetto, è ancora una volta vaga) dovrebbero risultare grandi. Se non conosco il numero di picchi in anticipo, forse un cut-off per il massimo. valore di una fossa che separa i picchi insieme ad un cut-off per il min. il valore di un picco aiuterebbe? – AnjaM

+1

L'analisi dei dati spettrali (cromatografici o fotometrici) presenta spesso questo problema, pertanto è possibile vedere se includere "spettrale *" nelle ricerche per l'identificazione del picco. @cbeleites è sia un partecipante SO che è coinvolto nello sviluppo di pacchetti R attivi lungo queste linee. –

risposta

1

Il mio preferito è pastecs::turnpoints. Ma hai ragione che dovrai fare qualche filtraggio soggettivo per distinguere il rumore spiky dai veri picchi. Un modo per farlo è quello di richiedere che i dati grezzi o spline rimangano sopra la soglia per N valori consecutivi.

+0

Grazie per il tuo suggerimento. 'pastecs :: turnpoints' non sembra offrire la possibilità di definire una span/finestra, quindi di nuovo mi trovo ad affrontare lo stesso problema dell'approccio precedente. Non sono sicuro di come implementare il tuo suggerimento per definire tale soglia. Inoltre, per quanto ho capito, non fa distinzioni tra i picchi e le buche, vero? – AnjaM

+0

Oh, mi dispiace, ho appena notato che puoi distinguere i picchi dai box con il metodo 'extract()'. Darò sicuramente uno sguardo più da vicino a questa funzione. Ma mi sto ancora chiedendo qual è il modo migliore per filtrare i valori. – AnjaM

Problemi correlati