用梯形法则求R中的曲线下面积(AUC)

时间:2014-07-17 21:10:58

标签: r list dataframe

我有一个下面提到的包含数据框的样本列表(每个都有...... ID,yobs,x(自变量))。我想为每个案例(ID)找到AUC(梯形规则).., 所以我的输出(主数据框)看起来如下(最后显示)

任何人都可以建议找到这个的有效方法(每个ID都有很多行)

谢谢

#Some Make up code for only one data frame
Y1=c(0,2,5,7,9)
Y2=c(0,1,3,8,11)
Y3=c(0,4,8,9,12,14,18) 
t1=c(0:4)
t2=c(0:4)
t3=c(0:6) 

a1=data.frame(ID=1,y=Y1,x=t1) 
a2=data.frame(ID=2,y=Y2,x=t2) 
a3=data.frame(ID=3,y=Y3,x=t3) 
data=rbind(a1,a2,a3) 

#dataA(Just to show)
   ID  obs time 
1   1  0   0 
2   1  2   1 
3   1  5   2 
4   1  7   3 
5   1  9   4 
6   2  0   0 
7   2  1   1 
8   2  3   2 
9   2  8   3 
10  2 11   4 
11  3  0   0 
12  3  4   1 
13  3  8   2 
14  3  9   3 
15  3 12   4 
16  3 14   5 
17  3 18   6 

 #dataB(Just to show)
   ID  obs time 
1   1  0   0 
2   1  2   1 
3   1  5   2 
4   1  7   3 
5   1  9   4 
6   2  0   0 
7   2  1   1 
8   2  3   2 

  #dataC(Just to show)
   ID  obs time 
1   1  0   0 
2   1  2   1 
3   1  5   2 
4   1  7   3 
5   1  9   4 
6   2  0   0 
7   2  1   1 
8   2  3   2 

##Desired output

      ID  AUC
dataA  1   XX
dataA  2   XX
dataA  3   XX
dataB  1   XX
dataB  2   XX
dataC  1   XX
dataC  2   XX

2 个答案:

答案 0 :(得分:2)

以下是另外两种方式。第一个对由点之间的线性插值定义的函数使用integrate(...)。第二个使用@nrussel评论中描述的trapz(...)函数。

f <- function(x,df) approxfun(df)(x)
sapply(split(data,data$ID),function(df)c(integrate(f,min(df$x),max(df$x),df[3:2])$value))
#    1    2    3 
# 18.5 17.5 56.0 

library(caTools)
sapply(split(data,data$ID),function(df) trapz(df$x,df$y))
#    1    2    3 
# 18.5 17.5 56.0 

答案 1 :(得分:1)

我猜这样的事情会起作用

calcauc<-function(data) {
    psum<-function(x) rowSums(embed(x,2))
    stack(lapply(split(data, data$ID), function(z) 
        with(z, sum(psum(y) * diff(x)/ 2)))
    )
}
calcauc(data)

#   values ind
# 1   18.5   1
# 2   17.5   2
# 3   56.0   3

当然,对于ROC曲线,正常xy值介于0和1之间,这就是为什么我们似乎有如此大的&#34; AUC&#34;值,但实际上这只是由数据集中的点定义的线下面的多边形区域。

psum函数只是一个辅助函数来计算成对总和(在梯形区域的公式中很有用)。

基本上我们使用split()一次查看一个ID,然后我们计算每个ID的区域,然后我们使用stack()将所有内容重新放回一个data.frame。