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 + x2
,y ~ 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.两个连续变量
讨论方法同上
网友评论