如何从geom_density / stat_density显示AUC的值

时间:2013-11-01 19:42:57

标签: r ggplot2 kernel-density auc

我使用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,我猜)似乎可能是一个问题,特别是如果不同的密度曲线使用不同的间隔。

1 个答案:

答案 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)时,如果可以进行实际积分,则非常接近于得到的结果。