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

在mgcv中生成含随机效应的各水平平滑曲线用于绘图

生成GAM模型中按分组水平的平滑估计曲线

问题背景

我们使用mgcv包构建了如下GAM模型,包含一个针对x1的平滑项和针对x2的随机截距项:

gam(y ~ s(x1) + s(x2, bs="re"), method = 'REML', 
    family = 'gaussian', data = my.data) 

通过gratia::smooth_estimates()可以获取x1的均匀间隔平滑预测值,以及x2各水平的随机效应,结果存储在同一数据框中。需要找到简洁方法,生成x2每个水平下x1的完整平滑估计曲线(即把每个x1的平滑值与对应x2的随机效应相加,得到x2各水平对应的可堆叠绘制的曲线)。

简洁实现方法

方法一:基于smooth_estimates拆分合并

利用dplyr和tidyr的工具拆分平滑项与随机效应,再交叉组合计算总估计值:

library(dplyr)
library(tidyr)

# 获取平滑估计结果
smooth_res <- smooth_estimates(your_gam_model)

# 拆分x1的平滑值和x2的随机效应
x1_smooth_vals <- smooth_res %>%
  filter(smooth == "s(x1)") %>%
  select(x1, smooth_est = est)

x2_re_vals <- smooth_res %>%
  filter(smooth == "s(x2)") %>%
  select(x2, re_est = est)

# 交叉组合并计算每个x2水平下的总平滑估计
grouped_smooth_curves <- x1_smooth_vals %>%
  crossing(x2_re_vals) %>%
  mutate(total_estimate = smooth_est + re_est)

方法二:直接用fitted_values生成全组合预测

更高效的方式是用gratia::fitted_values()直接生成包含所有x1和x2组合的拟合值,无需手动拆分相加:

# 生成包含x1全范围和x2所有水平的新数据集
new_pred_data <- expand.grid(
  x1 = seq(min(my.data$x1), max(my.data$x1), length.out = 100), # 自定义x1的间隔数
  x2 = unique(my.data$x2)
)

# 获取所有组合的拟合值(包含平滑项+随机效应)
grouped_fitted_vals <- fitted_values(your_gam_model, data = new_pred_data)

两种方法得到的结果都可以直接用于可视化,比如用ggplot2绘制堆叠曲线:

library(ggplot2)
ggplot(grouped_fitted_vals, aes(x = x1, y = fitted, color = x2)) +
  geom_line(linewidth = 0.8)

内容的提问来源于stack exchange,提问作者Mike Dunbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:22:07