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

如何在survfit()中实现basehaz()的centered=FALSE功能?

实现survfit()模拟basehaz(centered=FALSE)的基准风险计算

要在survfit()里实现basehaz(centered=FALSE)的逻辑,核心是理解两者的本质差异:

  • basehaz(centered=FALSE)返回的是所有协变量线性预测项为0时的累积基准风险(即当所有连续变量取0、分类变量取参考水平时的累积风险)
  • 默认的survfit.coxph()会用协变量的均值(或模型拟合时的平均水平)计算生存曲线,对应的是basehaz(centered=TRUE)的基准风险逻辑

下面是具体的实现步骤,包含代码示例和注意事项:

步骤1:拟合Cox模型

先正常拟合你的Cox比例风险模型,比如用内置的lung数据集:

library(survival)
# 拟合模型:年龄+性别作为协变量
cox_model <- coxph(Surv(time, status) ~ age + sex, data = lung)

步骤2:构造"协变量全为0"的新数据集

这里的"0"是指线性预测项为0,需要区分变量类型:

  • 连续变量:直接设为0
  • 分类变量(因子):设为模型中的参考水平(因为参考水平对应的虚拟变量编码为0,不会贡献线性预测值)

比如上面的模型中,sex是因子,参考水平为1(男性),所以构造的新数据集应该是:

# 构造线性预测项为0的数据集
newdata_zero <- data.frame(
  age = 0,          # 连续变量设为0
  sex = 1           # 分类变量设为参考水平
)

步骤3:用survfit()计算对应累积风险

将构造好的newdata_zero传入survfit(),就能得到对应centered=FALSE的基准风险生存曲线,再通过生存概率转换为累积风险:

# 计算生存曲线
surv_obj <- survfit(cox_model, newdata = newdata_zero)

# 提取累积风险:累积风险H(t) = -log(生存概率S(t))
cum_hazard_zero <- -log(surv_obj$surv)

验证结果一致性

你可以对比basehaz(centered=FALSE)的结果,确认两者是否一致:

# 用basehaz得到centered=FALSE的累积风险
bh_zero <- basehaz(cox_model, centered = FALSE)

# 对比前5个值(计算精度差异会导致微小误差)
cbind(basehaz = bh_zero$hazard, survfit = cum_hazard_zero[1:nrow(bh_zero)])

注意事项

  • 如果你的模型包含交互项或多项式项,构造newdata_zero时需要确保所有项的线性预测值为0(比如多项式项age^2也要设为0,即age=0)
  • 若使用非默认的变量编码(如contr.sum),需要调整分类变量的取值,确保线性预测项为0
  • survfit()的优势在于可以同时计算多个协变量组合的风险曲线,比basehaz()更灵活

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:44:59