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

3
我希望计算一组受试者多种特征在多种浓度下曲线下面积。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矩阵/数据框(列):
rowname    feature1    feature2    feature3
ccr01      52338.61    300823.6    388368.2
ccr02      12914.41    91486.32    84316.82

任何建议将不胜感激!
1个回答

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

你的数据是矩阵吗?如果是,你可以将 names(x) 改为 colnames(x) 或者像你所做的那样使用索引。出现了什么错误?ddply 无法在矩阵上工作,如果你想使用 plyr 的解决方案,你可以使用 as.data.frame 将其转换为 data.frame - Rorschach
谢谢,LegalizeIt!如果我将fs重新定义为3:ncol(x),那么使用sapply的AUC函数就可以正常工作。然而,当我尝试使用ddply时,我一直收到以下错误:错误:'names'属性[10]必须与向量[5]的长度相同。在这个玩具示例中,我有2个ID,5个conc和总共10行。.(id)是什么意思? - user2880691
抱歉,我正在安装支持plyr的软件包。我的玩具数据是一个df,但是我有行名称而不是编号行。这会有影响吗? - user2880691
不,行名并不重要。.(id)只是该函数的语法,它的意思是“按id分组”。 - Rorschach
1
如果您在原始帖子中转储了 dput(head(yourData,10)) 的输出,则我可以使用您的实际数据进行测试。 - Rorschach
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接