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

如何在Base R中翻转GAM绘图的X轴与Y轴?

在Base R中翻转GAM绘图的XY轴

要解决这个问题,核心思路是先提取plot.gam()生成的绘图数据,再手动交换XY轴重新绘制——直接反转输入变量拟合模型会改变平滑效应的含义,和原模型的输出逻辑完全无关。

具体步骤

  1. 提取绘图数据:调用plot.gam()时设置returnData = TRUE,该参数会让函数返回每个平滑项的拟合值、自变量取值、标准误等绘图核心数据,而非直接生成图像。
  2. 手动绘制翻转图:对提取到的每个平滑项数据,交换原XY轴的角色(用原拟合效应作为新X轴,原自变量作为新Y轴),并还原置信区间等元素。

代码示例

以mgcv包拟合的GAM模型为例:

# 加载包并拟合示例模型
library(mgcv)
set.seed(123)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2)
mod <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat)

# 提取绘图数据(pages=1避免分页,returnData=TRUE返回数据而非绘图)
plot_data <- plot(mod, pages = 1, returnData = TRUE)

# 批量绘制所有平滑项的翻转图
par(mfrow = c(2, 2))  # 设置2x2的绘图布局
for (i in seq_along(plot_data)) {
  d <- plot_data[[i]]
  term <- names(plot_data)[i]
  var_name <- gsub("s\\((.*)\\)", "\\1", term)  # 提取自变量名称
  
  # 初始化空图框
  plot(d$fit, d$x, type = "n", 
       xlab = "平滑效应", ylab = var_name,
       main = paste(term, "翻转图"))
  
  # 添加灰色置信区间带
  polygon(c(d$fit + d$se, rev(d$fit - d$se)), 
          c(d$x, rev(d$x)), 
          col = "lightgray", border = NA)
  
  # 叠加拟合曲线
  lines(d$fit, d$x, lwd = 2)
}
par(mfrow = c(1, 1))  # 还原布局

关键说明

  • plot.gam()返回的plot_data是一个列表,每个元素对应一个平滑项,包含x(自变量取值)、fit(平滑拟合效应)、se(标准误)等字段。
  • 用polygon()绘制置信区间时,需要将原fit±se的序列反转,配合原自变量序列的反转,才能生成闭合的填充区域。
  • 这种方法完全基于原模型的拟合结果,不会改变GAM的核心计算逻辑,只是调整了绘图的轴映射关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:43:25