別の方法は、スプラインを使用して密度を推定し、データのログ密度を概算することに基づいた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)
結果のプロットを以下に示します。logspline密度は赤い線で示されます
さらに、密度のサポートは、引数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
x = 0x