18.2.1 价格与重量
发现质量差的钻石价格更高可能是受混淆变量——carat(钻石重量)的影响
ggplot(diamonds,aes(carat,price))+
geom_hex(bins=50)
geom_hex()运行必须要有hexbin包。并不报错,只是出不来图,需要自行安装。
image.png
调整数据集再分析
调整数据集:
1、筛选数据集,选取多而集中的部分,这里选取carat <2.5 的97%数据
2、 对连续性变量对数转化——可以使模型变为线性
diamonds2 <- diamonds %>%
filter(carat<= 2.5) %>%
mutate(lprice=log2(price),lcarat= log2(carat))
ggplot(diamonds2,aes(lcarat,lprice))+
geom_hex(bins=50)
image.png
。。。为啥我有个虚线????
拟合模型
mod_diamond <- lm(lprice~lcarat,data = diamonds2)
可视化检查模型:将预测值覆盖在原始数据上
- 常规的操作是将预测值添加到网格中可视化,这里模型中所用的是对数转换的变量。因此代入预测值时需要反向变换还原对数转换
grid <- diamonds2 %>%
data_grid(carat=seq_range(carat,20)) %>%
mutate(lcarat = log2(carat)) %>%
add_predictions(mod_diamond,"lprice") %>%
mutate(price = 2 ^ lprice)
> ggplot(diamonds2,aes(carat,price))+
+ geom_hex(bins=50)+
+ geom_line(data = grid,color="red",size=1)
image.png
检验残差
> diamonds2 <- diamonds2 %>%
+ add_residuals(mod_diamond,"lresid")
> ggplot(diamonds2,aes(lcarat,lresid))+
+ geom_hex(bins=50)
> ggplot(diamonds2,aes(cut,lresid)) + geom_boxplot()
> ggplot(diamonds2,aes(color,lresid)) + geom_boxplot()
> ggplot(diamonds2,aes(clarity,lresid)) + geom_boxplot()
image.png
image.png
image.png
image.png
18.2.2 一个更复杂的模型
- 建立多因素线性模型
mod_diamond2 <- lm(lprice ~ lcarat + color + cut + clarity, data = diamonds2)
- 可视化——这里有4个因素,可以分别可视化
> ggplot(grid,aes(cut,pred))+
+ geom_point()
> grid <- diamonds2 %>%
+ data_grid(cut, .model = mod_diamond2) %>%
+ add_predictions(mod_diamond2)
> grid
> ggplot(grid,aes(cut,pred))+
+ geom_point()
image.png
- 分析残差
> diamonds2 <- diamonds2 %>%
+ add_residuals(mod_diamond2,"lresid2")
>
> ggplot(diamonds2,aes(lcarat,lresid2))+
+ geom_hex(bins=50)
image.png
下面可以检验正常值(resid>2 意味着钻石的加个是预计价格的四倍以上)
(这里typical()得到的结果似乎有问题,导致color计算出的diamonds2与r4ds不一致,解决后再来更新)
网友评论