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

竞争风险场景下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行数和原训练集不一致,就会触发数据规模不匹配报错——哪怕传入原数据的单行子集,行数不匹配一样报错。
正确调用方法
  1. 构造newdata时仅保留模型需要的协变量,不需要加入时间、结局列
  2. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:27:20