如何编写支持可变协变量的生存分析tryCatch函数?
问题原因
你遇到的报错核心原因是:公式~右侧不能直接传入字符串拼接结果,R不会自动将字符串解析为公式的变量组合,而是会把paste0(preds, collapse="+")本身当做一个变量名在数据集里查找,匹配失败就抛出变量长度不一致的错误。
修正后的可用函数
函数会自动适配任意数量的输入协变量,正常运行时返回结构化的结果表,出现警告/错误时返回维度完全一致的NA表,方便批量合并20000次运行的结果:
library(survival) coxph.conv <- function(time_col = "time", status_col = "status", preds, data) { # 动态构建Cox模型公式 form <- reformulate(preds, response = paste0("Surv(", time_col, ", ", status_col, ")")) # 定义异常返回结构:和正常输出维度完全匹配的NA表 get_na_output <- function(preds) { data.frame( var = preds, coef = NA_real_, hr = NA_real_, se = NA_real_, z = NA_real_, p_value = NA_real_, row.names = NULL ) } # 捕获所有运行错误和警告 tryCatch({ fit <- coxph(form, data = data, x = TRUE) sum_fit <- summary(fit) # 整理正常运行的结果表 res <- data.frame( var = rownames(sum_fit$coefficients), coef = sum_fit$coefficients[,1], hr = sum_fit$coefficients[,2], se = sum_fit$coefficients[,3], z = sum_fit$coefficients[,4], p_value = sum_fit$coefficients[,5], row.names = NULL ) return(res) }, warning = function(w) { # 完美分离等警告场景返回NA表 return(get_na_output(preds)) }, error = function(e) { # 其他运行错误场景返回NA表 return(get_na_output(preds)) }) }
使用示例
# 构造测试数据集 cox_df <- data.frame( time = c(134, 324, 93, 23), status = c(0, 0, 1, 1), A = c(4, 32, 4, 65), B = c(5, 3, 23, 9), C = c(12, 2, 54, 3) ) # 正常场景调用:传入3个协变量,返回3行结果 results_normal <- coxph.conv(preds = c("A", "B", "C"), data = cox_df) # 异常场景调用:出现完美分离/报错时,返回同样3行的NA表
注意事项
如果你的数据集时间、状态列名不是默认的time和status,调用时传入对应的参数即可,比如列名为os_time和os_status时,调用写法为:
results <- coxph.conv(time_col = "os_time", status_col = "os_status", preds = c("A","B"), data = cox_df)
内容的提问来源于stack exchange,提问作者JVDeasyas123
相关产品推荐
相关产品推荐

