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

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

作者: TOP生物信息 | 来源:发表于2019-05-26 15:29 被阅读0次
    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.两个连续变量

    讨论方法同上

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/nwextctx.html