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

如何在mgcv中构建含双分类与单连续预测变量的分层GAM(HGAM)模型

mgcv双分组分层GAM(HGAM)的正确写法

适配GI结构的模型代码

你需要的「全局公共平滑+情景/分区双分组独立平滑参数」的GI结构HGAM写法如下:

library(mgcv)
m5 <- gam(
  response ~ 
    s(time, k = 10) +  # 全局公共时间平滑项
    s(time, by = scenario, bs = "fs", m = 1, k = 10) +  # 情景层级时间偏差平滑,组内共享平滑参数
    s(time, by = zone, bs = "fs", m = 1, k = 10) +  # 分区层级时间偏差平滑,组内共享平滑参数
    scenario + zone +  # 分类变量固定截距项
    s(model, bs = "re"),  # 模型随机截距
  data = df,
  method = "REML"  # 分层模型推荐用REML估计平滑参数
)

参数说明

  • 第一层s(time, k=10)为所有样本共享的全局时间变化趋势,对应GI模型的公共平滑项
  • 情景层级的bs="fs"为因子平滑参数化,会自动为每个情景生成独立的平滑偏差,所有情景的平滑度共享同一个惩罚参数,可独立于分区层级估计波动程度;m=1指定一阶差分惩罚,确保偏差项围绕全局平滑波动,避免与全局项共线
  • 分区层级的平滑项逻辑与情景层级一致,拥有完全独立的平滑参数,两个分组的波动程度不会互相干扰

原写法问题说明

你之前尝试的s(time, by=scenario:zone)语法本身合法,但不符合研究需求:该写法会为4个情景×4个分区的16个组合分别拟合完全独立的平滑项,所有平滑项共享同一个惩罚参数,无法实现情景、分区两个分组层级各自独立估计平滑度的需求。

分布适配提示

你的模拟数据使用负二项分布生成,实际拟合时建议指定负二项族避免方差估计偏差,代码如下:

m5_nb <- gam(
  response ~ 
    s(time, k = 10) +
    s(time, by = scenario, bs = "fs", m = 1, k = 10) +
    s(time, by = zone, bs = "fs", m = 1, k = 10) +
    scenario + zone +
    s(model, bs = "re"),
  family = nb(),
  data = df,
  method = "REML"
)

结果解读提示

  • 调用plot(m5, pages = 1)可分别可视化全局时间趋势、各情景的时间趋势偏差、各分区的时间趋势偏差
  • 调用gam.vcomp(m5)可输出各平滑项的方差成分,直接对比情景、分区两个层级的波动幅度差异
  • 调用summary(m5)可查看各分类项、平滑项的显著性检验结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:12:01