如何访问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
相关产品推荐
相关产品推荐

