如何在R的rms包列线图中截断Total Points范围至250-350
如何截断rms包列线图的Total Points范围到250-350
要实现这个需求,核心是利用nomogram函数的total.fun参数自定义总积分的映射逻辑,同时配合fun.at指定展示的积分区间。下面用survival包的lung数据集给出可直接运行的示例:
完整示例代码
library(rms) library(survival) # 预处理lung数据集(模拟你的保密数据结构) lung_df <- na.omit(lung) lung_df$status <- ifelse(lung_df$status == 2, 1, 0) # 转换状态编码符合cph要求 # 构建数据分布对象 ddist <- datadist(lung_df) options(datadist = 'ddist') # 拟合Cox模型 mod.cox <- cph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno + pat.karno, data = lung_df, surv = TRUE) # 定义生存概率计算函数 surv.cox <- Survival(mod.cox) # 自定义总积分截断函数:把积分限制在250-350区间 truncate_total <- function(total) { pmax(pmin(total, 350), 250) } # 生成列线图 nom.cox <- nomogram(mod.cox, fun = list(function(x) surv.cox(365, x), # 1年生存概率 function(x) surv.cox(730, x)), # 2年生存概率 funlabel = c("1-Yr Sur. Prob.", "2-Yr Sur. Prob."), lp = FALSE, vnames = c("labels", "names"), total.fun = truncate_total, # 应用截断逻辑 fun.at = seq(250, 350, by = 20)) # 指定总积分轴的刻度范围 # 绘制列线图 plot(nom.cox)
关键逻辑说明
total.fun:这个函数接收模型计算的原始总积分,通过pmax(pmin(...))实现截断——低于250的积分强制设为250,高于350的设为350,中间值保持原样。fun.at:必须设置这个参数为250到350的序列,它决定了总积分轴上显示的刻度,同时让生存概率的计算仅对应这个区间,确保图表只展示你需要的范围。- 验证:运行代码后,列线图的Total Points轴只会显示250-350的刻度,生存概率也仅映射该区间,解决了原图表可读性差的问题。
内容的提问来源于stack exchange,提问作者Autumn O Donnell
相关产品推荐
相关产品推荐

