Topic 10. 单因素 Logistic 回归分析—单因素分
上期学习了怎样汇总单因素 Cox 回归的结果,这期学习单因素 Logistic 回归分的汇总,由于使用的是 coxph和 glm 两个函数结果的展示有所不同,因此整理过程略有不同,但是提取的信息是一致的。
01 单因素 Logistic 回归分析方法
Logistic 回归模型是一种概率模型它是以某一事件发生与否的概率 P 为因变量,以影响 P的因素为自变量建立的回归模型,分析某事件发生的概率与自变量之间的关系,是一种非线性回归模型。
Logistic 回归模型适用适用于因变量为:
二项分类
多项分类(有序、无序)的资料。
library(rms)#可实现逻辑回归模型(lrm)library(survival)library("survminer")data("lung")head(lung)table(lung$status)1 263 165#Error in eval(family$initialize) : y values must be 0 <= y <= 1lung$status=ifelse(lung$status==1,0,1)table(lung$status)0 163 165fit<-glm(status~sex,family = binomial, data =lung)summary(fit)Call:glm(formula = status ~ sex, family = binomial, data = lung)Deviance Residuals:Min 1Q Median 3Q Max-1.8271 -1.3333 0.6462 0.6462 1.0291Coefficients:Estimate Std. Error z value Pr(>|z|)(Intercept) 2.5614 0.4852 5.279 1.3e-07 ***sex -1.1010 0.3054 -3.605 0.000312 ***---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)Null deviance: 268.78 on 227 degrees of freedomResidual deviance: 255.46 on 226 degrees of freedomAIC: 259.46Number of Fisher Scoring iterations: 4
将 glm 的结果与 coxph 的结果对比,glm 的结果没有在 summary() 之后显示出来,需要我们单独计算,在之前 Logistic 回归分析中已经介绍过了,这里再次追述一次,如下:
fit<-glm(status~sex,family = binomial, data =lung)sum<-summary(fit) ##提取所有回归结果放入sum中OR<-round(exp(coef(fit)),2) ##1-计算OR值保留两位小数(Intercept) sex10.43 0.37sum<-sum$coefficients[,2] ##提取所有回归结果放入sum中Intercept) sex0.5513927 0.3529752SE<-sum$coefficients[,2] ##2-提取SE(Intercept) sex0.5513927 0.3529752lower<-round(exp(coef(fit)-1.96*SE),2) # #3-计算CI保留两位小数并合并(Intercept) sex3.54 0.19upper<-round(exp(coef(fit)+1.96*SE),2)(Intercept) sex30.74 0.75P<-round(sum$coefficients[,4],2) # #4-提取P值(Intercept) sex0.00 0.01
下面是单因素 Cox 回归的 summary(),显然有很大区别,因此在整理结果时我们需要重写一个简单函数来获取批量回归的结果。
02 批量单因素 Logistic 分析
根据上述求出每个单因素 Logistic 回归分析的各种指标,如 OR,95%自信区间,P 值等,整理成为一张表格,写一个简单的函数,获得各种指标,如下:
univ_formulas<-function(x){#拟合结局和变量fml<-as.formula(paste0("status==0~",x))#glm()逻辑回归glm<-glm(fml,data=lung,family = binomial)#提取所有回归结果放入sum中sum<-summary(glm)#1-计算OR值保留两位小数OR<-signif(exp(coef(glm)),2)#2-提取SESE<-sum$coefficients[,2]#3-计算CI保留两位小数并合并lower<-signif(exp(coef(glm)-1.96*SE),2)upper<-signif(exp(coef(glm)+1.96*SE),2)CI<-paste0(lower,'-',upper)CI <- paste0(OR, " (",lower, "-", upper, ")")#4-提取P值P<-signif(sum$coefficients[,4],2)#5-将变量名、OR、CI、P合并为一个表,删去第一行univ_formulas<- data.frame('Variants'=x,'CI' = CI,'P-value' = P,'OR' = OR,'lower' = lower,'upper' = upper)[-1,]#返回循环函数继续上述操作return(univ_formulas)}
这里我们选择除了 time, status 的8个协变量来做单因素 Logistic 回归分析,之后在对结果进行整理,达到一张表格,即为单因素 Logistic 回归分析的结果,也是文章经常出现的表格,整理数据,如下:
covariates <- c("inst","age", "sex", "ph.karno", "ph.ecog", "wt.loss","meal.cal","pat.karno")univ_logistic_result <- lapply(covariates, univ_formulas)univ_logistic_resultlibrary(plyr)univ_logistic_result <- ldply(univ_logistic_result,data.frame)#最后,将P值=0的变为p<0.0001univ_logistic_result$P.value[univ_logistic_result$P==0]<-"<0.001"names(univ_logistic_result)=c("Variants","Hazard Ratio (95%CI)","P-value","","","")univ_logistic_result #########最后三列的列名赋值为空Variants Hazard Ratio (95%CI) P-value1 inst 1 (0.99-1.1) 0.1 1.00 0.99 1.102 age 0.96 (0.93-1) 0.042 0.96 0.93 1.003 sex 2.7 (1.3-5.3) 0.0054 2.70 1.30 5.304 ph.karno 1 (1-1.1) 0.04 1.00 1.00 1.105 ph.ecog 0.46 (0.28-0.76) 0.0027 0.46 0.28 0.766 wt.loss 0.99 (0.97-1) 0.53 0.99 0.97 1.007 meal.cal 1 (1-1) 0.75 1.00 1.00 1.008 pat.karno 1 (1-1.1) 0.018 1.00 1.00 1.10#保存为Excelwrite.csv(univ_logistic_result ,"univ_logistic_result.csv",row.names = F)
03 单因素 Logistic 可视化
这里我们仍然利用 R 包 forestplot 来绘制可视化图,跟单因素 Cox 回归的一样,但是得到的结果却不相同,根据上述结果我们已经保存输出结果,下面我们在利用 read.csv() 读取结果文件作为输入文件,森林图的代码就跟 Cox 回归一样,如下:
#install.packages("forestplot")library(forestplot)rs_forest <- read.csv('univ_logistic_result.csv',header = FALSE)rs_forest# 读入数据的时候大家一定要把header设置成FALSE,保证第一行不被当作列名称〿tiff('Figure 2.tiff',height = 1800,width = 3000,res= 600)forestplot(labeltext = as.matrix(rs_forest[,c(1,2,3)]),#设置用于文本展示的列,此处我们用数据的前四列作为文本,在图中展示mean = rs_forest$V4, #设置均倿lower = rs_forest$V5, #设置均值的lowlimits陿upper = rs_forest$V6, #设置均值的uplimits陿#is.summary = c(T,T,T,T,T,T,T,T,T),#该参数接受一个逻辑向量,用于定义数据中的每一行是否是汇总值,若是,则在对应位置设置为TRUE,若否,则设置为FALSE;设置为TRUE的行则以粗体出现zero = 1.5, #设置参照值,此处我们展示的是HR值,故参照值是1,而不昿0boxsize = 0.3, #设置点估计的方形大小lineheight = unit(8,'mm'),#设置图形中的行距colgap = unit(2,'mm'),#设置图形中的列间跿lwd.zero = 2,#设置参考线的粗绿lwd.ci = 2,#设置区间估计线的粗细col=fpColors(box='#458B00', summary= "#8B008B",lines = 'black',zero = '#7AC5CD'),#使用fpColors()函数定义图形元素的颜色,从左至右分别对应点估计方形,汇总值,区间估计线,参考线xlab="The estimates",#设置x轴标筿lwd.xaxis=2,#设置X轴线的粗绿lty.ci = "solid",graph.pos = 3)#设置森林图的位置,此处设置为4,则出现在第四列dev.off()
这样对比单因素 Cox 回归分析的结果,可以看出使用的模型不同,得到的结果大相径庭,我这里只是做个例子,所以说在模型选择上,一定需要我们清晰的知道自己的目的是什么,数据类型才能准确快速的选择模型。
单因素完成,下期需要将单因素与多因素整理到一张表格中,有时还需要加一列数据本身的分组信息,下期将进行讲解。
关注公众号,每天有更新,记得扫码进群,每天有讨论,免费交流哦!
Reference:
Liu Y, Zhao P, Cheng M, Yu L, Cheng Z, Fan L, Chen C. AST to ALT ratio and arterial stiffness in non-fatty liver Japanese population:a secondary analysis based on a cross-sectional study. Lipids Health Dis. 2018 Dec 3;17(1):275.
Hosmer, D. & Lemeshow, S. (2000). Applied Logistic Regression (Second Edition). New York: John Wiley & Sons, Inc.
Long, J. Scott (1997). Regression Models for Categorical and Limited Dependent Variables. Thousand Oaks, CA: Sage Publications.
本文使用 文章同步助手 同步