计算R中矩阵中的列下的曲线下面积

时间:2015-06-18 02:54:42

标签: r

我想计算一组受试者在多种浓度下测量的几个特征的曲线下面积。 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

任何建议都将不胜感激!

1 个答案:

答案 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)))