0

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

4

1 回答 1

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在您的代码中),如果您可以进行实际积分,您将非常接近您将获得的结果。

于 2013-11-01T19:57:51.593 回答