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

如何访问mgcv库拟合的广义可加模型(GAM)的组件函数?

访问mgcv拟合GAM的组件函数方法

一、单独计算各组件函数值

mgcv自带方法直接提取单个组件的预测值,不用解析plot.gam源码,核心是用predict.gam的type和terms参数:

1. 单变量张量项(ti(x1)、ti(x2))

要计算ti(x1)在新数据上的取值,代码示例:

# 构造新数据,x2取均值保证其他项对结果无影响
new_data <- data.frame(x1 = seq(min(x1), max(x1), length.out = 100), x2 = mean(x2))
# 提取ti(x1)的组件值
ti_x1_vals <- predict(md, newdata = new_data, type = "terms", terms = "ti(x1)")
  • type = "terms":返回每个模型项的拟合值(不含截距)
  • terms:指定要提取的具体项,名称必须和模型公式里的完全一致

2. 双变量张量项(ti(x1,x2))

多元张量项的提取逻辑相同,指定对应的项名即可:

# 构造x1和x2的组合数据
new_data_2d <- expand.grid(x1 = seq(min(x1), max(x1), length.out = 50), 
                           x2 = seq(min(x2), max(x2), length.out = 50))
# 提取ti(x1,x2)的组件值
ti_x1x2_vals <- predict(md, newdata = new_data_2d, type = "terms", terms = "ti(x1,x2)")

二、解析计算组件的梯度

mgcv支持直接计算组件的解析梯度,不用数值近似,用predict.gam的deriv参数:

1. 单变量项的一阶导数

计算ti(x1)对x1的梯度:

# 指定对x1求一阶导数
ti_x1_grad <- predict(md, newdata = new_data, type = "terms", terms = "ti(x1)", deriv = list(x1 = 1))

返回结果就是ti(x1)在每个新数据点的梯度值。

2. 双变量项的偏导数

对ti(x1,x2)同时计算x1和x2的偏导数:

# 同时指定对x1、x2求一阶偏导
ti_x1x2_grads <- predict(md, newdata = new_data_2d, type = "terms", terms = "ti(x1,x2)", 
                         deriv = list(x1 = 1, x2 = 1))

返回结果包含两列,分别对应对x1和x2的偏导数。

注意事项

  • 如果模型带截距,type = "terms"返回的组件值就是纯f_i(x),因为GAM拟合值是「截距+Σf_i(x)」
  • 可以用names(md$coefficients)查看所有项的准确名称,确保terms参数的名称完全匹配
  • 用deriv时,新数据必须包含要对其求导的变量,变量名要和模型里的一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:45:23