我有一个下面提到的包含数据框的样本列表(每个都有...... 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
答案 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曲线,正常x
和y
值介于0和1之间,这就是为什么我们似乎有如此大的&#34; AUC&#34;值,但实际上这只是由数据集中的点定义的线下面的多边形区域。
psum
函数只是一个辅助函数来计算成对总和(在梯形区域的公式中很有用)。
基本上我们使用split()
一次查看一个ID,然后我们计算每个ID的区域,然后我们使用stack()
将所有内容重新放回一个data.frame。