Как показать значение AUC из geom_density/stat_density

Я создал несколько графиков плотности, используя 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) может быть проблемой, особенно если разные кривые плотности используют разные интервалы.


person Jota    schedule 01.11.2013    source источник


Ответы (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 в вашем коде), вы очень близки к тому, что получили бы, если бы могли выполнить фактический интеграл.

person Christopher Louden    schedule 01.11.2013