下文中所使用的示例数据和R代码的百度盘链接(提取码,egpa):
https://pan.baidu.com/s/1GwW8EYgFE7EPrW6o9u5ScA
若百度盘失效,也可在GitHub的备份中获取:
https://github.com/lyao222lll/sheng-xin-xiao-bai-yu
通过ggplot2函数stat_smooth()、geom_smooth()统计变量关系并拟合回归
ggplot2内置了回归统计函数,想必同学们也都很熟悉,就是stat_smooth()以及geom_smooth()。两个函数的使用方法大致一致,可基于给定的双变量关系拟合指定的回归,默认方法包含局部加权回归(loess)、一般线性模型(lm)、广义线性模型(glm)、广义加性模型(gam)以及一些非线性回归(nls,如指数回归)等,并同时将双变量关系的回归线绘制在二维图中表示出来。此外,结合一些拓展包也可以实现更多非线性回归的作图。
接下来展示几个简单示例,了解不同模式回归曲线通过ggplot2函数的绘制方法。
示例1.1-局部加权回归(loess)的平滑拟合
MASS包的内置数据集Boston,记录了波士顿郊区的房屋价值与当地社会环境、人口组成等信息。这里希望关注当地低收入人口比例和其所居住地房屋价格是否有关,不妨首先拟合一个双变量关系的平滑曲线进行探索。
平滑回归方法中,局部加权回归(LOESS)是最常用的平滑器。在函数stat_smooth()或geom_smooth()中通过method = 'loess'指定局部加权回归的平滑拟合,并通过span参数控制曲线平滑度。
#MASS 包的示例数据集,波士顿郊区的房屋价值,详情 ?Boston
library(MASS)
data(Boston)
#ggplot2 绘制低收入人口比例和居住地房屋价格的关系
library(ggplot2)
p geom_point() +
theme_bw()
p
##拟合局部加权回归(loess),并展示 95% 置信区间
#stat_smooth() 参数 span 可控制曲线平滑度,值越大拟合曲线越平滑,详情 ?stat_smooth
#注意平滑参数值应当谨慎设置,它强烈影响曲线意义的解读
p1 p1
#类似地,geom_smooth() 参数中,span 控制曲线平滑度
p2 p2
平滑曲线展现了居住地房屋价格越高,当地低收入人口比例越低。可能与低收入人群难以负担得起较高居住地的成本,而更多选择廉价的房屋租赁或长期居住有关。
示例1.2-一般加性模型的平滑拟合
实现非参数平滑回归的另一方法是使用加性模型。在函数stat_smooth()或geom_smooth()中通过method = 'gam'指定加性模型的平滑拟合,并通过在formula参数中选择平滑器参数实现。默认情况下,该函数假定响应变量服从正态分布,并执行一般加性模型的形式。
##gam 默认情况下执行一般加性模型的平滑回归,并展示 95% 置信区间
#stat_smooth() 和 geom_smooth() 的用法大致相似
#通过 formula = y~s(x) 指定函数关系,s() 中的参数 k 可调整平滑度,详情 ?s()
#注意平滑参数值应当谨慎设置,它强烈影响曲线意义的解读
p + stat_smooth(method = 'gam', formula = y~s(x, k = 10), se = TRUE, level = 0.95)
p + geom_smooth(method = 'gam', formula = y~s(x, k = 5), se = TRUE)
和loess平滑显示了一致的趋势,平滑曲线展现了居住地房屋价格越高,当地低收入人口比例越低。
示例1.3-一般线性模型(lm)之简单线性回归
上图的非参数平滑曲线显示了低收入人口的居住比例随当地房屋价格的升高而降低,不妨使用参数回归代替描述这个趋势,例如最常使用的简单线性回归。函数stat_smooth()或geom_smooth()中,通过method = 'lm'指定线性回归拟合变量关系,默认绘制Y=β1X+β0形式的简单线性回归形式。
##一般线性模型(lm),并展示 95% 置信区间
#stat_smooth() 拟合简单线性回归,详情 ?stat_smooth
p1 p1
#geom_smooth() 拟合简单线性回归,详情 ?geom_smooth
p2 p2
该图显示了波士顿郊区低收入人口的居住比例随当地房屋价格的升高而呈现明显的线性降低趋势。蓝线,上文的非参数loess平滑拟合;红线,普通线性回归拟合。
示例1.4-一般线性模型(lm)之带多次项的线性回归
不过上述非参数平滑曲线图的走势表明,似乎还可以用一个弯曲的曲线来提高拟合精度,即拟合含多次项的线性回归。因此继续考虑添加二次项关系,即Y=β1X+β2X2+β0。类似地,在函数stat_smooth()或geom_smooth()中