另一种方法是 Kooperberg 及其同事的方法,基于使用样条估计密度来近似数据的对数密度。我将展示一个使用来自@whuber 答案的数据的示例,这将允许比较方法。
set.seed(17)
x <- rexp(1000)
您需要为此安装logspline包;如果不是,请安装它:
install.packages("logspline")
logspline()
加载包并使用函数估计密度:
require("logspline")
m <- logspline(x)
在下文中,我假设d
来自@whuber 答案的对象存在于工作区中。
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)
结果图如下所示,对数样条密度由红线表示
此外,可以通过参数lbound
和指定对密度的支持ubound
。如果我们希望假设 0 左侧的密度为 0 并且在 0 处存在不连续性,我们可以lbound = 0
在调用 中使用logspline()
,例如
m2 <- logspline(x, lbound = 0)
产生以下密度估计(此处显示原始m
对数样条拟合,因为上一个图已经很忙了)。
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()
结果图如下所示
在这种情况下,利用知识x
处不趋于0 ,但类似于其他地方的标准对数样条拟合x=0x