我使用ggplot2和stat_density制作了一些密度图。我的同事提到他并不相信每条曲线下的面积总和为1.因此,我开始计算曲线下的面积,我想知道是否有比我更好的方法。
以下是我所做的一个例子:
data(iris)
p<-ggplot(iris,aes(x=Petal.Length))+
stat_density(aes(colour=Species),geom="line",position="identity")
q<-print(p)
q<-q$data[[1]]
# calculate interval between density estimates for a given point.
# assume it is the same interval for all estimates
interval<-q$x[2]-q$x[1]
# calculate AUC by summing interval*height for the density estimate at each point
tapply(q$density*interval,
q$group,
sum)
结果:
1 2 3
0.9913514 1.0009785 0.9817040
它似乎运作得体,但我想知道是否有更好的方法来做到这一点。特别是,我对间隔的计算(即dx,我猜)似乎可能是一个问题,特别是如果不同的密度曲线使用不同的间隔。
答案 0 :(得分:1)
你的方式已经很好了。
另一种方法是使用梯形规则:
data <- cbind(q$x, q$y)
by(data, q$group, FUN = function(x) trapz(x[, 1], x[, 2]))
结果几乎相同:
INDICES: 1
[1] 0.9903457
INDICES: 2
[1] 1.000978
INDICES: 3
[1] 0.9811152
这是因为在使密度图形看起来合理所需的带宽(代码中为interval
)时,如果可以进行实际积分,则非常接近于得到的结果。