如何比较非嵌套Cox回归模型的C统计量?DeLong检验失效
非嵌套Cox回归模型C统计量的比较方法
针对你遇到的DeLong检验失效问题,这里提供几种可靠的R语言实现方案,用于比较非嵌套Cox模型的C统计量(一致性指数):
方法1:Bootstrap重抽样检验
这是最通用的非嵌套模型比较方法,通过重复抽样估计C统计量差值的分布,判断差异是否显著:
- 先拟合你的三个Cox模型:
library(survival) # 替换为你的实际模型变量 model1 <- coxph(Surv(daysprim, prim_outcome1) ~ variable1, data = DB) model2 <- coxph(Surv(daysprim, prim_outcome1) ~ variable1 + variable2, data = DB) model3 <- coxph(Surv(daysprim, prim_outcome1) ~ variable1 + variable2 + variable3, data = DB)
- 编写bootstrap抽样函数,计算两个模型的C统计量差值:
library(boot) # 定义函数:输入bootstrap样本,返回两个模型的C统计量差值 c_stat_diff <- function(data, indices, model_a, model_b) { boot_data <- data[indices, ] # 更新模型到bootstrap样本 fit_a <- update(model_a, data = boot_data) fit_b <- update(model_b, data = boot_data) # 提取C统计量 c_a <- concordance(fit_a)$concordance c_b <- concordance(fit_b)$concordance return(c_a - c_b) } # 比较model1和model2,1000次抽样 boot_res_12 <- boot(data = DB, statistic = c_stat_diff, R = 1000, model_a = model1, model_b = model2) # 输出95%BCA置信区间,若区间不包含0则差异有统计学意义 boot.ci(boot_res_12, type = "bca") # 同理比较其他模型对 boot_res_23 <- boot(data = DB, statistic = c_stat_diff, R = 1000, model_a = model2, model_b = model3) boot.ci(boot_res_23, type = "bca")
方法2:使用rms包的专用函数
rms包的cph函数(Cox比例风险模型的增强版)支持直接比较非嵌套模型的预测性能:
library(rms) # 用cph拟合模型,需指定surv=TRUE以支持后续预测性能评估 cph1 <- cph(Surv(daysprim, prim_outcome1) ~ variable1, data = DB, surv = TRUE) cph2 <- cph(Surv(daysprim, prim_outcome1) ~ variable1 + variable2, data = DB, surv = TRUE) cph3 <- cph(Surv(daysprim, prim_outcome1) ~ variable1 + variable2 + variable3, data = DB, surv = TRUE) # 比较两个模型的预测能力差异,结果包含C统计量的检验 anova(cph1, cph2)
注:
anova.cph对非嵌套模型会采用重抽样方法检验预测性能差异,输出中关注与“C-index”相关的检验项即可。
方法3:修复DeLong检验的使用问题
如果DeLong检验失效,大概率是因为常规实现未适配生存数据的删失特性。可以用survivalROC包生成生存ROC曲线,再结合pROC包的DeLong检验:
library(survivalROC) library(pROC) # 提取每个模型的线性预测值 lp1 <- predict(model1, type = "lp") lp2 <- predict(model2, type = "lp") # 选择一个预测时间点(比如中位生存时间)生成生存ROC pred_time <- median(DB$daysprim) roc1 <- survivalROC(Stime = DB$daysprim, status = DB$prim_outcome1, marker = lp1, predict.time = pred_time, method = "KM") roc2 <- survivalROC(Stime = DB$daysprim, status = DB$prim_outcome1, marker = lp2, predict.time = pred_time, method = "KM") # 转换为pROC可用的对象,执行DeLong检验 roc_obj1 <- roc(roc1$status, roc1$marker, direction = "<") roc_obj2 <- roc(roc2$status, roc2$marker, direction = "<") roc.test(roc_obj1, roc_obj2, method = "delong")
注:此方法需指定预测时间点,若你的研究无特定时间点需求,bootstrap法更灵活。
关键提示
- 非嵌套模型绝对不能用传统似然比检验,必须用重抽样或预测性能专用检验。
- Bootstrap抽样次数建议≥1000次,次数越多结果越稳定。
rms包的cph相比基础coxph,在预测模型评估、比较上功能更完善,推荐优先使用。
内容的提问来源于stack exchange,提问作者Kees van Bergeijk
相关产品推荐
相关产品推荐

