Eine Alternative ist der Ansatz von Kooperberg und Kollegen, bei dem die Dichte mithilfe von Splines geschätzt wird, um die logarithmische Dichte der Daten zu approximieren. Ich werde ein Beispiel mit den Daten aus @ whubers Antwort zeigen, das einen Vergleich der Ansätze ermöglicht.
set.seed(17)
x <- rexp(1000)
Dazu muss das logspline- Paket installiert sein. Installieren Sie es, wenn es nicht ist:
install.packages("logspline")
Laden Sie das Paket und schätzen Sie die Dichte mit der logspline()
Funktion:
require("logspline")
m <- logspline(x)
Im Folgenden d
gehe ich davon aus, dass das Objekt aus @ whubers Antwort im Arbeitsbereich vorhanden ist.
plot(d, type="n", main="Default, truncated, and logspline densities",
xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
Das resultierende Diagramm wird unten gezeigt, wobei die Dichte der Protokolllinien durch die rote Linie angezeigt wird
Zusätzlich kann die Unterstützung für die Dichte über Argumente lbound
und angegeben werden ubound
. Wenn wir annehmen möchten, dass die Dichte 0 links von 0 ist und bei 0 eine Diskontinuität vorliegt, können wir dies beispielsweise für lbound = 0
den Aufruf von verwendenlogspline()
m2 <- logspline(x, lbound = 0)
Ergeben der folgenden Dichteschätzung (hier mit der ursprünglichen m
Logspline-Anpassung, da die vorherige Abbildung bereits ausgelastet war).
plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
ylab = "Density", xlab = "x")
plot(m, col = "red", xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()
Das resultierende Diagramm ist unten dargestellt
x
x = 0x