我有两条密度曲线:
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。有任何想法吗?
答案 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进行平均,并以数据为中心。