使用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

