有没有办法计算每个 id 主题的曲线下增量面积?

Is there a way to calculate incremental area under the curve for each id subject?

我在 R 中工作,我正在尝试为每个受试者 ID (ID) 生成一个 data.frame,其中葡萄糖值曲线下的增量区域高于基线。特别是我的数据集是这样的:

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 met\n"))
        }
    }
    return(list(auc=sum(auc), segments=auc, seg.type=seg.type))
}

不过,这个函数returns只有整个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() 您的专用函数 auc.fn 对每个拆分块 split() 数据集:

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