R学习笔记(12):以线性模型为例讲解预测模型(下)

2019-05-26  本文已影响0人  TOP生物信息
library(modelr)
library(tidyverse)
library(ggplot2)
options(na.action = na.warn)

1.分类变量

如果x是分类变量,lm()会怎么处理呢?

> sim2 <- sim2
> ggplot(sim2)+geom_point(aes(x,y))
> mod2 <- lm(y ~ x, data = sim2)
> grid <- sim2 %>% data_grid(x) %>% add_predictions(mod2)
> grid
# A tibble: 4 x 2
  x      pred
  <chr> <dbl>
1 a      1.15
2 b      8.12
3 c      6.13
4 d      1.91
> ggplot(sim2,aes(x))+geom_point(aes(y = y)) + geom_point(data = grid, aes(y = pred), color = "red", size = 4)

这种情况下会对每个分类变量分别求出平均值。
同时注意不能对未观测到的水平进行预测,如下所示:

> tibble(x = "b") %>% add_predictions(mod2)
# A tibble: 1 x 2
  x      pred
  <chr> <dbl>
1 b      8.12
> tibble(x = "e") %>% add_predictions(mod2)
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
  factor x has new level e

2.连续变量与分类变量组合

> sim3 <- sim3
> ggplot(sim3,aes(x1, y)) + geom_point(aes(color = x2))

使用lm()来拟合数据

> mod1 <- lm(y ~ x1 + x2, data = sim3)
> mod2 <- lm(y ~ x1 * x2, data = sim3)

y ~ x1 + x2y ~ x1 * x2这两个公式的含义截然不同:前者会分开考虑x1和x2两个变量;后者会将公式转换为y = a_0+a_1 * x1 + a_2 * x2 + a12 * x1 * x2。
生成预测值

> grid <- sim3 %>% data_grid(x1, x2) %>% gather_predictions(mod1,mod2) #spread_predictions()也有相同的功能,只不过在数据框格式上有差别:x1  x2  mod1_pred  mod2_pred
> head(grid)
# A tibble: 6 x 4
  model    x1 x2     pred
  <chr> <int> <fct> <dbl>
1 mod1      1 a      1.67
2 mod1      1 b      4.56
3 mod1      1 c      6.48
4 mod1      1 d      4.03
5 mod1      2 a      1.48
6 mod1      2 b      4.37

> ggplot(sim3, aes(x1, y, color = x2)) + geom_point() + geom_line(data = grid, aes(y = pred)) + facet_wrap(~ model)

哪个模型更好?可以检验一下残差。(添加残差是在原始数据框上面操作)

> sim3 <- sim3 %>% gather_residuals(mod1,mod2)
> head(sim3)
# A tibble: 6 x 7  #多了两列
  model    x1 x2      rep      y    sd  resid
  <chr> <int> <fct> <int>  <dbl> <dbl>  <dbl>
1 mod1      1 a         1 -0.571     2 -2.25 
2 mod1      1 a         2  1.18      2 -0.491
3 mod1      1 a         3  2.24      2  0.562
4 mod1      1 b         1  7.44      2  2.87 
5 mod1      1 b         2  8.52      2  3.96 
6 mod1      1 b         3  7.72      2  3.16

> ggplot(sim3, aes(x1, resid, color = x2)) + geom_point() + facet_grid(model ~ x2)  #facet_grid()和facet_wrap()有什么区别?

根据残差的分布可知mod2更好一些,mod1中b分类显然还有模式(“模式”二字简单理解为能用数学式表示的某种趋势或关系)没有提炼出来

3.两个连续变量

讨论方法同上

上一篇下一篇

猜你喜欢

热点阅读