2013-11-01 22 views
0

我已經使用ggplot2和stat_density生成了一些密度圖。我的同事提到他不相信每條曲線下的面積總和爲1.因此,我着手計算曲線下方的面積,我想知道是否有比我更好的方法。如何顯示來自geom_density/stat_density的AUC值

這裏是什麼,我做了一個例子:

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

你的方式已經很好。

另一種方法是使用梯形規則做:

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),如果你可以做實際的積分,你將會非常接近你會得到的結果。