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

