为什么密度曲线下面积的总和总是大于1(R)?

时间:2017-08-15 21:07:29

标签: r

我找到了用来计算R中密度曲线下面积之和的代码。不幸的是,我不明白为什么总有一个额外的〜" 0.000976"在该地区...

nb.data = 500000
y = rnorm(nb.data,10,2)

de = density(y)

require(zoo)
sum(diff(de$x[order(de$x)])*rollmean(de$y[order(de$x)],2))

[1] 1.000976

为什么会这样?

它应该等于1,对吧?

2 个答案:

答案 0 :(得分:8)

那是微积分。对于更准确的结果

,请使用更高的n(默认值为512)
set.seed(42)
de = density(rnorm(500000, 10, 2))
sum(diff(sort(de$x)) * 0.5 * (de$y[-1] + head(de$y, -1)))
#[1] 1.00098

set.seed(42)
de = density(rnorm(500000, 10, 2), n = 1000)
sum(diff(sort(de$x)) * 0.5 * (de$y[-1] + head(de$y, -1)))
#[1] 1.000491

set.seed(42)
de = density(rnorm(500000, 10, 2), n = 10000)
sum(diff(sort(de$x)) * 0.5 * (de$y[-1] + head(de$y, -1)))
#[1] 1.000031

set.seed(42)
de = density(rnorm(500000, 10, 2), n = 100000)
sum(diff(sort(de$x)) * 0.5 * (de$y[-1] + head(de$y, -1)))
#[1] 1.000004

set.seed(42)
de = density(rnorm(500000, 10, 2), n = 1000000)
sum(diff(sort(de$x)) * 0.5 * (de$y[-1] + head(de$y, -1)))
#[1] 1

答案 1 :(得分:7)

这种差异不仅仅是由于舍入误差或浮点运算引起的。你有效地在由density计算的点之间进行线性插值,然后在这个近似下计算原始函数的面积(即你使用trapzoidal rule积分曲线),这意味着你高估了曲线区域中凹陷的区域,并且在向下凹陷的区域中低估它。以下是维基百科文章中展示系统错误的示例图片:

Trapezoidal rule illustration

图片来自Intégration_num_trapèzes.svg:Scalerderivative work:Cdang(talk) - Intégration_num_trapèzes.svg,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=8541370

由于正态分布具有更多的凹陷区域(即两个尾部),因此总体估计值太高。如在另一个答案中所提到的,使用更高的分辨率(即增加N)有助于最小化误差。使用不同的数值积分方法(例如Simpson's rule)可能会得到更好的结果。

然而,没有数字积分方法可以给你一个确切的答案,即使有,但density的返回值只是实际分布的近似值。 (对于真实数据,真正的分布是未知的。)

如果您只想满足看到已知密度函数积分为1,那么您可以在常规密度函数上使用integrate

> integrate(dnorm, lower=-Inf, upper=Inf, mean=10, sd=2)
1 with absolute error < 4.9e-06