在R中,formula提供了一种获得"special behavior"的一般方法,不是立刻计算变量的值,而是捕获它们以便它们能被函数解释。
R中大多数建模函数都使用从formulas到functions的标准转换。
例如:y~x
被转换成y = a_0 + a_1 * x
例如:y~x1+x2
被转换成y= a_0 + a_1*x1 + a_2*x2
例如:y~x1*x2(等价于y~x1+x2+x1:x2)
被转换成y=a_0 + a_1*x1 + a_2*x2 + a_12*x1*x2
例如:y~x1+x2 %in% x1(等价于y~x1+x1:x2)
被转换成y=a_0+a_12*x1*x2
formula中各种符号的意义与运算符中有很大的不同,推荐英文版教程,引自datacamp,对应其他中文解析,引自知乎。
如果想看R实际上做了什么,可以通过model_matrix()
函数:它接受一个数据框和一个模型,返回一个定义了model equation 的tibble,tibble中每一列代表与模型相关的一个系数。(我其实不能理解这个函数,也许时间会改变一切。)
R中的变量有连续型变量和离散型变量之分,建模时要理清以下几种情况:1)离散型变量在建模时时如何处理的?2)变量之间的相互作用:离散型变量和连续型变量之间、两个连续型变量之间。
离散型变量
当变量是连续型的时候,从公式生成函数是很简单的,但当变量是离散型的时候,事情便有些复杂,因为离散型的值不能直接带入公式进行数学运算。此时的处理方式就是将离散型变量变成连续的,例如可以将性别中的male=1,female=0。
幸运的是,当你关于可视化预测值时,并不需要担心确切的参数化。
用modelr中
的`sim2!数据集构建线性模型:
# 对分类变量x,从formula生成一个函数
ggplot(sim2) +
geom_point(aes(x, y))
mod2 <- lm(y ~ x, data = sim2)
# 在数据框中加入预测值
grid <- sim2 %>%
data_grid(x) %>%
add_predictions(mod2)
# 可视化:当自变量是分类型变量时,模型将预测每个分类变量的平均值,原因是mean可以最小化root-mean-squared distance
ggplot(sim2, aes(x)) +
geom_point(aes(y = y)) +
geom_point(data = grid, aes(y = pred), colour = "red", size = 4)
连续型变量和离散型变量之间的交互作用
# 用两个可能的模型拟合数据
mod1 <- lm(y ~ x1 + x2, data = sim3)
mod2 <- lm(y ~ x1 * x2, data = sim3) #考虑两个自变量之间的交互作用
# 得到预测值
grid3 <- sim3 %>%
data_grid(x1, x2) %>%
gather_predictions(mod1, mod2)
# 可视化原始值和预测结果:"+"模型每条线有相同的斜率和不同的截距,"*"模型的斜率和截距都不相同
ggplot(sim3, aes(x1, y, colour = x2)) +
geom_point() +
geom_line(data = grid3, aes(y = pred)) +
facet_wrap(~ model)
# 模型的好坏可以用残差来比较
sim3 <- sim3 %>%
gather_residuals(mod1, mod2)
# 结果显示:mod2的残差几乎没有什么规律,
ggplot(sim3, aes(x1, resid, colour = x2)) +
geom_point() +
facet_grid(model ~ x2)
两个连续型变量之间的相互作用
探索两个连续型变量之间的相互作用,过程跟上述离散型变量和连续型变量治疗相互作用的方式基本一样。
mod3 <- lm(y ~ x1 + x2, data = sim4)
mod4 <- lm(y ~ x1 * x2, data = sim4)
grid <- sim4 %>%
data_grid(
x1 = seq_range(x1, 5),
x2 = seq_range(x2, 5)
) %>%
gather_predictions(mod3, mod4)
# 因为是两个连续型变量,因此可以想象他们和预测结果是一个3D界面
# 用geom_tile()对模型进行可视化
# 以预测值填充颜色
# 缺点是难以看出两个模型的不同
ggplot(grid, aes(x1, x2)) +
geom_tile(aes(fill = pred)) +
facet_wrap(~ model)
# 换另一种方式进行可视化
ggplot(grid, aes(x1, pred, colour = x2, group = x2)) +
geom_line() +
facet_wrap(~ model)
ggplot(grid, aes(x2, pred, colour = x1, group = x1)) +
geom_line() +
facet_wrap(~ model)
# 可以看到两个连续型变量之间相互作用的方式与离散和连续型变量治疗相互作用的方式相同。
很难可视化三个甚至多个连续型变量的相互作用,但本书中的可视化仅用于探索数据。我们不必要可视化所有模型,只探索而已。
网友评论