Trovare estremi locali di una funzione di densità usando le spline


15

Sto cercando di trovare i massimi locali per una funzione di densità di probabilità (trovata usando il densitymetodo di R ). Non posso fare un semplice metodo di "guardarsi intorno" (in cui uno si guarda attorno ad un punto per vedere se è un massimo locale rispetto ai suoi vicini) in quanto vi è un grande volume di dati. Inoltre, sembra più efficiente e generico usare qualcosa come l'interpolazione Spline e quindi trovare le radici del primo derivato, invece di costruire uno "sguardo intorno ai vicini" con tolleranza agli errori e altri parametri.

Quindi, le mie domande:

  1. Data una funzione da splinefun, quali metodi troveranno i massimi locali?
  2. Esiste un modo semplice / standard per trovare le derivate di una funzione restituita usando splinefun?
  3. Esiste un modo migliore / standard per trovare i massimi locali di una funzione di densità di probabilità?

Per riferimento, di seguito è riportato un diagramma della mia funzione di densità. Altre funzioni di densità con cui sto lavorando hanno una forma simile. Dovrei dire che sono nuovo di R, ma non nuovo di programmazione, quindi potrebbe esserci una libreria o un pacchetto standard per ottenere ciò di cui ho bisogno. funzione di densità

Grazie per l'aiuto!!


Non sono chiaro perché il grande volume di dati sia un problema per il metodo "guardarsi intorno". density()non stima la densità per ogni dato, stima la densità a n valori, dove n è un parametro specificato dall'utente con valore predefinito n = 512.
onestop

La mia n per questo è 2 ^ 15 e sembra che i dati abbiano molta varianza a livello punto per punto. Ho provato a scrivere un cercatore max / min usando qualcosa di simile al metodo dei quartieri (via msExtrema {msProcess}) e sono stato in grado di identificare solo alcuni dei massimi, mai tutti, giocando con le impostazioni di tolleranza.
Aaronlevin,

2
Guardando il codice per msExtrema, è un semplice wrapper per peaksil splus2Rpacchetto, che sarebbe meglio usare direttamente se si desidera solo i massimi locali e non i minimi locali. Non riesco a capire perché l'utilizzo del valore predefinito span=3non trovi tutti i massimi locali. E 2 ^ 15 = 32768 non dovrebbe essere abbastanza grande perché l'efficienza sia una grande preoccupazione.
Onestop,

La funzione restituita da splinefun ha un argomento "deriv" ​​che è 0 per impostazione predefinita. Impostare deriv = 1 per la prima derivata.
Ciano,

1
Hmm, peakssembra essere difettoso: chiama max.colcon l'impostazione predefinita di ties.method = "random", che non solo rompe i legami a caso, ma imposta anche una tolleranza relativa di 1e-5 per dichiarare un pareggio. Il primo è confuso, il secondo non è sicuramente quello che vuoi qui. peaks()accetta anche un strictparametro che è scarsamente documentato e, guardando il codice della funzione, non fa nulla. Ah, le gioie delle librerie software fornite dagli utenti! Potresti essere in grado di risolverlo però, poiché dici che non sei nuovo nella programmazione,
onestop

Risposte:


14

Quello che vuoi fare è chiamato rilevamento di picco in chemiometria. Ci sono vari metodi che puoi usare per quello. Dimostro solo un approccio molto semplice qui.

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")

Di tutte le soluzioni, ha funzionato meglio. 1. Domanda di follow-up: esiste un modo per attivare la tolleranza con i punti di svolta? Abbiamo trovato un sacco di picchi e valli nella porzione a coda lunga della funzione Densità. 2. Domanda di follow-up n. 2: qual è un buon modo per determinare la tolleranza?
Aaronlevin,

annuncio 1. Non credo. È inteso per testare la casualità delle serie temporali, quindi la funzione non ne ha bisogno. Puoi provare tu stesso a testare la pertinenza / il significato di un picco. Ad esempio, potresti fare un test t contro il quartiere (dove puoi decidere quanto dovrebbe essere grande il quartiere). Oppure puoi cercare una funzione più sofisticata nei pacchetti R per la valutazione dei dati della spettrometria (di massa) o di altri metodi di chimica analitica.
Roland,
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.