reg
Logistic回归分析
Logistic回归 (Logistic regression)属于「概率型非线性回归」,是研究二分类 (可扩展到多分类)观察结果和一些影响因素之间关系的一种多变量分析方法。在流行病学研究中,经常需要分析疾病与各危险因素之间的关系,如食管癌的发生与吸烟、饮酒、不良饮食习惯等危险因素等关系,为了正确说明这种关系,需要排锤一些混杂因素等影响。如果用「线性回归分析」,由于因变量是一个二值变量(通常取之为1或0),不满足应用条件。
一个例子
❝作者首先用t检验和卡方检验筛选有差异的变量,之后进行多因素logistic回归分析。
❞
木舟笔记永久VIP企划
「权益:」
- 「木舟笔记所有推文示例数据及代码(「在VIP群里」实时更新」)。
data+code
R实现
多因素logistic回归
rm(list = ls()) data <- read.csv('data.csv') head(data) summary(data) # 将分类变量设置为factor,删除缺失值记录 ## 因子化 VarsC<-c("sex","cp","fbs","restecg","exang","slope","ca","thal")#分类变量 for(i in VarsC){ data[,i] <- as.factor(data[,i]) }#利用循环因子化 ## 将hd(heart disease)中的数字(0~4)改成"Healthy" 和"Unhealthy" data$hd <- ifelse(test=data$hd == 0, yes="Healthy", no="Unhealthy") data$hd <- as.factor(data$hd) str(data) # NA值处理:如果NA较少,可以直接删除;如果NA较多,需要进行缺失值处理 ## 查看NA个数 table(is.na(data)) ##展示含有NA的记录 data[!complete.cases(data),] ##去除含NA的样本 data <- na.omit(data) #多因素logistic回归 ## 构建Logistic模型 fitMul <- glm(formula = hd ~ ., data =data, family = 'binomial') summary(fitMul) ##logistic回归结果
> head(ResultMul) Estimate Std. Error z value Pr(>|z|) OR 2.5 % (Intercept) -6.25397767 2.96039852 -2.1125459 0.0346396558 0.001922791 4.732245e-06 age -0.02350753 0.02512158 -0.9357505 0.3494016427 0.976766619 9.290676e-01 sex1 1.67015202 0.55248644 3.0229738 0.0025030392 5.312975393 1.858511e+00 cp2 1.44839631 0.80913642 1.7900521 0.0734455437 4.256283277 8.875191e-01 cp3 0.39335276 0.70033787 0.5616614 0.5743467297 1.481941062 3.820686e-01 cp4 2.37328693 0.70909374 3.3469298 0.0008171191 10.732611757 2.823872e+00 97.5 % (Intercept) 0.5585898 age 1.0258173 sex1 16.4363241 cp2 21.7494748 cp3 6.0931562 cp4 46.5187371
可利用「逐步回归」筛选并剔除引起多重共线性的变量
逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除。以确保每次引入新的变量之前回归方程中只包含显著性变量。这是一个反复的过程,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止。以保证最后所得到的解释变量集是最优的。
依据上述思想,可利用逐步回归筛选并剔除引起多重共线性的变量,其具体步骤如下:先用被解释变量对每一个所考虑的解释变量做简单回归,然后以对被解释变量贡献最大的解释变量所对应的回归方程为基础,再逐步引入其余解释变量。经过逐步回归,使得最后保留在模型中的解释变量既是重要的,又没有严重多重共线性。
逐步回归存在的「争议」:可能得到一个好的模型,但是不能保证该模型是最佳模型,因为不是每一个可能的模型都被评价了。(可以使用自由子集回归的方法)
#逐步回归 logit.step <- step(fitMul,direction="both") summary(logit.step)
#重新建立回归模型 fitstep <- glm(formula = hd ~ sex + cp + trestbps + thalach + exang + oldpeak + slope + ca + thal, family = "binomial", data = data) fitSum<-summary(fitstep) ResultMul<-c()#准备空向量,用来储存结果 ResultMul<-rbind(ResultMul,fitSum$coef) OR<-exp(fitSum$coef[,'Estimate']) ResultMul<-cbind(ResultMul,cbind(OR,exp(confint(fitstep)))) # 导出结果 write.csv(ResultMul,file="Mul_log.csv")
res
关于变量筛选
前文已经提到两种方法:「单因素分析」和「逐步回归」。
单因素分析可以用t检验,卡方检验,秩和检验,Logistic回归。
批量单因素Logistic回归
# 批量单因素logistic ## 准备进行分析的自变量 varsU<-names(data[,1:13])#自变量 Result<-c() for (i in 1:length(varsU)){ fit<-glm(substitute(hd~x,list(x=as.name(varsU[i]))),data=data,family=binomial()) fitSum<-summary(fit) result1<-c() result1<-rbind(result1,fitSum$coef) OR<-exp(fitSum$coef[,'Estimate']) result1<-data.frame(cbind(result1,cbind(OR,exp(confint(fit))))) result1$Characteristics<-varsU[i] #添加变量名 Result<-rbind(Result,result1[-1,])#[-1,],删除常数项 } ## 为R语言logistic回归默认将分类变量的第一个factor设置为参照 Uni_log<-data.frame(Result[,c(1,4:8)]) #提取"P","OR","CIlower","CIupper"和变量名 colnames(Uni_log)[2:5]<-c("P","OR","CIlower","CIupper")#变量重命名 head(Uni_log) ExtractVar<-unique(Uni_log$Characteristics[Uni_log$"P"<0.05])#提取有意义的变量 write.csv(Uni_log,file="Uni_log.csv")#输出文档
筛选后的变量可以用来做多因素回归分析(同上)。
除了上述几种变量筛选方法,常用的还有Lasso、最优子集、支持向量机、决策树、随机森林等,后续我们会陆续提到。
本系列的第一部分logistic回归就先介绍到这里,后续会更新其他模型。
Reference
- 医学统计学.第5版.颜艳,王彤.2020年。
- https://mp.weixin.qq.com/s/NowePGv6DF9_dF4blSyzVQ
- https://zhuanlan.zhihu.com/p/535482448
- https://blog.csdn.net/qq_42696043/article/details/125134962?spm=1001.2014.3001.5502
往期内容
- 资源汇总 | 2022 木舟笔记原创推文合集(附数据及代码领取方式)
- CNS图表复现|生信分析|R绘图 资源分享&讨论群!
- R绘图 | 浅谈散点图及其变体的作图逻辑
- 这图怎么画| 有点复杂的散点图
- 这图怎么画 | 相关分析棒棒糖图
- 组学生信| Front Immunol |基于血清蛋白质组早期诊断标志筛选的简单套路
- (免费教程+代码领取)|跟着Cell学作图系列合集
- Q&A | 如何在论文中画出漂亮的插图?
- 跟着 Cell 学作图 | 桑葚图(ggalluvial)
- R实战 | Lasso回归模型建立及变量筛选
- 跟着 NC 学作图 | 互作网络图进阶(蛋白+富集通路)(Cytoscape)
- R实战 | 给聚类加个圈圈(ggunchull)
- R实战 | NGS数据时间序列分析(maSigPro)
- 跟着 Cell 学作图 | 韦恩图(ggVennDiagram)