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
相关产品推荐
相关产品推荐

