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

各治疗组UnoC(C-index)计算及变量-治疗交互作用疑问

问题分析与解决方案

首先直接回应你的核心疑问:如果X4与TRT的强交互确实表现为「X4仅在实验组(TRT=1)中对生存有预测能力,在对照组(TRT=0)中完全不影响生存」,那么对照组的C-index应该接近0.5,实验组的C-index会显著更高。你当前得到两组结果相近的问题,主要出在模型设定和数据拆分的逻辑上,下面具体拆解并修正:

你当前代码的关键问题

  1. 未纳入交互项的模型设定错误
    你只拟合了coxph(Surv(time, stat) ~ X4, data=TR),完全忽略了X4与TRT的交互作用。这种模型估计的是X4在整个训练集上的平均效应,不管TRT分组,自然会导致两组的预测值都带有X4的平均预测能力,最终C-index都偏高且接近。

  2. 不合理的数据集硬拆分
    你直接把前500行作为训练集、后500行作为测试集,这种做法无法保证训练集和测试集的TRT分布均衡。如果两组的TRT比例差异大,模型拟合的效应会偏向占比高的组别,进一步干扰结果。

  3. 无意义的-lpnew操作
    对照组的C-index如果接近0.5,说明X4没有预测能力,不管取线性预测值的正负,结果都应该接近0.5,你这里的取反操作完全没必要,反而容易混淆逻辑。

修正后的代码与步骤

第一步:合理拆分训练/测试集

先随机拆分数据集,保证两组的TRT分布均衡:

set.seed(123) # 固定随机种子保证可复现
train_idx <- sample(nrow(data), 500)
train_data <- data[train_idx, ]
test_data <- data[-train_idx, ]

第二步:方法1 - 拟合包含交互项的全局模型

因为你的核心是X4与TRT的交互,全局模型可以同时捕捉两组中X4的不同效应:

# 拟合带交互项的Cox模型
fit_interact <- coxph(Surv(time, stat) ~ X4 * TRT, data = train_data)

# 拆分测试集的对照组和实验组
test_ctrl <- test_data[test_data$TRT == 0, ]
test_trt <- test_data[test_data$TRT == 1, ]

# 分别预测两组的线性预测值
lp_ctrl <- predict(fit_interact, newdata = test_ctrl)
lp_trt <- predict(fit_interact, newdata = test_trt)

# 计算对照组UnoC(预期≈0.5)
UnoC(Surv.rsp = Surv(train_data$time[train_data$TRT == 0], train_data$stat[train_data$TRT == 0]),
     Surv.rsp.new = Surv(test_ctrl$time, test_ctrl$stat),
     lpnew = lp_ctrl)

# 计算实验组UnoC(预期显著高于0.5)
UnoC(Surv.rsp = Surv(train_data$time[train_data$TRT == 1], train_data$stat[train_data$TRT == 1]),
     Surv.rsp.new = Surv(test_trt$time, test_trt$stat),
     lpnew = lp_trt)

第二步:方法2 - 分组单独拟合模型

如果交互作用极强,两组的X4效应完全独立,也可以在每个TRT组内单独拟合模型:

# 对照组单独拟合(X4无效应,C-index≈0.5)
fit_ctrl <- coxph(Surv(time, stat) ~ X4, data = train_data[train_data$TRT == 0, ])
lp_ctrl <- predict(fit_ctrl, newdata = test_ctrl)
UnoC(Surv.rsp = Surv(train_data$time[train_data$TRT == 0], train_data$stat[train_data$TRT == 0]),
     Surv.rsp.new = Surv(test_ctrl$time, test_ctrl$stat),
     lpnew = lp_ctrl)

# 实验组单独拟合(X4强效应,C-index显著更高)
fit_trt <- coxph(Surv(time, stat) ~ X4, data = train_data[train_data$TRT == 1, ])
lp_trt <- predict(fit_trt, newdata = test_trt)
UnoC(Surv.rsp = Surv(train_data$time[train_data$TRT == 1], train_data$stat[train_data$TRT == 1]),
     Surv.rsp.new = Surv(test_trt$time, test_trt$stat),
     lpnew = lp_trt)

额外说明

因为你的数据集没有删失,UnoC的结果和普通的C-index(比如survival包的concordance())应该完全一致,你可以用后者交叉验证结果,减少计算复杂度。

内容的提问来源于stack exchange,提问作者Ph.D.Student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:37:29