r-是否有方法计算每个id受试者的曲线下增量面积



我正在R中工作,我正在尝试为每个受试者id生成一个数据帧,该帧具有高于基线的葡萄糖值曲线下的增量区域。特别是我的数据集是这样的:

ID  glucose Time
101 100     0
102 70      0
103 60      0
101 50      0.5
102 85      0.5
103 70      0.5
101 55      1
102 69      1
103 96      1

我正在使用Brouns等人(2005(的函数:

auc.fn <- function(x,y) {
auc <- ifelse(y[2] > y[1], (y[2]-y[1])*(x[2]-x[1])/2, 0)
seg.type <- 0
for (i in 3:length(x)) {
if (y[i] >= y[1] & y[i-1] >= y[1]) {
auc[i-1] <- (((y[i]-y[1])/2) + (y[i-1]-y[1])/2) * (x[i]-x[i-1])/2
seg.type[i-1] <- 1
} else if (y[i] >= y[1] & y[i-1] < y[1]) {
auc[i-1] <- ((y[i]-y[1])^2/(y[i]-y[i-1])) * (x[i]-x[i-1])/2
seg.type[i-1] <- 2
} else if (y[i] < y[1] & y[i-1] >= y[1]) {
auc[i-1] <- ((y[i-1]-y[1])^2/(y[i-1]-y[i])) * (x[i]-x[i-1])/2
seg.type[i-1] <- 3
} else if (y[i] < y[1] & y[i-1] < y[1]) {
auc[i-1] <- 0
seg.type[i-1] <- 4
} else {
# The above cases are exhaustive, so this should never happpen
return(cat("i:", i, "Error: No condition metn"))
}
}
return(list(auc=sum(auc), segments=auc, seg.type=seg.type))
}

但是,此函数仅返回整个AUC值。如何更改函数以使每个id受试者都有AUC值?非常感谢

这是一个base解决方案,由管道操作员%>%(最初来自magrittr(进行清理。

给定数据集my_dataset

my_dataset <- structure(list(ID = c(101, 102, 103, 101, 102, 103, 101, 102, 103),
glucose = c(100, 70, 60, 50, 85, 70, 55, 69, 96),
Time = c(0, 0, 0, 0.5, 0.5, 0.5, 1, 1, 1)),
row.names = c(NA, -9L), class = "data.frame")

就像你提供的样品一样

ID glucose Time
1 101     100  0.0
2 102      70  0.0
3 103      60  0.0
4 101      50  0.5
5 102      85  0.5
6 103      70  0.5
7 101      55  1.0
8 102      69  1.0
9 103      96  1.0 

我们可以通过IDsapply()split()数据集——你的专用函数auc.fn到每个分割块:

library(magrittr)
# ...
# Code to define the function 'auc.fn()' and to generate your dataset 'my_dataset'.
# ...
results <- my_dataset %>%
split(.$ID) %>%
sapply(FUN = function(df){auc.fn(x = df$Time, y = df$glucose)}, simplify = FALSE)

这为results生成以下list,由ID:命名

$`101`
$`101`$auc
[1] 0
$`101`$segments
[1] 0 0
$`101`$seg.type
[1] 0 4

$`102`
$`102`$auc
[1] 7.265625
$`102`$segments
[1] 3.750000 3.515625
$`102`$seg.type
[1] 0 3

$`103`
$`103`$auc
[1] 8.25
$`103`$segments
[1] 2.50 5.75
$`103`$seg.type
[1] 0 1

如果您只想每个ID的AUC,只需将最后一行替换为

sapply(FUN = function(df){auc.fn(x = df$Time, y = df$glucose)$auc}, simplify = TRUE)

results获取此命名矢量:

101      102      103 
0.000000 7.265625 8.250000 

相关内容

  • 没有找到相关文章

最新更新