有没有办法计算每个 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
我们可以通过 ID
和 sapply()
您的专用函数 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
我在 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
我们可以通过 ID
和 sapply()
您的专用函数 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