【R语言】logistic回归(二)多因素logistic回归
前言
logistic回归分析是医学统计分析过程中常用的一种影响因素分析的方法,最常用的是二元logistic回归分析,即以二分类数据为因变量的logistic回归分析。上次已经和大家分享了批量进行logistic回归分析的代码,接下来将分享多因素logistic回归分析的代码。
一、多因素logistic回归分析
多因素logistic回归分析一般的分析思路其实就是把单因素分析过程中发现的有意义的变量同时纳入logistic回归模型,除了纳入有意义的变量之外,还可以通过强制纳入其他变量构建不同的模型。
多因素回归分析还包括逐步回归分析,以后有时间会进行整理分析,本文仅介绍全部纳入的代码。
1. 数据准备
首先,我们构建一个数据集供我们进行分析,同时方便大家复制学习:
set.seed(1234)#设置随机种子,保证生成数据一致
log_data<- data.frame(Y = sample(0:1, 600, replace = T),
sex=sample(1:2, 600, replace = T),
edu=sample(1:4, 600, replace = T),
BMI=rnorm(600, mean = 22, sd = 3),
白蛋白=rnorm(600, mean = 35, sd = 6),
随机血糖=rnorm(600, mean = 4.75, sd = 1.2))
Y为我们要研究的二分类因变量,sex、edu、BMI、白蛋白和随机血糖为自变量数据。
使用summary()函数查看一下数据特征:
> summary(log_data)
Y sex edu BMI 白蛋白 随机血糖
Min. :0.0000 Min. :1.000 Min. :1.00 Min. :13.21 Min. :16.27 Min. :1.036
1st Qu.:0.0000 1st Qu.:1.000 1st Qu.:2.00 1st Qu.:20.18 1st Qu.:30.94 1st Qu.:3.956
Median :1.0000 Median :1.000 Median :3.00 Median :22.17 Median :34.78 Median :4.816
Mean :0.5017 Mean :1.467 Mean :2.57 Mean :22.05 Mean :35.04 Mean :4.778
3rd Qu.:1.0000 3rd Qu.:2.000 3rd Qu.:4.00 3rd Qu.:23.98 3rd Qu.:39.19 3rd Qu.:5.579
Max. :1.0000 Max. :2.000 Max. :4.00 Max. :30.07 Max. :54.01 Max. :8.377
此处我们可以看到Y、sex、edu在本数据中被标记为计量资料了,所以我们需要利用as.factor()函数对数据进行因子化,当变量数较多时可以结合for循环可以批量处理:
#因子化
VarsC<-c("Y","sex","edu")#分类变量
for(i in VarsC){
log_data[,i] <- as.factor(log_data[,i])
}#利用循环因子化
然后再使用summary()函数查看一下数据特征:
summary(log_data)
Y sex edu BMI 白蛋白 随机血糖
0:299 1:320 1:145 Min. :13.21 Min. :16.27 Min. :1.036
1:301 2:280 2:142 1st Qu.:20.18 1st Qu.:30.94 1st Qu.:3.956
3:139 Median :22.17 Median :34.78 Median :4.816
4:174 Mean :22.05 Mean :35.04 Mean :4.778
3rd Qu.:23.98 3rd Qu.:39.19 3rd Qu.:5.579
Max. :30.07 Max. :54.01 Max. :8.377
此时,分类变量已被标记为因子,可以作为分类变量进行后续的回归分析。
2. 回归分析
代码如下:
#多因素logistic回归
varsMul<-c("sex","edu","BMI","白蛋白")#需要进行多因素分析的变量,随机生成的数据单因素无意义,故强制纳入
dataAM<-data.frame(subset(log_data,select=c("Y",varsMul[1:length(varsMul)])))#将因变量和要分析的自变量单独建库
fitMul<-glm(Y~.,data=dataAM,family=binomial())#行多因素logistic回归分析
fitSum<-summary(fitMul)
ResultMul<-c()#准备空向量,用来储存结果
ResultMul<-rbind(ResultMul,fitSum$coef)
OR<-exp(fitSum$coef[,'Estimate'])
ResultMul<-cbind(ResultMul,cbind(OR,exp(confint(fitMul))))
查看一下结果
> ResultMul
Estimate Std. Error z value Pr(>|z|) OR 2.5 % 97.5 %
(Intercept) -0.746063145 0.78794724 -0.9468440 0.3437183 0.4742299 0.1005306 2.216905
sex2 0.087257938 0.16446588 0.5305534 0.5957283 1.0911781 0.7904863 1.506749
edu2 0.157835294 0.23672211 0.6667535 0.5049296 1.1709733 0.7364382 1.864612
edu3 -0.158957902 0.23887554 -0.6654424 0.5057676 0.8530323 0.5333995 1.362035
edu4 0.151528355 0.22543231 0.6721679 0.5014768 1.1636113 0.7481041 1.811931
BMI 0.024530343 0.02876339 0.8528322 0.3937523 1.0248337 0.9687230 1.084545
白蛋白 0.003616099 0.01319647 0.2740201 0.7840692 1.0036226 0.9779787 1.029981
将结果输出为csv文件,方便制作三线表。
write.csv(ResultMul,file="Mul_log.csv")
输出的csv文件如下: