我找到了在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,对吗?
我找到了在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,对吗?
这就是微积分。使用更高的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
density
计算的点之间进行线性插值,然后计算这个近似原始函数的面积(即使用梯形法则来积分曲线),这意味着您会高估曲线凹向上的区域的面积,并低估凹向下的区域。以下是维基百科文章中演示系统误差的示例图像:
Image by 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
density
的返回值本身也只是对真实分布的近似。(对于真实数据,真实分布是未知的。)integrate
:> integrate(dnorm, lower=-Inf, upper=Inf, mean=10, sd=2)
1 with absolute error < 4.9e-06
1/(2*length(de$y))
。 - Ben Bolker