使用survIDINRI包计算NRI/IDI时报NA/NaN/Inf错误的解决求助
报错原因排查与解决方案
该报错本质是IDI.INF函数调用底层unoecdf计算时,传入的风险差值向量中存在NA、NaN或无穷大值,触发了C语言函数的参数校验规则,常见诱因及修复方法如下:
常见报错诱因
- 模型不符合嵌套要求:survIDINRI包计算IDI/NRI要求两个对比模型为嵌套结构,即新模型仅比旧模型新增待验证的目标变量,其余协变量完全一致。你当前构造的
covs0和covs1分别包含glst_new和lvef_low,两套协变量无嵌套关系,Cox模型拟合时会出现异常风险值,是最可能的报错原因。 - 输入数据存在异常值:生存时间存在负数、事件变量非0/1取值、协变量矩阵存在缺失值或无穷大值,都会导致模型预测风险异常。
- 样本量或事件数不足:你当前仅使用75例样本进行计算,若365天节点的终点事件发生数不足10例,Cox模型拟合会出现收敛失败,回归系数偏大甚至为NA,最终衍生出无穷大的风险差值。
修复步骤
- 修正协变量矩阵构造,保证模型嵌套:
若你的验证目标是判断glst_new能否在lvef_low的基础上提升预测效果,旧模型为包含lvef_low的基础模型,新模型为基础模型加glst_new,构造代码如下:
# indata固定为两列:第一列生存时间,第二列事件指示 indata <- mydata[, c("admission_fu_event", "cvdeath_vf_shock_chb_arr")] # 旧模型(基础模型)协变量:不含待验证的glst_new covs0 <- as.matrix(mydata[, c("age_ici", "sex___1", "lvef_low")]) # 新模型(拓展模型)协变量:旧模型基础上新增glst_new covs1 <- as.matrix(mydata[, c("age_ici", "sex___1", "lvef_low", "glst_new")])
- 排查数据异常值:
运行以下代码确认输入数据无异常:
# 检查生存时间无缺失、无负数 summary(mydata$admission_fu_event) # 检查事件变量仅含0和1,无缺失 table(mydata$cvdeath_vf_shock_chb_arr, useNA = "ifany") # 检查协变量矩阵无缺失、无无穷大值 sum(is.na(covs0), is.na(covs1), is.infinite(covs0), is.infinite(covs1))
- 验证模型收敛性:
单独拟合两个Cox模型,确认无收敛报错、回归系数无NA:
library(survival) # 拟合基础模型 cox_base <- coxph(Surv(admission_fu_event, cvdeath_vf_shock_chb_arr) ~ age_ici + sex___1 + lvef_low, data = mydata) # 拟合拓展模型 cox_ext <- coxph(Surv(admission_fu_event, cvdeath_vf_shock_chb_arr) ~ age_ici + sex___1 + lvef_low + glst_new, data = mydata) # 查看模型结果 summary(cox_base) summary(cox_ext)
- 若事件数不足,可适当降低
t0的取值(比如调整为180天),或扩大分析样本量,保证t0节点有足够的事件发生数。
内容的提问来源于stack exchange,提问作者quinaglia
相关产品推荐
相关产品推荐

