logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。 逻辑回归根据给定的自变量数据集来估计事件的发生概率,由于结果是一个概率,因此因变量的范围在 0 和 1 之间。
例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。
自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。
今天我们仍以熟悉的“示例数据”集来演示一下三种常用的logistic回归模型拟合方法及相关可视化实现,分别为:stats包的glm()函数、rms包的lrm()函数、caret包的train()函数。我们打开示例数据。
#1.数据及包准备
#读取Excel数据
install.packages("readxl")
library(readxl) #加载包
data <- read_excel("C:/Users/hyy/Desktop/示例数据.xlsx")
#加载数据包并读取数据
library(ggplot2) #绘图用包
library(caret) #分层抽样拆分数据库
library(lattice) #绘图可视化包
library(gmodels) #卡方检验包
library(glmnet) #回归分析用包
library(Matrix) #矩阵运算用包
library(pROC) #ROC曲线用包
library(Hmisc) #列线图用包
#1.stats包的glm()函数
#1. 什么是R语言stats包?
#R语言stats包是R语言的一个核心包,几乎每个R用户都会使用它。
#它包含了丰富的统计分析函数,用于执行各种统计分析和数据处理任务。
#stats包是R语言中的一个基础包,它提供了一系列的函数和数据结构用于统计分析。
#这个包中的函数和数据类型对于R语言的学习者来说非常重要。
#2. R语言stats包提供的主要功能或函数
#stats包提供了多种统计分析功能,包括但不限于:
#线性回归:lm() 函数用于拟合线性模型。
#假设检验:t.test()、chisq.test()、anova() 等函数用于执行各种假设检验。
#方差分析(ANOVA):aov() 函数用于方差分析。
#分布函数:提供了多种概率分布的函数,
#如正态分布 (dnorm(), pnorm(), qnorm(), rnorm())、
#二项分布 (dbinom(), pbinom(), qbinom(), rbinom())、
#泊松分布 (dpois(), ppois(), qpois(), rpois()) 等。
#时间序列分析:acf()、pacf()、arima() 等函数用于时间序列分析。
#聚类分析:kmeans()、hclust() 等函数用于聚类分析。
#3. 如何安装和加载R语言stats包
#stats包是R的内置包,通常不需要单独安装。
#当你安装R时,stats包已经包含在内。你可以通过以下代码加载stats包(通常默认情况下会自动加载)
#4.在R语言中,glm()函数用于拟合广义线性模型(Generalized Linear Models,GLM)
#R语言中的glm()函数是一个强大的工具,
#用于拟合广义线性模型(Generalized Linear Models, GLM)。
#与普通的线性模型相比,GLM能够处理响应变量不是连续的情况,例如二项分布、泊松分布等,
#这使得它在统计分析中非常受欢迎,特别是对于非标准数据的建模和预测
library(stats)#通常默认情况下会自动加载
#使用stats包的glm()函数拟合logistic回归过程
logit.model <- glm(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,
data=data, family=binomial(link="logit"))
logit.model
summary(logit.model)
#选择输出效应值、置信区间及P值
logit.result <- as.data.frame(summary(logit.model)$coefficients[, c(1, 4)])
logit.result <- cbind(logit.result, confint(logit.model))
colnames(logit.result) <- c("Coef", "p", "CI_lower", "CI_upper")
logit.result
#多用来绘制ROC曲线
logit.pred.prob <- predict(logit.model, newdata=data, type="response")
par(las=1, cex.axis=.8)
logit.roc <- roc(
y ~ pred,
data=data.frame(y=data$结局, pred=logit.pred.prob),
plot=T, ci=T, main="ROC Curve of Logistic Regression",
print.auc=T, print.auc.cex=.8,
print.thres=T, print.thres.cex=.8,
auc.polygon=T, max.auc.polygon=T, grid=T)
#2.rms包的lrm()函数
#rms包是一个用于回归模型分析的R语言扩展包,提供了多种工具和函数,
#rms包(Regression Modeling Strategies)是一个用于建立和评估预测模型的R语言包,
#主要用于回归模型的拟合、分析和诊断。其主要功能包括:
#回归模型的拟合和分析:
#提供ols函数用于拟合普通最小二乘回归模型,
#lrm函数用于拟合逻辑回归模型,
#coxph函数用于拟合Cox比例风险模型等。
#模型选择和比较:
#通过不同的模型拟合方法,帮助用户选择最适合数据的模型。
#模型的可视化和解释:
#提供多种可视化工具,帮助用户更好地理解和解释模型结果。
library(rms)
dd<-datadist(data); options(datadist='ddist')
f_lrm <- lrm(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,
data=data,
x=TRUE, y=TRUE)
f_lrm
summary(f_lrm)
#绘制简单列线图
par(family="Prob of 结局")
plot(nomogram(f_lrm))
#或优化绘制列线图
par(mgp=c(1.6,0.6,0),mar=c(5,5,3,1))
nomogram <- nomogram(f_lrm,fun=function(x)1/(1+exp(-x)), fun.at=c(0.01,0.05,0.2,0.5,0.9,0.99),
funlabel ="Prob of 结局",
conf.int = F,
abbrev = F )
plot(nomogram)
#绘制校准曲线
cal1<-calibrate(f_lrm,method="boot", B=1000)
plot(cal1)
# 在图表的底部插入文本
mtext("C=0.965 LR.chi2=920.78 d.f.=6 Pr(> chi2) <0.0001", side=1, line=3)
# 计算C统计量及置信度
library(Hmisc)
Cindex <- rcorrcens(data$结局~f_lrm[["linear.predictors"]])
Cindex
se<-0.028/2
ul<-0.901+1.96*se
dl<-0.901-1.96*se
CI<-c(ul,dl)
# 输出C统计量及其置信度
print(Cindex)
print(CI)
#c指数等价于ROC曲线下面积,计算AUC及CI
library(pROC)
modelROC<-roc(data$结局,f_lrm[["linear.predictors"]])
auc(modelROC)
ci(auc(modelROC))
#3.使用caret包的train()函数进行logistic回归
#caret包(Classification And REgression Training)是一个在R语言中广泛使用的包,
#主要用于简化机器学习的工作流程。
#该包提供了统一的接口,整合了多种机器学习算法,
#并支持数据预处理、特征选择、模型训练和评估等功能。
#caret包因其功能丰富、易于使用而备受推崇,
#特别适合数据科学家和研究人员进行高效的机器学习任务。
#caret包的主要功能
#数据预处理:caret包提供了多种数据预处理方法,
#包括处理缺失值、异常值和离群点,
#以及进行特征选择和降维技术,
#帮助从原始数据中提取最相关和最有信息量的特征。
#特征选择:caret支持多种特征选择方法,
#如过滤法、包装法和嵌入法,帮助从大量特征中选择对模型有用的特征,
#提高模型的准确性和效率。
#模型训练和评估:caret支持多种机器学习算法,
#如线性回归、逻辑回归、决策树、随机森林、支持向量机等。
#它通过交叉验证、网格搜索等技术进行模型参数调优,
#并提供模型评估和比较的工具,如混淆矩阵、ROC曲线等。
#模型集成:caret支持模型集成方法,
#如投票法、堆叠法和混合法,以提高模型的泛化能力和鲁棒性。
#模型解释和可视化:caret提供方法和函数帮助解释和可视化模型结果,
#如绘制学习曲线、特征重要性图等。
#caret包在模型与参数优化上面的应用,主要函数就是train函数
#train()函数作为接口,可以选择评估方法和度量性指标,自动寻找最优的参数。
#主要考虑的问题:
#(1)训练哪种模型法,
#(2)模型中哪些参数可以调整,可以调整的空间多大,
#(3)选择评价的标资
caret包可实现的主要功能如下:
library(caret)
names(getModelInfo())
control <- trainControl(method="cv", number=10)
lg.model <- train(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,
data=data, method="glm",
family="binomial",
trControl=control)
lg.model
summary(lg.model)
# 基于训练集进行预测
predictions <- predict(model, newdata = data)
predictions
#绘制ROC曲线
par(las=1, cex.axis=.8)
logit.roc <- roc(
y ~ pred,
data=data.frame(y=data$结局, pred=predictions),
plot=T, ci=T, main="ROC Curve of Logistic Regression",
print.auc=T, print.auc.cex=.8,
print.thres=T, print.thres.cex=.8,
auc.polygon=T, max.auc.polygon=T, grid=T)
#根据最佳预测值对预测概率量化为预测结果
lg.pred <- ifelse(predictions>0.525,1,0)
lg.pred
# 可视化混淆矩阵
cm <- confusionMatrix(as.factor(lg.pred),
as.factor(data$结局))
cm
plot(cm$table,main="")
title(main = "Logistic Regression Confusion Matrix")
# 使用heatmap函数创建热图,并自定义颜色
plotcm <- matrix(c(464, 53, 36, 447), nrow=2)
heatmap(plotcm, col=colorRampPalette(c("blue", "white", "red"))(100),
Rowv=NA, Colv=NA,
main="Confusion Matrix Heatmap",
xlab="Predicted Class",
ylab="True Class",
dendrogram="none")
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!


