R语言glmnet包分别拟合cox比例风险回归模型的lasso回归和岭回归

文摘   2024-12-28 08:45   山东  




在上一期的分享中,我们演示了

R语言glmnet包分别拟合二分类logistic模型的lasso回归和岭回归的简单示例,今天我们继续分享生存分析中glmnet包拟合cox比例风险回归模型的lasso回归和岭回归的简单操作。




生存分析

常规数据在表示时,只需要一个值,比如患者的血压,性别等数据,不是连续型就是离散型;生存数据则有两个值,第一个是生存时间,可以看做是一个连续型的变量,第二个是生存事件,可以看做是离散型的变量。

生存分析是研究生存时间的分布规律,以及生存时间和相关因素之间关系的一种统计分析方法。在生存分析中,研究的主要对象是寿命超过某一时间的概率。还可以描述其他一些事情发生的概率,例如产品的失效、出狱犯人第一次犯罪、失业人员第一次找到工作等等。


Cox模型

Cox模型‌,也称为Cox回归模型或比例风险模型(Proportional Hazards Model),是由英国统计学家David Cox于1972年提出的一种半参数回归模型。该模型主要用于生存分析,能够同时分析多个风险因素对生存时间的影响,适用于医学随访研究和其他需要分析生存数据的领域。

Cox模型在医学研究中有广泛的应用,主要用于以下几个方面:

‌生存分析‌:研究患者的生存时间及其相关因素。

‌风险因素分析‌:确定与特定事件(如死亡、疾病复发)相关的风险因素。

‌生存率比较‌:比较不同组群之间的生存率。

‌预后评估‌:评估影响患者预后的因素,为治疗决策提供依据。

‌调整分析‌:调整其他变量的影响,更准确地评估特定因素对生存时间的影响。




今天我们仍以熟悉的示例数据集为例,演示一下R语言glmnet包分别拟合cox比例风险回归模型的lasso回归和岭回归的简单示例。








我们先整理一下Rstudio的环境并加载数据及常用包

rm(list=ls()) #移除所有变量数据

install.packages("") #安装包

library() #加载包


#1.数据及包准备

#读取Excel数据

library(readxl) #加载包

data <- read_excel("C:/Users/hyy/Desktop/示例数据.xlsx")

data

library(glmnet)

library(Matrix)

library(survival)

library(survminer)

library(ggplot2)

library(ggpubr)

library(Hmisc)








#Lasso回归前的生存分析

#根据变量在表中定位设置自变量、因变量、时间变量

lambdas <- seq(0,5, length.out = 1000)

X <- as.matrix(data[,3:9])

Y <- as.matrix(data[,2])

Time <- as.matrix(data[,10])

fit_sur <- Surv(Time,Y)

fit_sur

plot(fit_sur)










#根据分类指标分别绘制生存曲线

fit_sur2 <- survfit(Surv(Time,Y)~指标8, data=data)

fit_sur2

plot(fit_sur2)

ggsurvplot(fit_sur2, data = data)











#累积风险曲线

ggsurvplot(fit_sur2,

           data = data,

           fun = "cumhaz", 

           conf.int = TRUE, # 可信区间

           palette = "lancet", # 支持ggsci配色,自定义颜色,brewer palettes中的配色,等

           ggtheme = theme_bw() # 支持ggplot2及其扩展包的主题

)








#累积事件曲线:

ggsurvplot(fit_sur2,

           data = data,

           fun = "event", 

           conf.int = TRUE, # 可信区间

           palette = "grey",

           ggtheme = theme_pubclean() 

)








#或者根据变量名设置自变量、因变量、时间变量,拟合cox模型

data$status <- as.matrix(data$结局)

survfit <- coxph(Surv(时间,status)~指标1+指标2+指标3+指标4+指标5+指标6+指标7,data=data)

summary(survfit)








## 绘制Schoenfeld残差图

p <- cox.zph(survfit)

p$table

p$residuals$schoenfeld %>% ggplot(aes(p$time,p$x)) + 

  geom_line() + 

  labs(title = "Schoenfeld Residuals Over Time")










#或者使用数据集合进行拟合cox模型开始进行Lasso回归

data$status <- as.numeric(data$结局)

x<-as.matrix(X)#指定自变量为矩阵

y<-as.matrix(Surv(data$时间,data$status))#指定因变量为矩阵

set.seed(12345)

coxfit<-glmnet(x,y,family = "cox",alpha = 1)






plot(coxfit,label = T)

plot(coxfit, xvar = "lambda", label = TRUE)

plot(coxfit, xvar = "dev", label = TRUE)

print(coxfit) 













#交叉验证

set.seed(12345)

lscoxmodel <- cv.glmnet(x,y,  family = "cox",alpha = 1)

plot(lscoxmodel)

plot(lscoxmodel$glmnet.fit, "lambda", label = T)










#查看具体筛选的变量系数值和Lambda值(lambda.min处)

coef<-coef(lscoxmodel,s="lambda.min")

coef

#查出lambda.min处的Lambda值

Lambda<-lscoxmodel$lambda.min

Lambda

#lambda.min处保留的变量的个数,也就是系数不为0

bl.index<-which(coef!=0)

bl.index

#lambda.min处保留的各变量的系数

bl.coef<-coef[bl.index]

bl.coef

#列出lambda.min处保留的各变量的变量名

rownames(coef)[bl.index]








#岭回归

set.seed(12345)

ridgecox <- glmnet(x, y, family = "cox",alpha = 0)

plot(ridgecox,label = T)

plot(ridgecox, xvar = "lambda", label = TRUE)

plot(ridgecox, xvar = "dev", label = TRUE)












#交叉验证

set.seed(12345)

rgcox_model <- cv.glmnet(x, y, family = "cox",alpha = 0,lambda = lambdas,nfolds =3)

plot(rgcox_model)

plot(rgcox_model$glmnet.fit, "lambda", label = T)










#查看具体筛选的变量系数值和Lambda值(lambda.min处)

coefridge<-coef(rgcox_model,s="lambda.min")

coefridge

#查出lambda.min处的Lambda值

Lambdaridge<-rgcox_model$lambda.min

Lambdaridge

#lambda.min处保留的变量的个数,也就是系数不为0

ridge.index<-which(coefridge!=0)

ridge.index

#lambda.min处保留的各变量的系数

ridge.coef<-coef[ridge.index]

ridge.coef

#列出lambda.min处保留的各变量的变量名

rownames(coef)[ridge.index]








医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!




医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!
 最新文章