我正在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
我们可以通过ID
和sapply()
来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