史上最详细Cox回归列线图制作教程

本文介绍了一种直观展示Cox回归结果的方法——列线图,并通过实例演示了如何利用R语言绘制列线图,进而预测特定条件下患者的生存概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列线图是一种直观有效地展示Cox回归结果的一种方法。最有价值的是进行结局的预测,同时可以通过直线的长度来表示不同变量对结局的影响,以及变量的不同取值对结局的影响。正如下图中所示。

举例来说,一个男性胰腺癌患者,年龄是40岁,术中进行放疗,肿瘤位置再胰脏头部,胰胆管浸润为CH0,有腹膜转移,TNM分期在IV期。 根据上述条件,判断每个变量的得分,年龄40岁,points得分是10分,男性points得分是4分,依次累计各个变量的得分,得到Total points,然后就有对应3月、6月和1年的生存概率。复杂的模型公式变成了直观的图片,不仅仅医生可以看懂,病人家属也可以进行估测了。同时,可以看到术中有术中放疗和无术中放料其得分相差特别大,35分蹦到了80分。



# 请先安装好各个相关包再运行代码
# install.packages("VIM")

library(foreign) # 读取spss格式数据
library(survival)
library(rms) 
library(VIM) # 包中aggr()函数,判断数据缺失情况

if (!require("VIM")) {
  install.packages("VIM", repos="https://cran.rstudio.com/") 
  library("VIM")


par(family = "STXihei") # 指定绘制图片中的字体

# 数据来自张文彤《SPSS统计分析高级教程》,侵删!

url <- 'http://online.hyconresearch.com:4096/spss20/spss20advdata.zip'
 # 书中数据下载地址

file <- basename(url) 
# 获取文件名 spss20advdata.zip

if (!file.exists(file)) download.file(url, file) 

# 判断工作目录下是否有spss20advdata.zip文件,如果不存在则执行下载数据命令

unzip(file)    # 解压缩zip文件

pancer <- read.spss('part4/pancer.sav') # 读取文件

pancer <- as.data.frame(pancer) 
# Cox回归所需数据类型为数据框格式,将其转换为数据框格式

aggr(pancer,prop=T,numbers=T) 
# 判断pancer各个变量的数据缺失情况,出现红色即有缺失,绘制列线图不允许缺失值存在

pancer$censor <- ifelse(pancer$censor=='死亡',1,0) 
# Cox回归结局变量需为数值变量

pancer$Gender <- as.factor(ifelse(pancer$sex=='男',"Male","Female"))
# 更改变量名称以及变量取值

pancer$Gendr <- relevel(pancer$Gender,ref='Female')  # 设置参考组

dd<-datadist(pancer) 
options(datadist='dd') 

coxm <- cph(Surv(time,censor==1)~age+Gender+trt+bui+ch+p+stage,x=T,y=T,data=pancer,surv=T) 
# 建立Cox回归方程

surv <- Survival(coxm) # 建立生存函数

surv1 <- function(x)surv(1*3,lp=x) 
surv2 <- function(x)surv(1*6,lp=x) 
surv3 <- function(x)surv(1*12,lp=x) 

plot(nomogram(coxm,fun=list(surv1,surv2,surv3),lp= F,funlabel=c('3-Month Survival','6-Month survival','12-Month survival'),maxscale=100,fun.at=c('0.9','0.85','0.80','0.70','0.6','0.5','0.4','0.3','0.2','0.1')),xfrac=.45)

maxscale 参数指定最高分数,一般设置为100或者10分
fun.at 设置生存率的刻度
xfrac 设置数值轴与最左边标签的距离,可以调节下数值观察下图片变化情况


列线图绘制常见问题


1. 如何筛选变量? 

答: 与多变量统计分析变量筛选方法一样。列线图绘制纳入的变量即为coxm方程中的变量。


2. 如何更改图中变量名以及的变量值的名称,比如“sex”的"男"和"女"。

答: 列线图中出现的名称,即变量名和变量值名称,修改变量名和变量值名即可修改列线图中的名称。


3. 如何更改多分类变量的参考组

答:参考 pancer$Gendr <- relevel(pancer$Gender,ref='Female')  

<think>我们被要求使用中文回答,并且根据提供的引用内容来回答如何绘制Cox回归列线图。用户询问的是使用R语言或Python。根据引用,我们可以总结如下:1.引用[1]和[2]提到Python绘制Cox列线图的方法,其中引用[2]提到了一个名为`nomogram-explainer`的Python包,可以在PyPI上下载。2.引用[5]提到了在R语言中处理复杂设计调查(Survey-Weighted)的Cox模型列线图,使用`SvyNom`包。同时,引用[4]提到了在R中使用`regplot`函数(但注意,引用[4]的示例是简单的线性回归,不是Cox回归),而引用[5]则详细说明了使用`rms`包和`SvyNom`包。3.引用[3]详细说明了在Python中绘制二分类列线图的步骤,但用户需要的是Cox回归(生存分析)的列线图。因此,我们可以分别介绍R和Python两种语言中绘制Cox回归列线图的方法。在R语言中,绘制Cox回归列线图的常用包是`rms`。但是,如果数据是复杂设计调查(带有权重),则需要使用`SvyNom`包(如引用[5]所示)。在Python中,我们可以使用`nomogram-explainer`包(引用[2])或者自行编写代码(如引用[1]和[3]所示,但引用[3]是针对二分类的,需要调整)。由于引用中提供了两种语言的方法,我们将分别介绍。注意:用户没有说明数据是否带有复杂设计(如调查权重),因此我们将分别介绍一般情况和复杂设计的情况(针对R语言)。步骤:1.安装必要的包(R:rms,survival,SvyNom;Python:nomogram-explainer)2.准备数据,构建Cox回归模型。3.使用相应函数绘制列线图。下面分别介绍R和Python的方法。</think>### 如何绘制Cox回归列线图(R/Python实现) 绘制Cox回归列线图的核心是将回归模型转换为可视化评分工具,直观展示多个预测变量对生存概率的影响。以下是两种主流实现方法: --- #### **R语言实现(推荐)** 使用`rms`包是成熟的方法,特别适合复杂模型: ```r library(survival) library(rms) # 1. 数据准备 data(lung) # 使用survival包内置数据集 dd <- datadist(lung); options(datadist='dd') # 2. 构建Cox模型 cox_model <- cph(Surv(time, status) ~ age + sex + ph.ecog, data = lung, x=TRUE, y=TRUE, surv=TRUE) # 3. 绘制列线图 nom <- nomogram(cox_model, fun = list(function(x) 1 - surv(365, x), # 1年生存概率 function(x) 1 - surv(730, x)), # 2年生存概率 funlabel = c("1-year Survival", "2-year Survival"), lp = FALSE) plot(nom, col.grid = c("pink", "lightblue")) ``` **关键参数说明**: - `fun`:指定预测时间点(单位:天),可添加多个时间点 - `lp`:是否显示线性预测值(通常设为FALSE) - `col.grid`:设置概率条颜色梯度 **复杂设计数据**(如调查加权数据)需使用`SvyNom`包[^5]: ```r library(SvyNom) svy_cox <- svycoxph(Surv(time, status) ~ age + sex, design = survey_design) svy_nomogram(svy_cox, times = c(365, 730)) ``` --- #### **Python实现** 推荐使用`nomogram-explainer`包(PyPI可安装): ```python from nomogram_explainer import CoxNomogram import pandas as pd from lifelines import CoxPHFitter # 1. 准备数据 data = pd.read_csv("lung_data.csv") cph = CoxPHFitter().fit(data, duration_col='time', event_col='status') # 2. 创建列线图 nomogram = CoxNomogram( model = cph, times = [365, 730], # 预测时间点 feature_names = ['age', 'sex', 'ph.ecog'], style = "cool" # 可选风格:classic/cool/elegant ) # 3. 绘制并保存 fig = nomogram.plot() fig.savefig("cox_nomogram.png", dpi=300) ``` **自定义选项**: - `style`:切换可视化风格(经典/酷炫/优雅) - `point_range`:调整总分数范围(默认0-100) - `feature_scales`:手动设置变量刻度范围 --- #### **注意事项** 1. **数据预处理**: - 分类变量需转换为哑变量 - 连续变量需检查线性假设 - 缺失值处理(列线图不支持缺失值输入) 2. **模型验证**: - 绘制前需验证Cox模型的PH假设 - 建议计算C-index(0.7以上可用) 3. **可视化优化**: - 左侧变量名过长时调整`name_width`参数(Python) - 概率条超过3个会导致刻度重叠 - 颜色梯度需与生存概率单调相关(如红色=低生存率) > 示例中的肺癌数据来自R的`survival::lung`数据集,实际应用需替换为自己的数据[^1][^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值