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

使用mgcv拟合带共享惩罚的分层GAM(S/GS模型)时遇错误求助

解决分层GAM(模型S/GS)拟合错误的思路

错误根源分析

你的核心问题是语法使用错误,而非k值设置问题:

  • 第一种尝试中,直接将因子变量region放入s()的变量列表,s()默认处理连续变量的张量积,会对因子执行数值运算(如减法),触发‘-’ not meaningful for factors警告,进而导致后续错误。
  • 第二种尝试中,不仅延续了因子变量的错误用法,还将family参数错误嵌套在s()内部,同时对因子变量设置k=c(10,4)完全不符合mgcv的语法规则。

正确拟合模型S(共享惩罚分层GAM)的代码

Pedersen等人2019年提出的模型S,需要使用mgcv中的**因子平滑(bs="fs")**实现,这是专门为分组平滑设计的平滑类型,支持共享惩罚结构:

modS <- gam(occurrence ~ s(temp, region, bs = "fs", k = 10, m = c(2, 1)),
            family = binomial, data = df, method = "REML")

参数说明:

  • bs="fs":指定因子平滑,第一个变量为连续协变量temp,第二个为分组因子region
  • k=10:设置连续变量temp的基函数数量(分组因子的水平数由数据自动识别,无需额外设置)
  • m=c(2,1):定义惩罚结构,实现组平滑曲线向全局曲线收缩的共享惩罚,对应Pedersen的模型S

拟合模型GS(全局+共享惩罚分层GAM)的代码

如果需要拟合GS模型,只需在模型S基础上添加全局平滑项:

modGS <- gam(occurrence ~ s(temp, k = 10) + s(temp, region, bs = "fs", k = 10, m = c(2, 1)),
             family = binomial, data = df, method = "REML")

额外检查项

  • 确认region是因子类型:用str(df$region)检查,若不是则用df$region <- as.factor(df$region)转换
  • 对于10万条观测,k=10的基函数数量兼顾拟合灵活性与计算效率,无需调整过大

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:10:54