1

我对 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))

就让睡狗躺着?还是我错过了有关密度()的使用的一些信息?

4

2 回答 2

1

?bw.nrd0,默认带宽选择器density

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

当您的数据恒定时,四分位数重合,因此保证肯定结果的最后一个条款生效。这基本上意味着选择的带宽不是数据传播的连续函数,为零。

为了显示:

> bw.nrd0(rep(0, 1e6))
[1] 0.05678616
> bw.nrd0(rnorm(1e6, s=1e-6))
[1] 5.672872e-08
于 2013-07-08T08:10:08.263 回答
0

实际上(......腿之间的尾巴......)我现在意识到我的整个问题都被误导了。作为 R 的新手,我立即假设 density() 尝试将不同宽度的高斯拟合到数据点,优化高斯的数量和它们各自的宽度。但实际上它做的事情要简单得多。它只是涂抹了每个数据点,并将涂抹量相加以对数据进行平滑估计。density() 只是一个简单的平滑算法。所以,是的,RTFM :)

于 2013-07-08T17:17:27.107 回答