据我了解,核密度估计不对底层密度的矩做任何假设,只需要平滑度。柯西密度函数非常平滑。尽管如此,当我尝试density()
在 R 中使用 KDE 来从柯西分布中随机抽取时,我得到的答案非常不准确:
set.seed(1)
foo <- seq(-50, 50, length = 1e3)
plot(foo, dt(foo, df = 1), type = 'l')
lines(density(rt(1e3, df = 1)), col = "red")
对不同的种子重复上述操作或增加样本量可能会给出进一步的不稳定估计。默认内核是高斯 in R
。将内核更改为任何其他选项都不会改善输出。
问题:柯西对 KDE 违反了哪些假设?如果没有,那么为什么我们会看到 KDE 在这里失败得如此悲惨?
编辑: @cdalitz 已经确定问题出在 kde 评估密度的位置。默认值为3*bw*range(x)
,对于 Cauchy 来说可能非常大。这意味着,默认情况下density
会尝试512
在 x 轴上稀疏分布的点处估计 KDE。
为了测试这一点,我更改了密度估计中的from
andto
并查看如果我density
使用两组评估点运行两次,那么密度匹配:
set.seed(1)
samp <- rt(1e4, df = 1)
bd <- 10
den1 <- density(samp, from=-bd, to=bd, n=512)
den2 <- density(samp, from =-2*bd, to = 2*bd, n =512)
foo <- seq(-50, 50, length = 1e3)
plot(foo, dt(foo, df = 1), type = 'l')
lines(den2, col = "blue", type = "b")
lines(den1, col = "red", type = "b")
这里的质量比以前好多了。但是,现在如果不是2*bd
,我将其更改为50*bd
,我得到即使在 0 左右的密度估计也有很大不同!
set.seed(1)
samp <- rt(1e4, df = 1)
bd <- 10
den1 <- density(samp, from=-bd, to=bd, n=512)
den2 <- density(samp, from =-50*bd, to = 50*bd, n =512)
foo <- seq(-50, 50, length = 1e3)
plot(foo, dt(foo, df = 1), type = 'l', ylim = c(0,.7))
lines(den2, col = "blue", type = "b")
lines(den1, col = "red", type = "b")
稀疏点的密度评估如何改变周围的密度评估过程den1
(为和选择的带宽相同den2
)?任意点的 KD 估计是
密度估计值不应在给定值下改变如果密度也在其他点进行评估。我在这里想念什么?