大数跨境
0
0

【R语言】三种常用的logistic回归模型拟合方法及相关可视化实现

【R语言】三种常用的logistic回归模型拟合方法及相关可视化实现 医学统计数据分析
2025-01-07
1
导读:【R语言】三种常用的logistic回归模型拟合方法及相关可视化实现
logistic回归

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、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!




【声明】内容源于网络
0
0
医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
内容 323
粉丝 0
医学统计数据分析 分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
总阅读32
粉丝0
内容323