郑老师团队直播课
在经典的影响因素分析中,Logistic回归是最常用的模型之一。
但也有细心的朋友会发现,在机器学习构建预测模型文章中,也经常出现Logistic回归。
接着上一篇,今天我们将介绍线性回归模型中的对数几率回归模型,也就是我们所说的Logistic回归模型。
本篇将从Logistic回归模型背后的思想、模型的具体形式讲起,并通过案例结合R代码的方法,讲解基于Logistic回归模型的危险因素分析以及预测模型的构建。
最后,对该模型的优缺点进行说明。
Logistic回归模型理论背景
Logistic回归模型其实就是在一般线性回归模型的基础上增加了一个连接函数(link function)(这个连接函数后面会讲到),使得模型能够用于二分类结局数据的分析。
因此,要想理解Logistic回归,我们可以先回顾一下上篇一般线性回归模型,多变量线性回归模型的方程式是
在式子中,表示当自变量固定式时,因变量的模型期望值,它是一个实数,理论上范围可以在负无穷大至正无穷大。
对于一个二分类任务,我们希望模型的输出就只有两个类别,例如要么输出0要么输出1。
当小于某个值,比如小于0,结果就输出为0; 大于0结果就输出为1; 等于0就可以任意判别。
单位阶跃函数的表达式和图形表示见图1。
图1 单位阶跃函数表达式和图形
但从图1可以看到这样的函数并不连续,无法进行求导,这会导致无法有效求解模型参数。
因此我们希望找到一个近似于单位阶跃函数的替代函数,要求该函数可以求导并且单调递增。
Sigmoid函数正能够满足这些条件,因此可以选它作为连接函数,它的函数表达式和图形见图2。
图2 Sigmoid函数表达式和图形
Sigmoid函数将值转化成0到1范围之内的值,
越大输出值越接近1, 越小输出值越接近0, 并且输出值以点(0, 0.5)为中心呈现出S形变化。
我们把代入Sigmoid函数的表达式,得到
该式就是Logistic回归模型的函数形式。
我们也可以对这个式子进行对数变换,改写成下面的函数形式
我们看等号的左端部分:
P可以看成个体被归类为阳性的概率, 1-P则可以看成个体被归类为阴性的概率, 那么反映了个体被归类为阳性的相对可能性,称为“几率”(odds)。
将几率取对数则得到“对数几率”(log odds),也称为P的logit变换,记作。
因此,其对应的模型称为对数几率回归模型或Logistic回归模型。
从上面两个式子可以看出,Logistic回归模型实际上就是在用线性回归模型的因变量拟合值去逼近因变量真实值的对数几率。
Logistic模型中自变量的偏回归系数是我们重点关注的,在医学研究中有重要的意义; 它的含义是当控制其它自变量在同一水平的情况下,自变量变化一个单位时的平均变化量。
与衡量危险因素作用大小的比值比,也叫做优势比(odds ratio,OR)之间有对应关系,这里直接给出关系式
和表示的两个不同取值。
如果假设只有两个取值,1表示暴露,0表示非暴露,那么暴露组和非暴露组发生结果事件的优势比为
要是,那么,代表对结果发生没有作用; 要是,那么,代表是结果事件的危险因素; 要是,那么,代表是结果事件的保护因素。
至于Logistic回归模型中的求解,交给软件就好了。
R中glm()函数的默认参数求解算法是最大似然法,该方法的思想大致上是让实际为阳性的个体被模型预测为阳性的概率以及实际为阴性的个体被模型预测为阴性的概率在整个数据人群上整体尽可能大,此外梯度下降法、牛顿法等也都可以求解。
写到这里,我们基本讲清了Logistic模型的由来,模型的具体形式以及模型中的重要参数和具体解释。
下面我们将通过一个实例利用R语言进行基于Logistic回归模型的危险因素分析,计算OR值,并利用统计显著的因素构建Logistic回归预测模型。
R语言案例分析
(一)危险因素分析
我们对MASS包中的biopsy数据进行分析,该数据集由699个乳腺癌患者组织样本的数据构成,收集了患者的肿瘤细胞特征和肿瘤的良恶性诊断结果。我们先简单看一下数据。
> library(MASS)
> data(biopsy)
> str(biopsy)
> head(biopsy)
数据集中共有11个变量,ID是样本编码; V1~V9都是肿瘤细胞的特征,研究者对所有个体的这些细胞特征进行了评分,分值在1-10,分值越高代表和正常细胞的差别越大(特征包括细胞浓度、细胞大小均匀度、细胞形状均匀度、边缘黏着度、单上皮细胞大小、裸细胞核、平和染色质、正常核仁、有丝分裂状态); class是肿瘤良恶性诊断结果,“benign”是良性,“malignant”是恶性,该变量是我们分析的结果变量。
我们先对数据做一些必要的预处理,
> library(dplyr)
> biopsy_2 <- biopsy %>%
> select(-ID) %>% #去掉id列;
> filter(complete.cases(.)) %>% #去掉变量有缺失值的观测;
> mutate(class=ifelse(class=="malignant",1,0)) %>% #改变结果变量的赋值,便于之后的分析;
> rename(nd=V1, jyd.size=V2, jyd.shape=V3,
> nzd=V4, size.dsp=V5, lxbh=V6,
> rsz=V7, hr=V8, ysfl=V9) #改变细胞特征变量的变量名,方便后面查看;
清洗后有683条观测纳入。
接下来我们以class为因变量,肿瘤细胞特征为自变量,构建Logistic回归模型进行肿瘤良恶性危险因素分析,代码和分析结果如下。
> fit.logistic <- glm(class~., data = biopsy_2, family = binomial())
> summary(fit.logistic)
红框是分析结果的关注重点,Estimate对应的是自变量偏回归系数的估计值,Pr(>|z|)是偏回归系数的假设检验P值。
从结果中可以看到除了细胞大小均匀度外,其它细胞特征的评分都和恶性肿瘤呈正相关,在这些特征中统计显著(P<0.05)的特征包括细胞浓度nd、细胞黏着度nzd、裸细胞核lxbh、平和染色质phrsz。
summary()函数并不会给出自变量的OR值估计,我们可以用下面的代码得到。
> options(digits = 4)
> exp(coef(fit.logistic))
以细胞浓度nd为例,,提示细胞浓度是肿瘤为恶性的一个危险因素,表示在固定其它自变量取值的情况下,细胞浓度的评分每增加一个单位,肿瘤为恶性的可能性增加1.71倍。
(二)预测模型构建和效果评价
得到统计显著的风险因素后,我们可以用这些因素来构架一个Logistic回归预测模型,当然你也可以选择用P<0.1的或者所有的自变量来构建。
我们随机抽70%的数据作为训练集来构建Logistic回归预测模型,再用剩下的30%数据作为测试集来检验模型的预测效果。
代码如下
> set.seed(2024) #设置随机种子数,用于复现结果
> index.train <- sample(1:nrow(biopsy_2), 0.7*nrow(biopsy_2)) #训练集的观测索引
> index.test <- setdiff(1:nrow(biopsy_2),index.train) #测试集的观测索引
> data.train <- biopsy_2[index.train, ] #训练集
> data.test <- biopsy_2[index.test, ] #测试集
> fit.train <- glm(class~., data = data.train, family = binomial()) #构建Logistic回归预测模型
> predicted_probs.test <- predict(fit.train, newdata = data.test,
> type = "response") #对测试集进行预测
代码中fit.train就是我们利用训练集构建的Logistic回归预测模型;
predicted_probs.test就是测试集中每一条观测的肿瘤预测为恶性的概率,如果想要预测值是是否为恶性肿瘤,我们可以卡一个界值,最常用的是0.5,就可以得到这些观测的结果预测值了。
> predicted_outcome.test <- ifelse(predicted_probs.test>0.5,"malignant","benign")
> predicted_outcome.test
AUC是模型的灵敏度和特异度这两个指标的综合指标,简单来说就是通过这一个指标就能够反映出模型将阳性样本鉴别为阳性,将阴性样本鉴别为阴性的综合能力。
AUC的取值在0.5~1,该值越大表示模型的预测能力越强,一般认为
AUC = 0.5:模型的分类能力相当于随机猜测,表示模型没有预测能力; 0.5 < AUC < 0.7:模型的预测能力较差,但比随机猜测好; 0.7 ≤ AUC < 0.8:模型的预测能力可以接受或者说较好; 0.8 ≤ AUC < 0.9:模型的预测能力良好; AUC ≥ 0.9:模型的预测能力很好。
> roc_curve <- roc(data.test$class, predicted_probs.test) #构建操作者特征曲线
> auc_value <- auc(roc_curve) #计算AUC值
> print(paste("AUC值:", auc_value)) #输出AUC值
结果显示Logistic回归预测模型的AUC是0.996,说明模型有很好的预测能力。
我们可视化操作者特征曲线以直观理解AUC。
> plot(roc_curve, main = "ROC曲线", col = "blue",
> lwd = 2, lty = 1,
> xlab = "特异度 (Specificity)", ylab = "灵敏度 (Sensitivity)",
> print.auc = TRUE, grid = TRUE)
图3. 预测模型的操作者特征曲线图
操作者特征曲线图的横坐标是特异度,纵坐标是灵敏度,蓝线就是操作者特征曲线,蓝线和坐标轴围成的面积就是AUC。
优点
4.可解释性强:通过模型系数得到的OR值可以解释为变量的影响强度,对于帮助政策制定等具有很好的解释性。
缺点
3.需要人为指定模型具体形式:无法自动捕捉自变量间的非线性关系等,当自变量间关系较复杂时,例如存在较多交互项、非线性项,指定合适的模型形式将十分困难。此时往往会出现模型的预测效果不佳。
√总结
综上,我们讲解了Logistic回归模型的原理、模型具体形式和模型的优缺点,并通过一个案例用R语言演示了基于Logistic回归模型的危险因素分析和预测模型构建及评价,大家可以跟着实践起来。
今天的文章就介绍到这里,对本机器学习系列推文有任何建议、想法都欢迎在文末踊跃留言哈,笔者会广泛吸收、不断改进。
关于郑老师统计团队及公众号