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

在R中合并mgcv包GAM模型s(x)+s(y)+ti(x,y)的平滑效应可视化

合并GAM模型中单变量平滑与张量交互项的可视化方案

问题背景

我在R中常用mgcv包的te()张量平滑函数构建二维GAM模型,代码如下:

library(mgcv)
library(mgcViz)

m = gam(z~te(x,y),data=df)

gv = getViz(m)
plot(gv)

这段代码会生成x和y对z的联合效应二维图。

但我发现采用单变量平滑项加张量交互项的模型s(x) + s(y) + ti(x,y)对数据拟合效果更好:

library(mgcv)
library(mgcViz)

m = gam(z~s(x) + s(y) + ti(x,y),data=df)

gv = getViz(m)
plot(gv)

该模型会分别生成x、y的边际效应图以及二者的交互效应图,虽便于模型诊断,但我需要将这些效应合并成类似te()生成的单张图用于发表级绘图。现请教两个问题:

  • 是否有简便的实现方法?
  • 是否有充分理由不合并这些效应进行可视化?

解决方案

基于Gavin Simpson的建议,我使用mgcv::vis.gam开发了适配复杂场景的解决方案。我的实际模型涉及地理经纬度坐标,且按季度分层,还需在效应图上叠加世界地图。

简化后的模型代码如下:

m = gam(z~s(lon,by=quarter) + s(lat,by=quarter) + 
      ti(lon,lat,by=quarter),data=df)

我编写了以下函数来绘制指定季度的经纬度联合效应:

my_plot_gam_geo_quarter = 
  function(model,quarter,lon.lat=c("lon","lat"),contour.col="black",
           too.far=0.1,asp=1,
           world.col="lightgray",world.border="darkgray",
           cond=list(quarter=quarter)) {
    # 从tmap包获取世界地图数据
    suppressWarnings(data("World",package="tmap",overwrite=FALSE))
    
    mgcv::vis.gam(model,view=lon.lat,cond=cond,plot.type="contour",
                  contour.col=contour.col,too.far=too.far,asp=asp)
    plot(World[1],add=TRUE,col=world.col,border=world.border) 
  }

调用函数绘制第一季度的经纬度效应图:

my_plot_gam_geo_quarter(m,1)

内容的提问来源于stack exchange,提问作者David M. Kaplan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:52:14