7.5 逻辑回归

7.5.1 问题

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

7.5.2 方案

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

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

  1. data(mtcars)
  2. dat <- subset(mtcars, select = c(mpg, am, vs))
  3. dat
  4. #> mpg am vs
  5. #> Mazda RX4 21.0 1 0
  6. #> Mazda RX4 Wag 21.0 1 0
  7. #> Datsun 710 22.8 1 1
  8. #> Hornet 4 Drive 21.4 0 1
  9. #> Hornet Sportabout 18.7 0 0
  10. #> Valiant 18.1 0 1
  11. #> Duster 360 14.3 0 0
  12. #> Merc 240D 24.4 0 1
  13. #> Merc 230 22.8 0 1
  14. #> Merc 280 19.2 0 1
  15. #> Merc 280C 17.8 0 1
  16. #> Merc 450SE 16.4 0 0
  17. #> Merc 450SL 17.3 0 0
  18. #> Merc 450SLC 15.2 0 0
  19. #> Cadillac Fleetwood 10.4 0 0
  20. #> Lincoln Continental 10.4 0 0
  21. #> Chrysler Imperial 14.7 0 0
  22. #> Fiat 128 32.4 1 1
  23. #> Honda Civic 30.4 1 1
  24. #> Toyota Corolla 33.9 1 1
  25. #> Toyota Corona 21.5 0 1
  26. #> Dodge Challenger 15.5 0 0
  27. #> AMC Javelin 15.2 0 0
  28. #> Camaro Z28 13.3 0 0
  29. #> Pontiac Firebird 19.2 0 0
  30. #> Fiat X1-9 27.3 1 1
  31. #> Porsche 914-2 26.0 1 0
  32. #> Lotus Europa 30.4 1 1
  33. #> Ford Pantera L 15.8 1 0
  34. #> Ferrari Dino 19.7 1 0
  35. #> Maserati Bora 15.0 1 0
  36. #> Volvo 142E 21.4 1 1

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

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

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

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

查看模型信息:

  1. # 输出模型信息
  2. logr_vm
  3. #>
  4. #> Call: glm(formula = vs ~ mpg, family = binomial(link = "logit"), data = dat)
  5. #>
  6. #> Coefficients:
  7. #> (Intercept) mpg
  8. #> -8.83 0.43
  9. #>
  10. #> Degrees of Freedom: 31 Total (i.e. Null); 30 Residual
  11. #> Null Deviance: 43.9
  12. #> Residual Deviance: 25.5 AIC: 29.5
  13. # 汇总该模型的更多信息
  14. summary(logr_vm)
  15. #>
  16. #> Call:
  17. #> glm(formula = vs ~ mpg, family = binomial(link = "logit"), data = dat)
  18. #>
  19. #> Deviance Residuals:
  20. #> Min 1Q Median 3Q Max
  21. #> -2.213 -0.512 -0.228 0.640 1.698
  22. #>
  23. #> Coefficients:
  24. #> Estimate Std. Error z value Pr(>|z|)
  25. #> (Intercept) -8.833 3.162 -2.79 0.0052 **
  26. #> mpg 0.430 0.158 2.72 0.0066 **
  27. #> ---
  28. #> Signif. codes:
  29. #> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  30. #>
  31. #> (Dispersion parameter for binomial family taken to be 1)
  32. #>
  33. #> Null deviance: 43.860 on 31 degrees of freedom
  34. #> Residual deviance: 25.533 on 30 degrees of freedom
  35. #> AIC: 29.53
  36. #>
  37. #> Number of Fisher Scoring iterations: 6
7.5.2.1.1 画图

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

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

7.5 逻辑回归 - 图1

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

7.5 逻辑回归 - 图2

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

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

  1. # 执行逻辑回归
  2. logr_va <- glm(vs ~ am, data = dat, family = binomial)
  3. # 打印模型信息
  4. logr_va
  5. #>
  6. #> Call: glm(formula = vs ~ am, family = binomial, data = dat)
  7. #>
  8. #> Coefficients:
  9. #> (Intercept) am
  10. #> -0.539 0.693
  11. #>
  12. #> Degrees of Freedom: 31 Total (i.e. Null); 30 Residual
  13. #> Null Deviance: 43.9
  14. #> Residual Deviance: 43 AIC: 47
  15. # 汇总模型的信息
  16. summary(logr_va)
  17. #>
  18. #> Call:
  19. #> glm(formula = vs ~ am, family = binomial, data = dat)
  20. #>
  21. #> Deviance Residuals:
  22. #> Min 1Q Median 3Q Max
  23. #> -1.244 -0.959 -0.959 1.113 1.413
  24. #>
  25. #> Coefficients:
  26. #> Estimate Std. Error z value Pr(>|z|)
  27. #> (Intercept) -0.539 0.476 -1.13 0.26
  28. #> am 0.693 0.732 0.95 0.34
  29. #>
  30. #> (Dispersion parameter for binomial family taken to be 1)
  31. #>
  32. #> Null deviance: 43.860 on 31 degrees of freedom
  33. #> Residual deviance: 42.953 on 30 degrees of freedom
  34. #> AIC: 46.95
  35. #>
  36. #> Number of Fisher Scoring iterations: 4
7.5.2.2.1 画图

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

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

7.5 逻辑回归 - 图3

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

7.5 逻辑回归 - 图4

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

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

  1. logr_vma <- glm(vs ~ mpg + am, data = dat, family = binomial)
  2. logr_vma
  3. #>
  4. #> Call: glm(formula = vs ~ mpg + am, family = binomial, data = dat)
  5. #>
  6. #> Coefficients:
  7. #> (Intercept) mpg am
  8. #> -12.705 0.681 -3.007
  9. #>
  10. #> Degrees of Freedom: 31 Total (i.e. Null); 29 Residual
  11. #> Null Deviance: 43.9
  12. #> Residual Deviance: 20.6 AIC: 26.6
  13. summary(logr_vma)
  14. #>
  15. #> Call:
  16. #> glm(formula = vs ~ mpg + am, family = binomial, data = dat)
  17. #>
  18. #> Deviance Residuals:
  19. #> Min 1Q Median 3Q Max
  20. #> -2.0589 -0.4454 -0.0876 0.3333 1.6841
  21. #>
  22. #> Coefficients:
  23. #> Estimate Std. Error z value Pr(>|z|)
  24. #> (Intercept) -12.705 4.625 -2.75 0.006 **
  25. #> mpg 0.681 0.252 2.70 0.007 **
  26. #> am -3.007 1.599 -1.88 0.060 .
  27. #> ---
  28. #> Signif. codes:
  29. #> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  30. #>
  31. #> (Dispersion parameter for binomial family taken to be 1)
  32. #>
  33. #> Null deviance: 43.860 on 31 degrees of freedom
  34. #> Residual deviance: 20.646 on 29 degrees of freedom
  35. #> AIC: 26.65
  36. #>
  37. #> Number of Fisher Scoring iterations: 6

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

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

  1. # 执行逻辑回归,下面两种方式等效
  2. logr_vmai <- glm(vs ~ mpg * am, data = dat, family = binomial)
  3. logr_vmai <- glm(vs ~ mpg + am + mpg:am, data = dat, family = binomial)
  4. logr_vmai
  5. #>
  6. #> Call: glm(formula = vs ~ mpg + am + mpg:am, family = binomial, data = dat)
  7. #>
  8. #> Coefficients:
  9. #> (Intercept) mpg am mpg:am
  10. #> -20.478 1.108 10.106 -0.664
  11. #>
  12. #> Degrees of Freedom: 31 Total (i.e. Null); 28 Residual
  13. #> Null Deviance: 43.9
  14. #> Residual Deviance: 19.1 AIC: 27.1
  15. summary(logr_vmai)
  16. #>
  17. #> Call:
  18. #> glm(formula = vs ~ mpg + am + mpg:am, family = binomial, data = dat)
  19. #>
  20. #> Deviance Residuals:
  21. #> Min 1Q Median 3Q Max
  22. #> -1.7057 -0.3112 -0.0482 0.2804 1.5560
  23. #>
  24. #> Coefficients:
  25. #> Estimate Std. Error z value Pr(>|z|)
  26. #> (Intercept) -20.478 10.553 -1.94 0.052 .
  27. #> mpg 1.108 0.577 1.92 0.055 .
  28. #> am 10.106 11.910 0.85 0.396
  29. #> mpg:am -0.664 0.624 -1.06 0.288
  30. #> ---
  31. #> Signif. codes:
  32. #> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  33. #>
  34. #> (Dispersion parameter for binomial family taken to be 1)
  35. #>
  36. #> Null deviance: 43.860 on 31 degrees of freedom
  37. #> Residual deviance: 19.125 on 28 degrees of freedom
  38. #> AIC: 27.12
  39. #>
  40. #> Number of Fisher Scoring iterations: 7