基于Lasso回归筛选变量构建Cox模型并绘制Nomogram

本文转自易学统计基于Lasso回归筛选变量构建Cox模型并绘制Nomogram

研究背景

本章是基于Lasso回归筛选变量后,构建Cox回归临床预测模型,并绘制Nomogram图。Cox模型是一种半参数模型,该模型以生存结局和生存时间为因变量,分析多个因素对生存期的影响,常用RR来量化这种结果,绘制Nomogram列线图实现个体预测。有关Lasso回归可见公众号前文章介绍:如何进行高维变量筛选和特征选择(一)?Lasso回归

案例研究

  • 本文数据收集了83例癌症患者的生存资料,包含患者年龄、性别、癌症分期等。研究目的探讨癌症患者生存情况的影响因素并构建预测模型。
    临床研究一般有提供多个危险因素,首先做单因素的筛选,具体筛选方法,见公众号之前的文章。本文采用Lasso回归筛选因素。
  • 具体分析步骤是①筛选变量②基于这些变量构建模型③绘制Nomogram图,预测不同时间生存概率。③计算模型c_index(区分度)该步骤用神包rms一步实现。接下来直接上代码。

R代码及解读

##加载包 明确每个包的作用
library(glmnet) ##Lasso回归
library(rms)  ## 画列线图;
library(VIM) ## 包中aggr()函数,判断数据缺失情况
library(survival) ##  生存分析包
#读取数据集
dt <-read.csv("cancer.csv")
str(dt)  ##查看每个变量结构
aggr(dt,prop=T,numbers=T) #判断数据缺失情况,红色表示有缺失。
dt <- na.omit(dt) 按行删除缺失值
1.png

由图片可看到所有变量都为蓝色,没有缺失值。如果用na.omit()函数按照行删除。

第一步,也是很重要的一步,数据整理。

用for循环语句将数值型变量转为因子变量

for(i in names(dt)[c(4:9)]) {dt[,i] <- as.factor(dt[,i])}
##筛选变量前,首先将自变量数据(因子变量)转变成矩阵(matrix)
## Lasso要求的数据类型
x.factors <- modtel.matrix(~ dt$sex+dt$trt+dt$bui+dt$ch+dt$p+dt$stage,dt)[,-1]
#将矩阵的因子变量与其它定量边量合并成数据框,定义了自变量。
x <- as.matrix(dtata.frame(x.factors,dt[,3]))
#设置应变量,打包生存时间和生存状态(生存数据)
y <- data.matrix(Surv(dt$time,dt$censor))

第二步:Lasso回归筛选变量

#调用glmnet包中的glmnet函数,注意family那里一定要制定是“cox”,如果是做logistic需要换成"binomial"。
fit <-glmnet(x,y,family = "cox",alpha = 1)
plot(fit,label=T)
plot(fit,xvar="lambda",label=T)
#主要在做交叉验证,lasso
fitcv <- cv.glmnet(x,y,family="cox", alpha=1,nfolds=10)
plot(fitcv)
coef(fitcv, s="lambda.min")
##
#9 x 1 sparse Matrix of class "dgCMatrix"                1
##d.sex1    .       
##d.trt1    .       
##d.bui1    .       
##d.ch2     .       
##d.ch3     .       
##d.ch4    -0.330676
##d.p1      .       
##d.stage4  .       
##d...3.   
Lasso回归.png
楠木大系数.png

该图在之前文章提到,见如何进行高维变量筛选和特征选择(一)?Lasso回归,由上述代码以及图片完成变量筛选,这里只做演示,假设所有的变量都入选了,我们用这些入选的变量构建Cox回归模型。

第三步:构建Cox模型,并检验等比例风险

#拟合cox回归
coxm <-cph(Surv(time,censor==1)~age+sex+trt+bui+ch+p+stage,x=T,y=T,data=dt,surv=T) 
cox.zph(coxm)#等比例风险假定
##       chisq df     p
##age    1.993  1 0.158
##sex    0.363  1 0.547
##trt    3.735  1 0.053
##bui    2.587  1 0.108
##ch     0.296  1 0.587
##p      0.307  1 0.579
##stage  0.395  1 0.530
##GLOBAL 9.802  7 0.200

注意chp()函数的写法,其中因变量需要用Surv()先打包。后面写法同LR。

等比例风险检验:最后面的GLOBAL是整体看,P值大于0.05,全模型整体都是满足的。对于每一个分类来说P值大于0.05,也是满足的。

第四步:绘制nomogram图,注意该函数里面的参数设置。

surv <- Survival(coxm) # 建立生存函数
surv1 <- function(x)surv(1*3,lp=x) # 定义time.inc,3月OS
surv2 <- function(x)surv(1*6,lp=x) # 定义time.inc,6月OS
surv3 <- function(x)surv(1*12,lp=x) # 定义time.inc,1年OS

dd<-datadist(dt) #设置工作环境变量,将数据整合
options(datadist='dd') #设置工作环境变量,将数据整合

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 设置数值轴与最左边标签的距离,可以调节下数值观察下图片变化情况
plot(nomogram)
列线图.png

该图的使用,本质上是将Cox回归模型可视化展示,方便临床快速判断。假设有个病人性别为女,trt为0,P期为1,Nomogram用法是在sex变量上找到其值为1的刻度,然后画垂线投影到最上方的points刻度尺上,找到对应的分值为75分,同理找到trt为0的分值约为50分,P为1的对应分值为100,将这三个因素的points值加起来总分225。下一步在下面的Total Points刻度尺上找到225分,向下方的3个轴做垂线,6-Month-survival对应的值在0.6和0.7之间,约为0.65,说明该患者6个月的生存概率值为65%,其他以此类推。

第五步:利用rms包计算模型区分度。

##模型验证
#Concordance index
f<-coxph(Surv(time,censor==1)~age+sex+trt+bui+ch+p+stage,data=d)
sum.surv<-summary(f)
c_index<-sum.surv$concordance
c_index  ##
##C      se(C) 
##0.55396619 0.07664425

该模型的区分度C-index为0.554,其本质同ROC曲线面积。结果显示,该模型的区分度一般。根据前面变量筛选,考虑纳入更多的影响因素和样本。

以上就是本次跟大家分享的内容,觉得有用的话点赞、转发哦~

更多阅读

如何进行变量筛选和特征选择(三)?交叉验证
如何进行变量筛选和特征选择(二)?最优子集回归
如何进行高维变量筛选和特征选择(一)?Lasso回归
R语言Logistic回归模型验证及Nomogram绘制

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容