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

ggsurvplot搭配coxph/survfit模型报错及生存曲线显示异常问题

ggsurvplot绘制分组生存曲线报错及单曲线异常修复方案

问题根因

  • 直接调用survfit时触发invalid formula报错:公式外层多包裹了一层括号,破坏了R公式的标准结构,导致函数无法识别为合法formula对象。
  • 传入coxph模型后仅生成单条合并曲线:未给survfit指定分组水平参数时,默认输出协变量取均值的总体平均生存曲线,不会自动按分组变量拆分输出多条曲线。

可直接运行的基础代码

方式1:直接构建survfit分组拟合对象(最简便,优先推荐)

去掉公式外层多余括号即可正常生成分组拟合结果:

# 加载依赖包
library(survival)
library(survminer)

# 构建分组生存拟合对象
fit <- survfit(Surv(time = Age) ~ Dose, data = LongL1)

# 绘制3组剂量对应的生存曲线
ggsurvplot(
  fit,
  data = LongL1,
  pval = TRUE, # 可选:输出log-rank组间差异检验p值
  palette = "jco", # 可选:自定义配色
  legend.title = "剂量分组",
  xlab = "年龄(生存时间)",
  ylab = "累积生存概率"
)

方式2:基于coxph模型绘制分组曲线

如果需要先构建比例风险模型再绘图,必须给survfit传入newdata参数指定所有要展示的分组水平,否则只会输出单条总体曲线:

# 构建cox比例风险模型
ModLong1 <- coxph(Surv(time = Age) ~ Dose, data = LongL1)

# 构建分组拟合对象,指定所有剂量分组水平
fit_cox <- survfit(
  ModLong1,
  newdata = data.frame(Dose = unique(LongL1$Dose))
)

# 绘图
ggsurvplot(
  fit_cox,
  data = LongL1,
  legend.labs = unique(LongL1$Dose), # 匹配分组标签
  pval = TRUE
)

后续扩展提示

  • 后续纳入世代分组变量时,若需要展示双因素分组曲线,直接将公式修改为Surv(time = Age) ~ Dose + 世代变量名即可;若需要做分层分析,可将公式写为Surv(time = Age) ~ Dose + strata(世代变量名)。
  • 所有分类分组变量建议提前转为factor类型,避免R将分类值识别为连续变量导致拟合结果异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:15