如何在plot_smooths()及gratia的GAM绘图中添加原始数据点?
在tidymv的plot_smooths()图中添加原始数据点的解决方法
核心思路
plot_smooths()函数返回的是ggplot2对象,因此可以直接用ggplot2的图层函数叠加原始数据点,无需额外转换。
修改后的完整代码
library(mgcv) library(tidymv) library(ggplot2) # 需显式加载ggplot2以使用图层函数 x<-c(0.17,0.19,0.18,0.33,0.24,0.2,0.2,0.19,0.36,0.29,0.24,0.24,0.21,0.23,0.31,0.36,0.33,0.24,0.31) y<-c(8475,86,209,8230,8372,8475,8475,2867,149,8410,8161,8474,8451,282,7409,682,504,66,315) dat<-data.frame(x,y) gam <- gam(y ~ s(x), data=dat) # 绘制平滑曲线并叠加原始数据点 plot_smooths(gam, x) + geom_point(data = dat, aes(x = x, y = y), color = "red", size = 2, alpha = 0.7)
你可以根据需求调整geom_point()的参数(比如颜色、大小、透明度),让数据点更清晰。
关于gratia绘图的补充说明
gratia的plot.gam()或draw()默认展示的是平滑项的边际效应,此时y轴对应的是该平滑项对响应变量的贡献值(而非原始响应变量y的实际取值)。因此设置residuals = TRUE时显示的是残差点,不是原始数据点。
如果想用gratia绘制包含原始数据点的完整拟合图,可以通过fitted_values()提取完整预测值,再手动用ggplot2构建图形:
library(gratia) library(ggplot2) # 提取带置信区间的拟合值 fit_vals <- fitted_values(gam, data = dat) ggplot(fit_vals, aes(x = x)) + geom_line(aes(y = fitted), linewidth = 1) + geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2) + geom_point(data = dat, aes(y = y), color = "blue", size = 2) + labs(x = "x", y = "y") + theme_minimal()
内容的提问来源于stack exchange,提问作者RHT
相关产品推荐
相关产品推荐

