计算AUDPC值时遇'time_intervals'参数缺失错误的技术求助
问题:调用AUDPC函数提示参数缺失,但参数实际存在
我尝试基于随时间变化的病害数据计算AUDPC值,调用自定义audpc函数时提示参数"time_intervals"缺失,但打印该参数时能看到其值。以下是我的R代码:
# 拆分日期行和表头行到两个独立数据框 date_row <- convertToDate(data[1, 4:ncol(data)]) header_row <- data[2, 1:13] colnames(data) <- c("", "", "", paste0("Day.", 1:length(date_row))) # 排除数据框的前两行 data_numeric <- data[-c(1:2), c(4:13)] data_numeric <- apply(data_numeric, 2, as.numeric) # 截取start_time和end_time以匹配data_numeric的长度 start_date <- as.Date(date_row[1], format="%d-%m-%Y") time_intervals <- difftime(as.Date(date_row[-1], format="%d-%m-%Y"), start_date, units="days") time_intervals <- as.numeric(time_intervals) # 转换start_date为日期对象 start_date <- as.Date(start_date, format = "%d/%m/%Y") # 转换end_date为字符向量 end_date <- as.character(end_date, format = "%Y-%m-%d") end_date <- start_date + days(time_intervals) print(time_intervals) # 计算AUPDC和StAUDPC audpc <- function(x, start_date, time_intervals) { auc <- 0 for (i in 2:length(x)) { auc <- auc + (time_intervals[i] - time_intervals[i-1]) * ((x[i-1] + x[i])/2) } return(auc) } aupdc_vec <- c(NA, NA, apply(data_numeric, 1, function(x) audpc(x, time_intervals))) # 将AUPDC和StAUDPC添加到数据框 data$AUPDC <- aupdc_vec
错误原因分析
- 参数传递不匹配:自定义
audpc函数定义了3个参数,但调用时只传了2个。R按位置匹配参数,此时time_intervals会被匹配到第二个参数start_date,第三个参数time_intervals因未传递而缺失。且函数内部完全没用到start_date,属于冗余参数。 - 时间间隔逻辑错误:当前
time_intervals计算的是各日期与起始日的天数差,而AUDPC需要的是相邻观测日的间隔天数。这种计算方式会导致循环时出现下标越界(x的长度比time_intervals多1,最后一次循环时time_intervals[i]不存在)。
解决步骤
1. 修正自定义函数
移除冗余的start_date参数,同时修正时间间隔的使用逻辑:
audpc <- function(x, time_intervals) { auc <- 0 # 循环对应n-1个时间间隔 for (i in 2:length(x)) { # time_intervals[i-1]是第i-1到第i个观测日的间隔天数 auc <- auc + time_intervals[i-1] * ((x[i-1] + x[i])/2) } return(auc) }
2. 修正时间间隔计算方式
计算相邻日期的间隔天数,确保长度与观测值的间隔数匹配:
# 将所有日期转换为Date对象 date_days <- as.Date(date_row, format = "%d-%m-%Y") # 计算相邻日期的天数差 time_intervals <- diff(date_days) time_intervals <- as.numeric(time_intervals)
3. 修正函数调用
现在函数仅需两个参数,调用时传递正确参数即可:
aupdc_vec <- c(NA, NA, apply(data_numeric, 1, function(x) audpc(x, time_intervals)))
4. 移除无用代码
原代码中end_date的转换逻辑混乱且未被使用,可直接删除:
# 删除以下代码 # end_date <- as.character(end_date, format = "%Y-%m-%d") # end_date <- start_date + days(time_intervals)
内容的提问来源于stack exchange,提问作者Kees Kooistra
相关产品推荐
相关产品推荐

