Finden lokaler Extrema einer Dichtefunktion mit Splines


14

Ich versuche, die lokalen Maxima für eine Wahrscheinlichkeitsdichtefunktion zu finden (gefunden mit der densityMethode von R ). Ich kann keine einfache Methode zum Umsehen von Nachbarn durchführen (bei der man sich an einem Punkt umsieht, um festzustellen, ob es sich um ein lokales Maximum in Bezug auf die Nachbarn handelt), da es eine große Datenmenge gibt. Darüber hinaus scheint es effizienter und allgemeiner zu sein, so etwas wie Spline-Interpolation zu verwenden und dann die Wurzeln der 1. Ableitung zu finden, anstatt einen "Blick um die Nachbarn" mit Fehlertoleranz und anderen Parametern zu erstellen.

Also meine Fragen:

  1. Ausgehend von einer Funktion von splinefun, welche Methoden finden die lokalen Maxima?
  2. Gibt es eine einfache / standardmäßige Möglichkeit, Ableitungen einer mit zurückgegebenen Funktion zu finden splinefun?
  3. Gibt es einen besseren / standardmäßigen Weg, um die lokalen Maxima einer Wahrscheinlichkeitsdichtefunktion zu finden?

Als Referenz ist unten eine grafische Darstellung meiner Dichtefunktion. Andere Dichtefunktionen, mit denen ich arbeite, sind in der Form ähnlich. Ich sollte sagen, dass ich neu in R bin, aber nicht neu in der Programmierung. Es kann also eine Standardbibliothek oder ein Standardpaket geben, um das zu erreichen, was ich brauche. Dichtefunktion

Danke für Ihre Hilfe!!


Ich bin mir nicht sicher, warum das große Datenvolumen ein Problem für die Methode zum Umsehen der Nachbarn darstellt. density()schätzt nicht die Dichte für jedes Datum, sondern die Dichte bei n Werten, wobei n ein benutzerdefinierter Parameter mit dem Standardwert n = 512 ist.
onestop

Mein n hierfür ist 2 ^ 15 und es scheint, dass die Daten auf Punkt-für-Punkt-Ebene sehr unterschiedlich sind. Ich habe versucht, einen Max / Min-Finder zu schreiben, der der Nachbarschaftsmethode (via msExtrema {msProcess}) ähnelt, und konnte nur einige der Maxima identifizieren, niemals alle, indem ich mit den Toleranzeinstellungen spielte.
Aaronlevin

2
Wenn Sie sich den Code für msExtremaansehen, handelt es sich um einen einfachen Wrapper für peaksdas splus2RPaket, den Sie besser direkt verwenden sollten, wenn Sie nur die lokalen Maxima und nicht die lokalen Minima möchten. Ich kann nicht erkennen, warum bei Verwendung der Standardeinstellung span=3nicht alle lokalen Maxima gefunden wurden. Und 2 ^ 15 = 32768 sollte nicht groß genug sein, damit die Effizienz ein großes Problem darstellt.
Onestop

Die von splinefun zurückgegebene Funktion hat ein Argument "deriv", das standardmäßig 0 ist. Setze deriv = 1 für die erste Ableitung.
Cyan

1
Hmm, peaksscheint fehlerhaft zu sein: Es ruft max.colmit der Standardeinstellung von auf ties.method = "random", die nicht nur willkürliche Bindungen aufbricht, sondern auch eine relative Toleranz von 1e-5 für das Deklarieren einer Bindung festlegt. Ersteres ist verwirrend, letzteres ist definitiv nicht das, was Sie hier wollen. peaks()Außerdem wird ein strictParameter verwendet, der schlecht dokumentiert ist und im Code der Funktion nichts bewirkt. Ah, die Freuden benutzergestützter Softwarebibliotheken! Möglicherweise können Sie das
Problem

Antworten:


13

Was Sie tun möchten, heißt Peak-Detektion in der Chemometrie. Hierfür stehen verschiedene Methoden zur Verfügung. Ich zeige hier nur einen sehr einfachen Ansatz.

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")

Von allen Lösungen funktionierte dies am besten. 1. Folgefrage: Gibt es eine Möglichkeit, die Toleranz mit Wendepunkten umzuschalten? Es wurden viele Gipfel und Täler im Long-Tail-Bereich der Density-Funktion gefunden. 2. Anschlussfrage Nr. 2: Wie lässt sich Toleranz gut bestimmen?
Aaronlevin

ad 1. Das glaube ich nicht. Es ist zum Testen der Zufälligkeit von Zeitreihen gedacht, daher benötigt die Funktion dies nicht. Sie könnten versuchen, die Relevanz / Signifikanz eines Peaks selbst zu testen. Zum Beispiel könnten Sie einen T-Test gegen die Nachbarschaft durchführen (wo Sie entscheiden können, wie groß die Nachbarschaft sein soll). Oder Sie können nach einer komplexeren Funktion in R-Paketen suchen, um Daten aus der (Massenspektrometrie) oder anderen analytischen chemischen Methoden auszuwerten.
Roland
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.