94.关于模型可视化和23.3.3练习题
知识学习
本部分供包含两个小部分:模型预测值和残差。讲述了一种通用的将模型以及残差可视化的方法。需要掌握:1)将模型可视化的思路;2)应用到的几个函数:data_grid(),基于原始数据集生成新的自变量数据集
、add_predictions(),向数据集中添加预测值
、add_residuals(),向数据集中添加残差
。
library(modelr)
# 使用lm()拟合模型,生成网格,得到预测值以及可视化
sim1_mod <- lm(y ~ x, data = sim1)
# 生成自变量x的唯一值, 如果data_grid()的第一个参数之后有多个变量
# 则会生成多个列为唯一值排列组合的结果
grid <- sim1 %>%
data_grid(x)
# 增加模型的预测值
grid <- grid %>%
add_predictions(sim1_mod)
# 绘制原始数据分布以及拟合直线,与"simple model"章节使用geom_abline()可视化相比
# 使用这种增加预测值并用geom_line()绘制的方法适用于各种复杂的模型
ggplot(sim1, aes(x)) +
geom_point(aes(y = y)) +
geom_line(aes(y = pred), data = grid, colour = "red", size = 1)
# 计算残差=original value - prediction
sim1 <- sim1 %>%
add_residuals(sim1_mod)
# 绘制残差的频率分布图(残差之和等于0)
p3<-ggplot(sim1, aes(resid)) +
# 绘制残差的散点分布图(越随机说明模型拟合效果越好)
ggplot(sim1, aes(x, resid)) +
geom_ref_line(h = 0) +
geom_point()
练习题
Q1: 使用loess()
拟合曲线,生成预测值并可视化,并与geom_smooth()
可视化的结果比较 。
sim2_mod <- loess(y ~ x, data = sim1)
grid2 <- sim1 %>%
data_grid(x)
grid2 <- grid2 %>%
add_predictions(sim2_mod)
p1<-ggplot(sim1, aes(x)) +
geom_point(aes(y = y)) +
geom_line(aes(y = pred), data = grid2, colour = "red", size = 1)
p2<- ggplot(sim1,aes(x,y)) + geom_point() +geom_smooth()
library(ggpubr)
# 与geom_smooth()似乎是等价的
ggarrange(p1,p2,nrow = 2,ncol = 1)
Q2:比较add_predictions()/spread_predictions()/gather_predictions()
的区别。
add_predictions(data, model, var = "pred", type = NULL)
spread_predictions(data, ..., type = NULL)
gather_predictions(data, ..., .pred = "pred", .model = "model", type = NULL)
add_predictions()
接受一个数据框和一个模型,向数据框中增加一列预测值,列名可通过var
参数设置,可通过type
参数设置预测值的类型(传递给stats:predict()
)。
spread_predictions()
和gather_predictions()
接受多个模型,向数据框中增加多个模型的值。
spread_predictions()
在列方向上增加,gather_predictions在行方向上增加(相当于pivot_longer()
或melt((spread_predictions的结果)
)。
Q3: geom_ref_line()做了什么?来自哪个包?为什么在残差图中展示一条参考线有用且重要?
geom_ref_line(h, v, size = 2, colour = "white")
来自modelr包,功能是增加一条参考线,可以更清楚地看到每个观察点的预测值额和实际值的差别以及整体分布。
Q4:与raw residulas相比,absolute residuals的frequency polygon图有什么优缺点?
p3<-ggplot(sim1, aes(resid)) +
geom_freqpoly(binwidth = 0.5)
p4<-ggplot(sim1, aes(abs(resid))) +
geom_freqpoly(binwidth = 0.5)
ggarrange(p3,p4,nrow = 2,ncol=1)
优点:可以看到预测值和实际值的绝对距离的分布情况。
缺点:看不到残差的对称分布,略微影响对模型性能好坏的判断。