理论介绍:
二分类logistic模型建立以下模型:
Logit(y)=b1*x1+残差
根据估计的回归系数b1取指数得到OR值,即x1变量的OR=eb1,即e的b1次方。
我们在研究中,一般需要提取以下参数:
回归系数、回归系数标准误、检验统计量Z值、P值、OR值、OR值的置信区间
OR的和其置信区间合并,如1.34(1.22~1.58)
本文将基于已有数据:分别分析性别,年龄,省份,城乡,婚姻,文化程度,是否吸烟对是否饮酒的影响,然后提取上述参数。
整个实践操作分为四步:
1.数据的整理:包括分类变量因子化、设置参照、变量顺序设定
2.拟合模型,了解提取参数函数
3.建立批量循环,提取参数
4.结果导出
实践操作:
目的:分析性别,年龄,省份,城乡,婚姻,文化程度,是否吸烟对是否饮酒的影响
自变量:性别,年龄,省份,城乡,婚姻,文化程度,是否吸烟
因变量:是否饮酒
提取指标:回归系数、回归系数标准误、检验统计量Z值、P值、OR值、OR值的置信区间、
OR的和其置信区间的合并
具体最终的结果如下:
代码实现
.libPaths()#查看R包位置
.libPaths("D:/Program File/R/R-4.3.2/library")#定义包安装位置
setwd("E:/02学习/经验/03R语言图形绘制/16R语言批量实现单因素二分类logistic回归并提取相关参数")#设置工作空间
getwd()#加载工作空间
#导入数据
data1<-read.csv("ms2013.csv",
as.is = TRUE,header = T,sep = ",", fileEncoding='utf-8')
#########第一步:数据整理
#(1)因子化
data1$AE<-as.factor(data1$AE)
#查看变量名
names(data1)
#批量因子化
a<-c("性别",
"省份",
"城乡" ,
"婚姻",
"文化程度",
"是否吸烟"
)#填入需要转化的变量
data1[,a]<-lapply(data1[,a],as.factor)#转因子
#(2)设置参照
data1$性别<-relevel(data1$性别, ref=1)
#(3)调整变量列的顺序:其实就是选择变量
library(dplyr)
data1 <- select(data1,性别,年龄,省份,城乡,婚姻,文化程度,是否吸烟,是否饮酒)
#第二步:拟合单因素二元logistic回归模型,了解相关提取的函数
fit1<-glm(是否饮酒~性别,data=data1,family=binomial())
summary(fit1)
#我们要提取的数据包括bate、标准误、z值、p值、OR、OR的95%置信区间
fitSum<-summary(fit)
#提取bate、标准误、z值、p值
fitSum$coef
#计算回归系数的OR值
OR<-exp(fitSum$coef[,'Estimate'])
#回归系数的置信区间
confint(fit)
#OR值的置信区间
OR_CI<-exp(confint(fit))
#paste函数合并OR和置信区间
paste(OR,"(",OR_CI[,1],"~",OR_CI[,2],")")
######第三步:建立循环,提取相关数据
var<-names(data1[,1:7])#自变量
var
result<-c()
for (i in 1:length(var)){
fit<-glm(substitute(是否饮酒~x,list(x=as.name(var[i]))),data=data1,family=binomial())
fitSum<-summary(fit)
result1<-c()
#提取bate、标准误、z值、p值,并保留三位小数
result1<-rbind(result1,round(fitSum$coef,3))
#计算or值
OR<-exp(fitSum$coef[,'Estimate'])
OR<-round(OR,2)#保留两位小数
#O计算R值的置信区间
OR_CI<-exp(confint(fit))
OR_CI<-round(OR_CI,2)#保留两位小数
#OR和置信区间合并
he<-paste(OR,"(",OR_CI[,1],"~",OR_CI[,2],")")
#横向合并result1,OR,OR_CI,he
result1<-data.frame(cbind(result1,OR,OR_CI,he))
#将第一列命名为Characteristics;这是原来的变量
result1 <- tibble::rownames_to_column(result1, var = "Characteristics")
result<-rbind(result,result1[-1,])#[-1,],删除截距项
}
###第四步:结果导出
write.csv(result, file = "result.csv", row.names = T)
本文的原始数据如下:点个关注和赞赞呗,谢谢