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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:22:29