计算连续密度图下的面积

时间:2010-10-06 19:36:06

标签: r ggplot2 area curve

我有两条密度曲线:

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。有任何想法吗?

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

三种可能性:

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

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

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