You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:53:17