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

使用survcomp和boot包无法获取D index的95%CI求助

问题原因与修复方案

嘿,咱们来理清你遇到的问题:为什么用boot包计算D-index的95%CI时,偏差和标准误都是0?核心问题出在你定义的bootstrap统计量函数上,没有正确利用抽样索引选取子集数据,导致每次迭代都在计算原始数据集的D-index,结果当然完全一致啦。

具体问题出在哪?

看你写的boot_Dindex函数:

boot_Dindex <- function(x, surv.time, surv.event, data, indices){
 d <- data[indices,]
 Dindex <- D.index(x=x, surv.time=surv.time, surv.event=surv.event)
 return(Dindex$d.index)
}

你虽然用d <- data[indices,]拿到了bootstrap抽样后的子集,但后面计算D.index时,根本没用到这个子集里的变量!而是直接用了外部传入的x、surv.time、surv.event——也就是整个原始数据集的变量。这就导致不管bootstrap抽多少次,每次算的都是同一个原始D-index值,所有重复结果完全相同,标准差自然是0,偏差也为0(因为所有bootstrap估计值都等于原始值)。

另外,你的数据框定义还有个小bug:df <- data.frame(age, size, stime, sevent, cens),但前面模拟数据里根本没生成size变量,这会直接报错,不过这不是导致bootstrap结果异常的主因。

修正后的完整代码

第一步:重新定义统计量函数

把函数改成从bootstrap子集中提取变量计算,参数也更贴合boot包的规范:

boot_Dindex <- function(data, indices){
  # 取出本次bootstrap抽样的子集
  d_sub <- data[indices, ]
  # 用子集数据计算D-index
  d_result <- D.index(x = d_sub$age, 
                      surv.time = d_sub$stime, 
                      surv.event = d_sub$sevent)
  return(d_result$d.index)
}

第二步:正确调用boot函数

先修正数据框(去掉不存在的size),再运行bootstrap:

# 修正数据框定义
df <- data.frame(age, stime, sevent, cens)

set.seed(1234)
results <- boot(data = df, 
                statistic = boot_Dindex, 
                R = 1000)
print(results)

这样调整后,每次bootstrap迭代都会基于抽样后的子集计算D-index,结果会有差异,就能得到正常的偏差和标准误了。之后你还可以用boot.ci(results)来直接计算95%置信区间。

另外提一句:你提供的输出里提到的small_intestine_2004、nomogram这些变量和前面的模拟数据不匹配,应该是实际运行时用了别的数据集,但核心问题还是统计量函数没正确使用bootstrap子集。

内容的提问来源于stack exchange,提问作者QW Zhang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:48