如何使用R的cuRe包实现模型外推并绘制多模型合并ggplot图?
解决cuRe包非混合治愈模型外推与多模型ggplot2绘图问题
核心思路
cuRe包的predict函数需要通过newdata参数指定自定义时间点(包括外推到50年的点),从而将时间与生存概率对应起来;随后将多个模型的预测结果合并,用ggplot2统一绘图。
具体实现步骤
- 加载所需包
library(cuRe) library(ggplot2) library(splines)
- 生成包含外推时间点的数据集
指定从0.01(避免log(0)的报错)到50年的时间序列,步长可根据需求调整:
# 生成目标时间点(含50年外推) pred_times <- seq(0.01, 50, by = 0.5) # 构建预测用数据集,变量名需与模型中的时间变量一致(即FUyear) new_dat <- data.frame(FUyear = pred_times)
- 拟合多个非混合治愈模型
以不同自由度的样条模型为例:
# 自由度2的样条模型 model_df2 <- GenFlexCureModel( formula = Surv(FUyear, status) ~ 1, smooth.formula = ~ ns(log(FUyear), df = 2), data = colonDC, type = "nmixture" ) # 自由度3的样条模型 model_df3 <- GenFlexCureModel( formula = Surv(FUyear, status) ~ 1, smooth.formula = ~ ns(log(FUyear), df = 3), data = colonDC, type = "nmixture" ) # 自由度4的样条模型 model_df4 <- GenFlexCureModel( formula = Surv(FUyear, status) ~ 1, smooth.formula = ~ ns(log(FUyear), df = 4), data = colonDC, type = "nmixture" )
- 提取并合并多模型预测结果
编写辅助函数统一处理每个模型的预测输出,添加时间与模型标识:
# 定义提取预测结果的函数 get_pred_data <- function(model, model_label, newdata) { surv_pred <- predict(model, type = "surv", newdata = newdata) data.frame( time = newdata$FUyear, survival = as.vector(surv_pred), model = model_label ) } # 提取各模型结果 pred_df2 <- get_pred_data(model_df2, "样条自由度=2", new_dat) pred_df3 <- get_pred_data(model_df3, "样条自由度=3", new_dat) pred_df4 <- get_pred_data(model_df4, "样条自由度=4", new_dat) # 合并所有结果 all_preds <- rbind(pred_df2, pred_df3, pred_df4)
- 用ggplot2绘制多模型曲线
ggplot(all_preds, aes(x = time, y = survival, color = model)) + geom_line(linewidth = 1) + labs(x = "随访时间(年)", y = "生存概率", color = "模型类型") + theme_minimal() + xlim(0, 50) # 确保外推到50年的部分显示
关键说明
- 必须通过
newdata指定自定义时间点,才能获取外推到50年的预测值,同时解决predict输出无时间点的问题; - 时间起点设为0.01而非0,是为了避免
log(FUyear)出现无穷大的报错; - 可根据需求调整时间步长、模型参数(如不同协变量、样条类型),只需保持
newdata的变量名与模型一致即可。
内容的提问来源于stack exchange,提问作者krtbris
相关产品推荐
相关产品推荐

