【问题标题】:calculate area under the curve over columns in matrix in R计算R中矩阵中列的曲线下面积
【发布时间】:2015-09-03 12:34:37
【问题描述】:

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

任何建议将不胜感激!

【问题讨论】:

    标签: r


    【解决方案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)))
    

    【讨论】:

    • 谢谢,LegalizeIt。如果我将 fs 重新定义为 3:ncol(x),则带有 sapply 的 AUC 函数可以正常工作。但是,当我尝试使用 ddply 时,我不断收到以下错误:
    • 您的数据是矩阵吗?在这种情况下,您可以将 names(x) 更改为 colnames(x) 或照常使用索引。什么错误? ddply 不适用于矩阵,如果您想使用plyr 解决方案,可以将其转换为data.frame,使用as.data.frame
    • 谢谢,LegalizeIt!如果我将 fs 重新定义为 3:ncol(x),则带有 sapply 的 AUC 函数可以正常工作。但是,当我尝试使用 ddply 时,我不断收到以下错误:错误:'names' 属性 [10] 必须与向量 [5] 的长度相同 在这个玩具示例中,我有 2 个 ID、5 个 conc 和一个一共10行。 .(id) 有什么作用?
    • 很抱歉。我正在安装支持 plyr 的软件包。我的玩具数据是 df,但我确实有行名而不是​​编号行。这会有所作为吗?
    • 如果您在原始帖子中转储 dput(head(yourData, 10)) 的输出,我可以使用您的实际数据进行测试。
    猜你喜欢
    • 2022-01-23
    • 2011-06-24
    • 1970-01-01
    • 2014-09-21
    • 2021-06-08
    • 2021-10-24
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多