R语言 应用计算每例受试者AUC的函数

rqdpfwrv  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(125)

我想计算许多受试者(约200例受试者)的浓度-时间曲线的曲线下面积(AUC)。我正在使用包MESS,其中:

AUC = auc(data$TIME,data$CONC, type = "spline")

如何将其应用于数据集中的每个唯一ID?并通过在原始数据集中添加新的“AUC”列来保留R中的结果?
数据包含以下列:

ID TIME CONC 
1   0    0
1   2    4
1   3    7
2   0    0
2   1    NA
2   3    5
2   4    10
rkttyhzu

rkttyhzu1#

一种方法是使用summarise()

library(MESS)
library(dplyr)

foo = read.table(text = "ID TIME CONC 
1   0    0
1   2    4
1   3    7
2   0    0
2   1    NA
2   3    5
2   4    10", header=T)

foo %>%
    group_by(ID) %>%
    summarize(AUC = auc(TIME,CONC, type = "spline"), .groups="keep")

#  ID      AUC
#1  1  9.12500
#2  2 12.08335

如果你想保留原始数据集中的所有列,你可以使用mutate()

foo %>%
    group_by(ID) %>%
    mutate(AUC = auc(TIME, CONC, type = "spline"))

#  ID TIME CONC      AUC
#1  1    0    0  9.12500
#2  1    2    4  9.12500
#3  1    3    7  9.12500
#4  2    0    0 12.08335
#5  2    1   NA 12.08335
#6  2    3    5 12.08335
#7  2    4   10 12.08335
lymnna71

lymnna712#

在我看来,@jazzurro提供的dplyr解决方案是一条可行之路,但这里有一个base方法。

d <- read.table(text='ID TIME CONC 
1   0    0
1   2    4
1   3    7
2   0    0
2   1    NA
2   3    5
2   4    10', header=TRUE)

library(MESS)   
auc <- t(sapply(split(d, d$ID), function(x) {
  data.frame(ID=x$ID[1], auc=auc(x$TIME, x$CONC, type='spline'))
}))

merge(d, auc)

#   ID TIME CONC      auc
# 1  1    0    0    9.125
# 2  1    2    4    9.125
# 3  1    3    7    9.125
# 4  2    0    0 12.08335
# 5  2    1   NA 12.08335
# 6  2    3    5 12.08335
# 7  2    4   10 12.08335

相关问题