Uma alternativa é a abordagem de Kooperberg e colegas, com base na estimativa da densidade usando splines para aproximar a densidade de log dos dados. Vou mostrar um exemplo usando os dados da resposta do @ whuber, que permitirá uma comparação de abordagens.
set.seed(17)
x <- rexp(1000)
Você precisará do pacote de logspline instalado para isso; instale-o se não estiver:
install.packages("logspline")
Carregue o pacote e estime a densidade usando a logspline()
função:
require("logspline")
m <- logspline(x)
A seguir, presumo que o objeto d
da resposta do @ whuber esteja presente no espaço de trabalho.
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)
O gráfico resultante é mostrado abaixo, com a densidade da linha de logs mostrada pela linha vermelha
Além disso, o suporte para a densidade pode ser especificado através de argumentos lbound
e ubound
. Se quisermos supor que a densidade é 0 à esquerda de 0 e há uma descontinuidade em 0, poderíamos usar lbound = 0
a chamada paralogspline()
, por exemplo
m2 <- logspline(x, lbound = 0)
Rendimento da seguinte estimativa de densidade (mostrada aqui com o m
ajuste original da linha de logs, pois a figura anterior já estava ficando 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()
O gráfico resultante é mostrado abaixo
x
x = 0x