Ich versuche, die ' Dichte' -Funktion in R zu verwenden, um Kernel-Dichteschätzungen durchzuführen. Ich habe einige Schwierigkeiten, die Ergebnisse zu interpretieren und verschiedene Datensätze zu vergleichen, da die Fläche unter der Kurve nicht unbedingt 1 zu sein scheint. Für jede Wahrscheinlichkeitsdichtefunktion (pdf) müssen wir die Fläche . Ich gehe davon aus, dass die Schätzung der Kerneldichte das PDF ausgibt. Ich verwende integrate.xy von sfsmisc die Fläche unter der Kurve zu schätzen.
> # generate some data
> xx<-rnorm(10000)
> # get density
> xy <- density(xx)
> # plot it
> plot(xy)
> # load the library
> library(sfsmisc)
> integrate.xy(xy$x,xy$y)
[1] 1.000978
> # fair enough, area close to 1
> # use another bw
> xy <- density(xx,bw=.001)
> plot(xy)
> integrate.xy(xy$x,xy$y)
[1] 6.518703
> xy <- density(xx,bw=1)
> integrate.xy(xy$x,xy$y)
[1] 1.000977
> plot(xy)
> xy <- density(xx,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 6507.451
> plot(xy)
Sollte die Fläche unter der Kurve nicht immer 1 sein? Es scheint, dass kleine Bandbreiten ein Problem sind, aber manchmal möchten Sie die Details usw. in den Endstücken anzeigen, und kleine Bandbreiten werden benötigt.
Update / Antwort:
Es scheint, dass die Antwort über die Überschätzung in konvexen Bereichen richtig ist, da die Erhöhung der Anzahl der Integrationspunkte das Problem zu verringern scheint (ich habe nicht versucht, mehr als Punkte zu verwenden.)
> xy <- density(xx,n=2^15,bw=.001)
> plot(xy)
> integrate.xy(xy$x,xy$y)
[1] 1.000015
> xy <- density(xx,n=2^20,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 2.812398
quelle
Antworten:
Denken Sie über die
integrate.xy()
Verwendung der Trapezregel nach . Für die Normalverteilung, werden sie unterschätzen die Fläche unter der Kurve im Intervall (-1,1) , wo die Dichte konkav ist (und somit die lineare Interpolation unter der wahren Dichte) und überschätzen es an anderer Stelle (wie die lineare Interpolation geht auf die wahre Dichte). Da der letztere Bereich größer ist (in Lesbegue, wenn Sie möchten), neigt die Trapezregel dazu, das Integral zu überschätzen. Wenn Sie jetzt auf kleinere Bandbreiten umsteigen, ist fast Ihre gesamte Schätzung stückweise konvex, mit vielen schmalen Spitzen, die den Datenpunkten und Tälern zwischen ihnen entsprechen. Hier bricht die Trapezregel besonders stark zusammen.quelle
density
eher bei als bei liegtintegrate.xy
. Mit N = 10000 und bw = 1E6, würden Sie haben einen Kamm mit einer Höhe jedes Zahnes von etwa 1E6 zu sehen, und die Zähne dichter um 0 Stattdessen ist man immer noch ein erkennbares Glockenkurve zu sehen. Sodensity
betrügt Sie, oder zumindest sollte es anders mit kleinen Bandbreiten verwendet werden:n
sollte etwa (Datenbereich) sein / (bw) statt der Standardn=512
. Der Intergrator muss einen dieser riesigen Wertedensity
aufgreifen, die durch einen unglücklichen Zufall zurückkehren.Das ist in Ordnung, Sie können es verschieben und skalieren. Addieren Sie die kleinste Zahl, sodass die Dichte nicht negativ ist, und multiplizieren Sie das Ganze mit einer Konstanten, sodass die Fläche eins ist. Das ist der einfache Weg.
quelle
density
Funktion nicht die "richtige" Dichte ergibt, die zu 1 integriert wird, als darauf, wie sie zu beheben ist.