![7db6136f434288af5c61a801c599edde.png](https://i-blog.csdnimg.cn/blog_migrate/34da7028999a759f0a5e5c97cdefaa98.jpeg)
线性回归是十分好用的一种方法,然而在某些方面也存在一定的局限性,比如当因变量为分类变量时,使用线性回归就不是很恰当了,且纳入线性回归的变量需要满足符合正态分布的前提,否则对模型的结果也会产生影响。为了解决这些问题,统计学家们在线性模型的基础上了扩展出了GLM(广义线性模型)的概念,最早在1972年Nelder与Wedderburn首次于Journal of Royal Statistical Society上发表了关于广义线性模型的论文。本期对广义线性模型中的logistic回归略作介绍。
- 数据集简介
- 拟合模型
- Nomogram
- 模型的验证
- 写在最后
数据集简介
采用Kaggle竞赛中的Titanic数据集来进行演示
Titanic: Machine Learning from Disasterwww.kaggle.com
数据集包含以下变量
survival #是否幸存 0 = No, 1 = Yes
pclass #仓位等级 1 = 1st, 2 = 2nd, 3 = 3rd
sex #性别
Age #年级
sibsp #船上的亲人或配偶数量
parch #船上的父母或子女数量
ticket #票号
fare #船票价格
cabin #房间号
embarked #登船港口 C = Cherbourg, Q = Queenstown, S = Southampton
首先导入数据集并观察数据集是否存在缺失情况
titanic <- read.csv("train.csv")
library(VIM)
aggr(titanic,prop = FALSE,numbers = TRUE)
titanic <- na.omit(titanic)
![6146abaf32d4fe4fae448b7d7579bdec.png](https://i-blog.csdnimg.cn/blog_migrate/450e081026f8a82d6b1b3c30fd72cbbe.jpeg)
我们发现变量age存在一定的缺失,在这里为了方便直接删除掉存在缺失值的观测
ps.实际操作时要按实际情况对缺失值处理不同的处理方法
train <- titanic[1:642,]
test <- titanic[642:714,]
将数据集分为十份,取其中九份来拟合模型,一份来作为模型的外部验证集。
拟合模型
初步尝试一下拟合
fit1 <- glm(Survived~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked,data = train,family = "binomial")
fit2 <- step(fit1)
summary(fit2)
得到结果如下
Call:
glm(formula = Survived ~ Pclass + Sex + Age + SibSp, family = "binomial",
data = train)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.7728 -0.6471 -0.3902 0.6312 2.4287
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.282754 0.468506 9.141 < 2e-16 ***
Pclass2 -1.352993 0.296999 -4.556 5.23e-06 ***
Pclass3 -2.593091 0.296790 -8.737 < 2e-16 ***
Sexmale -2.593756 0.225920 -11.481 < 2e-16 ***
Age -0.044252 0.008515 -5.197 2.03e-07 ***
SibSp -0.371656 0.126608 -2.935 0.00333 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 868.93 on 641 degrees of freedom
Residual deviance: 579.15 on 636 degrees of freedom
AIC: 591.15
Number of Fisher Scoring iterations: 5
回归结果显示,仓位等级、性别、年龄、船上的亲人或配偶数量与生存与否之间的关联存在统计学意义(p<0.05)。
接下来计算OR值,看看关联的大小
> 1/exp(coef(fit2))
(Intercept) Pclass2 Pclass3 Sexmale Age SibSp
0.01380459 3.86898628 13.37103765 13.37993171 1.04524579 1.45013415
结果显示,一等舱乘客生存下来的概率是二等舱乘客的3.869倍,三等舱乘客的13.371倍,女性乘客生存下来的概率是男性乘客的13.380倍,且年龄越小、船上的亲人/配偶数量越少,生存几率越高。
在这里北京市交通委诚挚提醒您:道路千万条,安全第一条。出行带女友,亲人两行泪。
请你们出行之前思考清楚,带上了女朋友会极大的降低你的幸存概率,带的越多死的越快。手动狗头保命。
Nomogram
因为要用rms包画nomogram,我发现不能直接用在数据集里的变量来拟合模型,不然会报错,所以这里采用最弱智的方法把变量提取出来
library(rms)
survival <- train$Survived
pclass <- train$Pclass
sex <- train$Sex
age <- train$Age
sibsp <- train$SibSp
然后将数据打包成适合画nomogram的格式并用lrm函数拟合模型
ddist <- datadist(pclass,sex,age,sibsp)
options(datadist = 'ddist')
fit3 <- lrm(survival ~ pclass + sex + age + sibsp)
绘制nomogram
nom <- nomogram(fit3, fun=plogis,fun.at=c(.001, .01, .05, seq(.1,.9, by=.1), .95, .99, .999),lp=F, funlabel="Risk")
plot(nom)
得到如下nomogram(列线图)
![f85866bfd2a8e7961de3e0683b5a046f.png](https://i-blog.csdnimg.cn/blog_migrate/4a6433e56ed73f7fbc7292f80b2be794.jpeg)
如何看结果呢,只需要从每个变量值投射到point上得到这个变量的point,然后把每个变量的得分point加起来,得到toal point,再通total point上投射到下面的risk轴上,就是概率p了,在这里就是幸存下来的几率。
如果你是个80岁(0分)男性(0分),住三等舱(0分),船上有五个家人/配偶(0分),基本上凉透了,幸存的概率无限趋近于0。
如果你是0岁(100分)女性(72分),头等舱(72分),船上只有一个家人(42分),总分286分,那么你幸存下来的几率则大于95%。
写在最后
- 在本次演示中对一些变量是直接拿来用的,这是最简单粗暴的方法,其实为了提高预测的准确度还可以做很多变换,比如将年龄分段,分为儿童与成年人;还可以从姓名中提取出Mr,Dr,Major等能体现社会地位的称呼等等变换方式来尝试提高模型的预测精度。
- 在本次演示中直接使用step函数逐步回归得到最终模型,其实在实际建模中也要考虑变量的实际意义,有一些变量虽然不存在统计学意义,但是依据专业知识认为其很重要,也可以尝试将其纳入模型。
- 本期初步介绍logistic回归,使用nomogram来更直观的去理解模型,下一期的内容为logistic回归模型的验证,再下一期为关联规则与logistic回归中的交互项。
- 本期内容的参考资料主要为CSDN论坛里的帖子们,看的太多了没有记录就不在此一一贴出链接。