4

我用这个绘制了两条密度曲线:

Network <- Mydf$Networks
quartiles <-  quantile(Mydf$Avg.Position,  probs=c(25,50,75)/100)
density <- ggplot(Mydf, aes(x = Avg.Position, fill = Network))
d <- density + geom_density(alpha = 0.2) + xlim(1,11) + opts(title = "September 2010") + geom_vline(xintercept = quartiles, colour = "red")
print(d)

我想计算给定 Avg.Position 范围的每条曲线下的面积。有点像正常曲线的 pnorm 。有任何想法吗?

4

2 回答 2

10

分别计算密度并绘制一个开始。然后你可以使用基本的算术来得到估计。通过将一组小正方形的面积相加来近似积分。我使用平均方法。长度是两个 x 值之间的差,高度是间隔开始和结束时 y 值的平均值。我在 zoo 包中使用 rollmeans 函数,但这也可以使用 base 包来完成。

require(zoo)

X <- rnorm(100)
# calculate the density and check the plot
Y <- density(X) # see ?density for parameters
plot(Y$x,Y$y, type="l") #can use ggplot for this too
# set an Avg.position value
Avg.pos <- 1

# construct lengths and heights
xt <- diff(Y$x[Y$x<Avg.pos])
yt <- rollmean(Y$y[Y$x<Avg.pos],2)
# This gives you the area
sum(xt*yt)

这为您提供了一个很好的近似值,小数点后面最多 3 位数字。如果你知道密度函数,看看?integrate

于 2010-10-06T21:38:27.187 回答
4

三种可能:

logspline 包提供了另一种估计密度曲线的方法,但它确实包含结果的 pnorm 样式函数。

您还可以通过将密度函数返回的 x 和 y 变量输入到 approxfun 函数并将结果与​​积分函数一起使用来近似该区域。除非您对小尾部区域(或非常小的间隔)的精确估计感兴趣,否则这可能会给出合理的近似值。

密度估计只是以数据为中心的内核的总和,其中一个内核就是正态分布。您可以平均来自 pnorm(或其他内核)的区域,其中 sd 由带宽定义并以您的数据为中心。

于 2010-10-06T20:15:19.503 回答