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

