You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何比较非嵌套Cox回归模型的C统计量?DeLong检验失效

非嵌套Cox回归模型C统计量的比较方法

针对你遇到的DeLong检验失效问题,这里提供几种可靠的R语言实现方案,用于比较非嵌套Cox模型的C统计量(一致性指数):

方法1:Bootstrap重抽样检验

这是最通用的非嵌套模型比较方法,通过重复抽样估计C统计量差值的分布,判断差异是否显著:

  1. 先拟合你的三个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)
  1. 编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:35:23