欢迎关注"如沐风科研"~~
[来源:Wikipedia]
一般来说,当因变量(y)为连续变量(Continuous variable)时,可以选择线性回归(R语言统计篇:简单线性回归)建立模型。
当因变量为分类变量(Categorical variable)时,可以选择Logistic回归。
例如因变量为无糖尿病vs有糖尿病,存活vs死亡,有效vs无效等等。
在这种情况下,使用Logistic回归会更加合适,此方法也属于广义线性模型(Generalized Linear Model)的一种,为线性回归的延伸。
这篇文章主要介绍二分类Logistic回归 (Binary logistic regression,即因变量只有两个水平(如:0和1)。如果因变量有二个分类以上或者存在等级顺序,则分别称为multinomial或者ordered logistic 回归,这些内容会在以后介绍。
好了,速速进入操作部分!


1. 如果强行使用线性回归会怎么样?

如果因变量为二分类变量,但是小编对线性回归情有独钟,非要选择线性回归建立模型,那会怎么样?有点霸王硬上弓的意思

为了回答这个问题,先创建几个数据用于模型的建立。
其中,outcome指代二分类的因变量(0和1),marker 指代血液里的一种标记物水平,为连续变量: 
logit_data
<
- data.frame(outcome = c(
0
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
),

                         marker = c(
1
:
9
15
))
logit_data
注:上图左侧1到10的数值指的是数据的行数。
一个最简单的数据就准备好了,接下来建立线性回归模型并且作图: 
linear_model <- lm(outcome ~ marker, data = logit_data)      
# 拟合线性回归

plot(y = logit_data$outcome, x = logit_data$marker,          
# 作图
     xlab = "
Marker
",

     ylab = "
Outcome (0 or 1)
")

abline(a = coef(linear_model)[
1
], b = coef(linear_model)[
2
])
# 拟合回归直线
仅用肉眼观察,我们模型的残差(Residual)比较大(手把手教你画出统计上极其重要的概念:残差),说明模型并不准确,提示二分类的数据其实并不适合使用线性回归。

2. Logistic 函数

从上图可以感觉到,面对上述的数据,理想的情况应该是找到一条垂直于x轴的直线,将两者(0 vs 1)分隔开,从而使线的左侧指代0,而右侧代表1,应该是这个样子: 
plot(y = logit_data$outcome, x = logit_data$marker,

     xlab = "
Marker
",

     ylab = "
Outcome (0 or 1)
")

abline(v =
4.6
)
从上可知,当marker = 4.6时(4到5皆可,这里小编取4.6),线的左侧代表0,而右侧代表1,这条直线将outcome进行了准确的分类。
因此,logistic回归是一种通过寻找marker中的某个值,从而对outcome(0 vs 1)做出最优归类的方法。
似乎…找到了通往logistic回归的一把钥匙!
那这条分割线是如何找到的呢?
首先大致了解下logsitic函数的历史
核心人物是比利时人口学家以及统计学家Pierre- Francois Verhulst,他在1838年至1847年发表了3篇学术论文,阐述了欧洲几个国家的人口增长情况,使用了一种数学函数来模拟人口的增长,发现此函数与人口增长的数据非常的接近,并且将这个函数命名为logistic函数
那为什么叫logistic函数?这个估计永远都搞不清楚了!在一篇关于logistic回归历史的文章中[1],Cramer在论文中写道:“
Here Verhulst names it the logistic, without further explanation
”。也就是说,它就叫“logistic”,你能拿我怎么滴!


现在是时候见一见logistic函数的庐山真面目了: 
小编知道,数学公式是最不受欢迎的
!那就在R里面解释并且画一条logistic曲线!
curve(1/(1 + exp(1
)^-
x
),

      from = -
10, to = 10
,

      xlab =
"
Input"
,

      ylab =
"
Probability")
有那么点意思了!上述的图片代表标准版本的logistic曲线,那如何将我们之前创建的数据outcome和marker套进去呢?那需要以下几步: 
1. 标准版logistic函数:
p = 1/[1 + exp(-y)]
2. 自己的数据:
y(outcome) = a + b*marker
3. 将2套入1中:
p = 1/[1 + exp(-(a + b*marker))]
4. 将3进行数学转化后:
p/(1-p) = exp(a+ b*marker)
5. 再进行log转化:
log[p/(1-p)] = a + b*marker
6. log[p/1-p]也称为log-odd或者logit
上述的过程不是第一遍就能够完全理解的,需要反复实践并理顺。不过操作部分就峰回路转了!与简单线性回归非常的类似(R语言统计篇:简单线性回归)!
这也是为什么称logistic回归是一种即简单又复杂的统计方法!

3. 建立Logistic回归模型

首先将“mtcars”数据集做一些改变,创建数据mydata,然后作图并且建立回归模型
library
(tidyverse)


mydata <- mtcars %>%

  mutate(outcome = am) %>% 
# 创建变量outcome,与am的值先相同
  mutate(marker = mpg) %>% 
# 创建变量marker,与mpg的值相同
  select(outcome, marker)


head(mydata)
注:左侧的英文名字可以忽略,指的是原数据集行的名称(车名)
下一步,制作logistic回归概率图: 
ggplot(mydata, aes(marker, outcome)) +

  geom_point(alpha =
0.3
) +

  geom_smooth(method = "
glm
", method.args = list(family = "
binomial
")) +

  labs(title = "
Logistic regression
",

       x = "
Maker
",

       y = "
Probability of being 1
") +

  theme_minimal()
S型曲线get!在上图中,横坐标为marker,纵坐标为outcome发生“1”事件的概率。
然后,建立logistic回归方程: 
logit_model <- glm(outcome ~ marker, data = mydata, family = "
binomial
")


summary(logit_model)
上述的输出结果大部分与线性回归非常相似,这里就不再重复,新来的小伙伴请查看往期文章(R语言统计篇:简单线性回归)。
但是,想要完全读懂上述结果,则需要明白三个概念:probabilityodds以及odds ratios(即我们熟悉的OR值


其中,下图可以帮助更好的理解
probability与odds之间的区别
(小编制作,建议收藏
): 

一张图片搞定两个重要概念!
OR值可以用来描述自变量(x)与因变量(y)之间的关系。假如x为一个分类变量,如抽烟情况(抽烟vs不抽烟),y为心肌梗死的发生与否(0和1)。假设抽烟人群中(x = 抽烟)发生心肌梗死的Odds为1.5,而非抽烟人群中的Odds为1,那么OR值就是1.5/1 = 1.5。也就是说,抽烟人群心肌梗死发生的Odds是非抽烟人群发生心机梗死的1.5倍。

回到我们的结果OR值也可以用来描述连续变量(marker)与因变量(outcome)的关系。marker的回归系数为0.307,那么它的OR值为exp(0.307) = 1.36。那么可以这么解释:每增加一个单位的marker值可以增加1.36倍此事件发生(outcome =1)的Odds
好啦!今天的内容就到这里。如果有帮助,记得分享给需要的人!
参考文献: 
[1] The Origins of Logistic Regression, J.S. Cramer
继续阅读
阅读原文