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

如何将mgcv::gam默认基类型从tp改为cr?

为mgcv的GAM统一设置默认样条基为立方回归样条(cr)

我在R中使用mgcv包构建广义可加模型(GAMs)时,常选择立方回归样条(cr)而非默认的薄板回归样条(tp)——cr运算速度更快,有时预测精度也更高。但为每个预测变量的s()函数手动指定bs = "cr"过于繁琐,尤其当预测变量数量较多时。


默认使用薄板回归样条(tp)的示例

# 默认 bs = "tp"
mgcv::gam(
  mpg ~ s(hp) + s(wt) + s(qsec), 
  data = mtcars
) |>
  summary()

输出:

Family: gaussian 
Link function: identity 

Formula:
mpg ~ s(hp) + s(wt) + s(qsec)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  20.0906     0.3729   53.88   <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Approximate significance of smooth terms:
          edf Ref.df      F p-value    
s(hp)   2.209  2.799  1.258   0.347    
s(wt)   2.095  2.535 12.640 9.2e-05 ***
s(qsec) 1.000  1.000  1.199   0.284    
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

R-sq.(adj) =  0.878   Deviance explained = 89.8%
GCV = 5.5412  Scale est. = 4.4497    n = 32

手动指定立方回归样条(cr)的示例

# 手动指定 bs = "cr"
mgcv::gam(
  mpg ~ s(hp, bs = "cr") + s(wt, bs = "cr") + s(qsec, bs = "cr"), 
  data = mtcars
) |> 
  summary()

输出:

Family: gaussian 
Link function: identity 

Formula:
mpg ~ s(hp, bs = "cr") + s(wt, bs = "cr") + s(qsec, bs = "cr")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  20.0906     0.2923   68.72   <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Approximate significance of smooth terms:
          edf Ref.df      F  p-value    
s(hp)   8.867  8.981  3.012   0.0203 *  
s(wt)   2.380  2.987 13.509 8.82e-05 ***
s(qsec) 1.000  1.000  6.242   0.0218 *  
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

R-sq.(adj) =  0.925   Deviance explained = 95.4%
GCV = 4.6666  Scale est. = 2.7348    n = 32

优雅解决方案:无需修改内置s()函数

由于mgcv::gam.control()没有提供修改默认样条基的选项,且不建议重写内置s()函数(避免包开发中的兼容性问题),可以采用以下两种方案:

1. 自定义包装函数

创建一个默认使用cr基的平滑项函数,完全兼容原s()的所有参数:

# 自定义默认使用cr基的平滑项函数
s_cr <- function(x, ...) {
  mgcv::s(x, bs = "cr", ...)
}

使用时直接替换s()为s_cr():

mgcv::gam(
  mpg ~ s_cr(hp) + s_cr(wt) + s_cr(qsec), 
  data = mtcars
) |> 
  summary()

如果需要调整其他参数(如样条维度k),直接传入即可:

s_cr(hp, k = 10)  # 等价于 s(hp, bs = "cr", k = 10)

2. 批量修改公式(适合已写好的公式)

如果已经定义了使用默认s()的公式,可以通过正则表达式批量替换所有平滑项为cr基:

# 原始公式
form <- mpg ~ s(hp) + s(wt) + s(qsec)

# 将公式转为文本并批量替换
form_text <- deparse(form)
form_text_cr <- gsub("s\\(([^)]+)\\)", "s(\\1, bs = \"cr\")", form_text)
form_cr <- as.formula(form_text_cr)

# 使用修改后的公式建模
mgcv::gam(form_cr, data = mtcars) |> summary()

这个方案支持多变量平滑项(如s(x,y)),正则表达式会自动为所有s()添加bs="cr"参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:04:59