R density()函数与delta函数的收敛性

时间:2013-07-08 06:46:48

标签: r kernel-density

我对边缘情况下R density()函数的行为感到有些困惑......

假设我将x = 0的点越来越多地添加到模拟数据集中。我所期待的是密度估计将很快收敛(我故意对这意味着什么......)到x = 0处的delta函数。在实践中,拟合肯定变得更窄,但非常缓慢,如这一系列图所示:

plot(density(c(0,0)), xlim=c(-2,2))
plot(density(c(0,0,0,0)), xlim=c(-2,2))
plot(density(c(rep(0,10000))), xlim=c(-2,2))
plot(density(c(rep(0,10000000))), xlim=c(-2,2))

但是如果向模拟数据添加一点点噪音,行为就会好得多:

plot(density(0.0000001*rnorm(10000000) + c(rep(0,10000000))), xlim=c(-2,2))

只是让睡觉的狗撒谎?或者我错过了密度()的使用方法?

2 个答案:

答案 0 :(得分:1)

?bw.nrd0density的默认带宽选择器:

  

bw.nrd0实现了用于选择高斯核密度估计器的带宽的经验法则。它默认为标准差最小值的0.9倍,四分位数范围除以样本量的1.34倍到负五分之一(= Silverman的“经验法则”,Silverman(1986,第48页,eqn(3.31))除非四分位数重合,否则肯定会得到肯定的结果。

当你的数据是常数时,那么四分位数重合,所以保证正结果的最后一个条款开始。这基本上意味着所选择的带宽不是数据扩展的连续函数,为零。

举例说明:

> bw.nrd0(rep(0, 1e6))
[1] 0.05678616
> bw.nrd0(rnorm(1e6, s=1e-6))
[1] 5.672872e-08

答案 1 :(得分:0)

实际上(......腿之间的尾巴......)我现在意识到我的整个问题都被误导了。作为R的新手,我立即假设密度()试图将不同宽度的高斯拟合到数据点,优化高斯数和它们各自的宽度。但事实上它正在做一些更简单的事情。它只是抹掉每个数据点,并将涂片加起来以给出平滑的数据估计。 density()只是一个简单的平滑算法。所以,确实如此,RTFM :)