竞争风险场景下coxph.predict设type="expected"传newdata报错
问题描述
我在竞争风险场景(即每个观测对应一个终点、存在多种事件类型)下使用Cox比例风险模型(survival::coxph),希望调用预测函数基于给定的协变量与随访时间估计预期事件数,但遇到运行报错。以下是基于survival包内置mgus2数据集的复现代码:
library(survival) # 修改数据,每个受试者仅转移到一个终点状态 crdata <- mgus2 crdata$etime <- pmin(crdata$ptime, crdata$futime) crdata$event <- ifelse(crdata$pstat==1, 1, 2*crdata$death) crdata$event <- factor(crdata$event, 0:2, c("censor", "PCM", "death")) cfit <- coxph(Surv(etime, event) ~ I(age/10) + sex + mspike, id = id, crdata)
完成模型拟合后,构造newdata数据框传入预测函数时,R持续抛出错误,先后尝试三种构造newdata的方式均失败:
- 手动构造包含随访时间和协变量的数据框,触发数据规模不匹配报错:
# 同时传入随访时间和协变量 nd=data.frame(etime=81 ,sex= "M", age=60, mspike=1.2) predict(cfit, newdata=nd ,type="expected") > Data is not the same size as it was in the original fit
- 使用
model.frame提取模型拟合时所用的数据框作为预测输入,仍然出现相同报错:
nd=model.frame(cfit) predict(cfit,newdata=nd,type="expected") > Data is not the same size as it was in the original fit
- 直接取原始数据集的第一行作为预测输入,依旧触发相同错误:
nd=crdata[1,] predict(cfit,newdata=nd,type="expected") > Data is not the same size as it was in the original fit
报错核心原因
- 你拟合的是竞争风险多状态Cox模型,这类模型的
type="expected"输出是指定时间点的累积预期事件数,结果随时间变化,必须显式指定预测时间点,不能使用默认参数逻辑。 - 错误将随访时间
etime放入了newdata:newdata仅需要传入模型公式右侧的协变量(年龄、性别、mspike),预测用的时间点需要单独传给times参数。 - 未指定
times时,函数默认会返回和原训练集行数一一对应、匹配原训练集每个个体随访时间的预测值,只要传入的newdata行数和原训练集不一致,就会触发数据规模不匹配报错——哪怕传入原数据的单行子集,行数不匹配一样报错。
正确调用方法
- 构造
newdata时仅保留模型需要的协变量,不需要加入时间、结局列 - 调用
predict时通过times参数指定要计算预期事件数的随访时间点
示例代码:
# newdata仅传入协变量 nd <- data.frame(sex= "M", age=60, mspike=1.2) # 指定预测时间点为81 predict(cfit, newdata = nd, type = "expected", times = 81)
运行后会返回该协变量特征的个体,在随访时间81时,两个终点事件(PCM、death)分别的累积预期发生数。
如果需要同时计算多个时间点的预期值,直接给
times传入时间向量即可,例如times = c(30, 60, 81)
内容的提问来源于stack exchange,提问作者Nick O
相关产品推荐
相关产品推荐

