Una alternativa es el enfoque de Kooperberg y colegas, basado en la estimación de la densidad utilizando splines para aproximar la densidad logarítmica de los datos. Mostraré un ejemplo utilizando los datos de la respuesta de @ whuber, lo que permitirá una comparación de enfoques.
set.seed(17)
x <- rexp(1000)
Necesitará el paquete logspline instalado para esto; instálelo si no es:
install.packages("logspline")
Cargue el paquete y calcule la densidad usando la logspline()función:
require("logspline")
m <- logspline(x)
A continuación, supongo que el objeto dde la respuesta de @ whuber está presente en el espacio de trabajo.
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)
La gráfica resultante se muestra a continuación, con la densidad de la línea de registro mostrada por la línea roja.

Además, el soporte para la densidad se puede especificar mediante argumentos lboundy ubound. Si deseamos suponer que la densidad es 0 a la izquierda de 0 y hay una discontinuidad en 0, podríamos usar lbound = 0en la llamada a logspline(), por ejemplo
m2 <- logspline(x, lbound = 0)
Obteniendo la siguiente estimación de densidad (que se muestra aquí con el majuste de la línea de registro original ya que la figura anterior ya estaba ocupada).
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()
La trama resultante se muestra a continuación

xx = 0x