7.5 逻辑回归

7.5 逻辑回归

7.5.1 问题

你想要运用逻辑回归分析。

7.5.2 方案

逻辑回归典型使用于当存在一个离散的响应变量(比如赢和输)和一个与响应变量(也称为结果变量、因变量)的概率或几率相关联的连续预测变量的情况。它也适用于有多个预测变量的分类预测。

假设我们从内置的 mtcars 数据集的一部分开始,像下面这样,我们将 vs 作为响应变量,mpg 作为一个连续的预测变量,am 作为一个分类(离散)的预测变量。

data(mtcars)
dat <- subset(mtcars, select = c(mpg, am, vs))
dat
#>                      mpg am vs
#> Mazda RX4           21.0  1  0
#> Mazda RX4 Wag       21.0  1  0
#> Datsun 710          22.8  1  1
#> Hornet 4 Drive      21.4  0  1
#> Hornet Sportabout   18.7  0  0
#> Valiant             18.1  0  1
#> Duster 360          14.3  0  0
#> Merc 240D           24.4  0  1
#> Merc 230            22.8  0  1
#> Merc 280            19.2  0  1
#> Merc 280C           17.8  0  1
#> Merc 450SE          16.4  0  0
#> Merc 450SL          17.3  0  0
#> Merc 450SLC         15.2  0  0
#> Cadillac Fleetwood  10.4  0  0
#> Lincoln Continental 10.4  0  0
#> Chrysler Imperial   14.7  0  0
#> Fiat 128            32.4  1  1
#> Honda Civic         30.4  1  1
#> Toyota Corolla      33.9  1  1
#> Toyota Corona       21.5  0  1
#> Dodge Challenger    15.5  0  0
#> AMC Javelin         15.2  0  0
#> Camaro Z28          13.3  0  0
#> Pontiac Firebird    19.2  0  0
#> Fiat X1-9           27.3  1  1
#> Porsche 914-2       26.0  1  0
#> Lotus Europa        30.4  1  1
#> Ford Pantera L      15.8  1  0
#> Ferrari Dino        19.7  1  0
#> Maserati Bora       15.0  1  0
#> Volvo 142E          21.4  1  1

7.5.2.1 连续预测变量,离散响应变量

如果数据集有一个离散变量和一个连续变量,并且连续变量离散变量概率的预测器(就像直线回归中 x 可以预测 y 一样,只不过是两个连续变量,而逻辑回归中被预测的是离散变量),逻辑回归可能适用。

下面例子中,mpg 是连续预测变量,vs 是离散响应变量。.

## 执行逻辑回归 —— 下面两种方式等效
## logit是二项分布家族的默认模型
logr_vm <- glm(vs ~ mpg, data = dat, family = binomial)
logr_vm <- glm(vs ~ mpg, data = dat, family = binomial(link = "logit"))

查看模型信息:

## 输出模型信息
logr_vm
#>
#> Call:  glm(formula = vs ~ mpg, family = binomial(link = "logit"), data = dat)
#>
#> Coefficients:
#> (Intercept)          mpg
#>       -8.83         0.43
#>
#> Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
#> Null Deviance:       43.9
#> Residual Deviance: 25.5  AIC: 29.5

## 汇总该模型的更多信息
summary(logr_vm)
#>
#> Call:
#> glm(formula = vs ~ mpg, family = binomial(link = "logit"), data = dat)
#>
#> Deviance Residuals:
#>    Min      1Q  Median      3Q     Max
#> -2.213  -0.512  -0.228   0.640   1.698
#>
#> Coefficients:
#>             Estimate Std. Error z value Pr(>|z|)
#> (Intercept)   -8.833      3.162   -2.79   0.0052 **
#> mpg            0.430      0.158    2.72   0.0066 **
#> ---
#> Signif. codes:
#> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#>     Null deviance: 43.860  on 31  degrees of freedom
#> Residual deviance: 25.533  on 30  degrees of freedom
#> AIC: 29.53
#>
#> Number of Fisher Scoring iterations: 6
7.5.2.1.1 画图

我们可以使用 ggplot2 或者基本图形绘制数据和逻辑回归结果。

library(ggplot2)
ggplot(dat, aes(x = mpg, y = vs)) + geom_point() + stat_smooth(method = "glm",
  method.args = list(family = "binomial"), se = FALSE)

7.5 逻辑回归 - 图1


par(mar = c(4, 4, 1, 1))  # 减少一些边缘使得图形显示更好些
plot(dat$mpg, dat$vs)
curve(predict(logr_vm, data.frame(mpg = x), type = "response"),
  add = TRUE)

7.5 逻辑回归 - 图2

7.5.2.2 离散预测变量,离散响应变量

这个跟上面的操作大致相同,am 是一个离散的预测变量,vs 是一个离散的响应变量。

## 执行逻辑回归
logr_va <- glm(vs ~ am, data = dat, family = binomial)

## 打印模型信息
logr_va
#>
#> Call:  glm(formula = vs ~ am, family = binomial, data = dat)
#>
#> Coefficients:
#> (Intercept)           am
#>      -0.539        0.693
#>
#> Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
#> Null Deviance:       43.9
#> Residual Deviance: 43    AIC: 47

## 汇总模型的信息
summary(logr_va)
#>
#> Call:
#> glm(formula = vs ~ am, family = binomial, data = dat)
#>
#> Deviance Residuals:
#>    Min      1Q  Median      3Q     Max
#> -1.244  -0.959  -0.959   1.113   1.413
#>
#> Coefficients:
#>             Estimate Std. Error z value Pr(>|z|)
#> (Intercept)   -0.539      0.476   -1.13     0.26
#> am             0.693      0.732    0.95     0.34
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#>     Null deviance: 43.860  on 31  degrees of freedom
#> Residual deviance: 42.953  on 30  degrees of freedom
#> AIC: 46.95
#>
#> Number of Fisher Scoring iterations: 4
7.5.2.2.1 画图

尽管图形可能会比连续预测变量的信息少,我们还是可以使用 ggplot2 或者基本图形绘制逻辑数据和回归结果。因为数据点大致在 4 个位置,我们可以使用抖动点避免叠加。

library(ggplot2)
ggplot(dat, aes(x = am, y = vs)) + geom_point(shape = 1,
  position = position_jitter(width = 0.05, height = 0.05)) +
  stat_smooth(method = "glm", method.args = list(family = "binomial"),
    se = FALSE)

7.5 逻辑回归 - 图3

par(mar = c(4, 4, 1, 1))  # 减少一些边缘使得图形显示更好些
plot(jitter(dat$am, 0.2), jitter(dat$vs, 0.2))
curve(predict(logr_va, data.frame(am = x), type = "response"),
  add = TRUE)

7.5 逻辑回归 - 图4

7.5.2.3 连续和离散预测变量,离散响应变量

这跟先前的例子相似,这里 mpg 是连续预测变量,am 是离散预测变量,vs 是离散响应变量。

logr_vma <- glm(vs ~ mpg + am, data = dat, family = binomial)
logr_vma
#>
#> Call:  glm(formula = vs ~ mpg + am, family = binomial, data = dat)
#>
#> Coefficients:
#> (Intercept)          mpg           am
#>     -12.705        0.681       -3.007
#>
#> Degrees of Freedom: 31 Total (i.e. Null);  29 Residual
#> Null Deviance:       43.9
#> Residual Deviance: 20.6  AIC: 26.6

summary(logr_vma)
#>
#> Call:
#> glm(formula = vs ~ mpg + am, family = binomial, data = dat)
#>
#> Deviance Residuals:
#>     Min       1Q   Median       3Q      Max
#> -2.0589  -0.4454  -0.0876   0.3333   1.6841
#>
#> Coefficients:
#>             Estimate Std. Error z value Pr(>|z|)
#> (Intercept)  -12.705      4.625   -2.75    0.006 **
#> mpg            0.681      0.252    2.70    0.007 **
#> am            -3.007      1.599   -1.88    0.060 .
#> ---
#> Signif. codes:
#> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#>     Null deviance: 43.860  on 31  degrees of freedom
#> Residual deviance: 20.646  on 29  degrees of freedom
#> AIC: 26.65
#>
#> Number of Fisher Scoring iterations: 6

7.5.2.4 有交互项的多个预测变量

当有多个预测变量时我们可能需要检验交互项。交互项可以单独指定,像 a + b + c + a:b + b:c + a:b:c,或者它们可以使用 a _b_ c 自动展开(这两种等效)。如果只是想指定部分可能的交互项,比如 a 与 c 有交互项,使用 a + b + c + a:c。

## 执行逻辑回归,下面两种方式等效
logr_vmai <- glm(vs ~ mpg * am, data = dat, family = binomial)
logr_vmai <- glm(vs ~ mpg + am + mpg:am, data = dat, family = binomial)

logr_vmai
#>
#> Call:  glm(formula = vs ~ mpg + am + mpg:am, family = binomial, data = dat)
#>
#> Coefficients:
#> (Intercept)          mpg           am       mpg:am
#>     -20.478        1.108       10.106       -0.664
#>
#> Degrees of Freedom: 31 Total (i.e. Null);  28 Residual
#> Null Deviance:       43.9
#> Residual Deviance: 19.1  AIC: 27.1

summary(logr_vmai)
#>
#> Call:
#> glm(formula = vs ~ mpg + am + mpg:am, family = binomial, data = dat)
#>
#> Deviance Residuals:
#>     Min       1Q   Median       3Q      Max
#> -1.7057  -0.3112  -0.0482   0.2804   1.5560
#>
#> Coefficients:
#>             Estimate Std. Error z value Pr(>|z|)
#> (Intercept)  -20.478     10.553   -1.94    0.052 .
#> mpg            1.108      0.577    1.92    0.055 .
#> am            10.106     11.910    0.85    0.396
#> mpg:am        -0.664      0.624   -1.06    0.288
#> ---
#> Signif. codes:
#> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#>     Null deviance: 43.860  on 31  degrees of freedom
#> Residual deviance: 19.125  on 28  degrees of freedom
#> AIC: 27.12
#>
#> Number of Fisher Scoring iterations: 7