대안은 데이터의 로그 밀도를 근사하기 위해 스플라인을 사용하여 밀도를 추정하는 것에 기반한 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