我想计算一组受试者在多种浓度下测量的几个特征的曲线下面积。 MESS auc函数(在此描述:Calculate the Area under a Curve in R)给了我auc,但我无法将其应用于我的数据文件中所有主题的每个列(特征)。
我的数据基本上是这样组织的:
rowname id conc feature1 feature2 feature3 ...
s1 ccr01 5 18575 80337 100496
s2 ccr01 4 18161 65723 109037
s3 ccr01 3 18092 99807 105363
s4 ccr01 2 5196 71520 84113
s5 ccr01 1 3940 50236 77145
s6 ccr02 5 1878 21812 10306
s7 ccr02 4 3660 18437 13408
s8 ccr02 3 4439 28379 25899
s9 ccr02 2 2710 22960 28080
s10 ccr02 1 1970 23557 22409
.
.
.
我想返回由唯一主题ID(行)排序的功能AUC(列)的矩阵/ df:
rowname feature1 feature2 feature3
ccr01 52338.61 300823.6 388368.2
ccr02 12914.41 91486.32 84316.82
任何建议都将不胜感激!
答案 0 :(得分:1)
使用链接帖子和plyr
中的函数来获取函数ddply
,这可能有用(并且数据名为dat
)
library(zoo)
AUC <- function(x, fs)
sapply(fs, function(f) sum(diff(x$conc)*rollmean(x[,f],2)))
library(plyr)
ddply(dat, .(id), function(x) {
x <- x[order(x$conc),]
AUC(x, grep("feature", names(x), value=T))
})
# id feature1 feature2 feature3
# 1 ccr01 52706.5 302336.5 387333.5
# 2 ccr02 12733.0 92460.5 83744.5
此处,fs
是包含feature
字符串的列,因此它只会将AUC
函数应用于这些列,按id
分组。
dplyr
解决方案,
library(dplyr)
AUC <- function(x, fs)
setNames(as.data.frame(
lapply(fs, function(f) sum(diff(x$conc)*rollmean(x[,f], 2)))),
fs)
dat %>%
group_by(id) %>%
arrange(conc) %>%
do(AUC(., grep("feature", names(.), value=T)))