我有一些正态分布的数据:
mu <- 3
sigma <- 5
x <- rnorm(1e5, mu, sigma)
我用相当高的带宽进行了内核密度估计:
kernel_density_of_x <- density(x, bw = 5)
然后我区分了它:
differentiate <- function(x, y)
{
diffOfX <- diff(x)
data.frame(
x = x[-length(x)] + (diffOfX / 2),
dyByDx = diff(y) / diffOfX
)
}
first_derivative <- with(kernel_density_of_x, differentiate(x, y))
这看起来和预期的一样:
library(ggplot2)
(p1 <- ggplot(first_derivative, aes(x, dyByDx)) + geom_line())

当我再次进行微分时,我期待另一条平滑曲线,但我看到了奇怪的周期性效应。
second_derivative <- with(first_derivative, differentiate(x, dyByDx))
(p2 <- p1 %+% second_derivative + ylab("d2yByDx2"))

我尝试了几个不同的kernel参数选项,但噪音仍然存在。
例如,将带宽降低到 会0.5产生主导绘图的较低频率噪声(使其毫无意义)。
减少采样点的数量n = 512以n = 32停止问题,但这会导致其他问题。
为什么会出现这种效果?它是功能的工件density,还是我做了一些愚蠢的事情?
我们可以使用生成的正态分布的概率密度函数重新绘制绘图x,以查看我预期的形状:
xx <- seq.int(-20, 20, 0.1)
pdf_of_xx <- dnorm(xx, mu, sigma)
first_derivative_of_xx <- differentiate(xx, pdf_of_xx)
second_derivative_of_xx<- with(first_derivative_of_xx, differentiate(x, dyByDx))
ggplot(second_derivative_of_xx, aes(x, dyByDx)) + geom_line()


