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

添加随机效应后gam.check()残差正态性异常的解决方法咨询

问题:加入随机效应后GAM模型残差方差异常的解决方法

我尝试运行一个包含8个输入变量的GAM模型,最初未加入随机效应时,gam.check()显示拟合效果良好;但加入个体环志ID(parent1_band)作为随机效应后,gam.check()的残差方差图出现两端拖尾的异常情况。推测原因是各环志ID对应的观测数差异较大(部分成体仅对应几条观测,部分多达30条)。已尝试对响应变量egg_volume进行对数转换(该变量非负)、按环志ID频率进行加权拟合、移除其他变量的异常值,但问题仍未解决。如何在控制个体变异的同时满足模型假设?

模型代码

#Global Model (Sample Size 5964 observations)
mod_d1 <- gam(egg_volume ~ s(year, k = 30) + (P1_WING) + (P1_CULMEN) + (first_lay_doy) +
                (ind_lay_doy) + (clutch_size) + s(n_nests) + s(parent1_age), 
             data = P1P2_eggs_clean2, method = "REML", na.action = na.fail)

summary(mod_d1)
gam.check(mod_d1)

#Add Parent Band ID- REMOVE CULMEN
mod_d1ID <- gam(egg_volume ~ s(year, k = 30) + (P1_WING) + (P1_CULMEN) +
                (ind_lay_doy) + (clutch_size) + s(n_nests) + s(parent1_age) +
                s(parent1_band, bs = "re"), data = P1P2_eggs_clean2, 
                method = "REML", na.action = na.fail)

异常残差图

加入随机效应后的GAM模型残差方差图

可行的解决思路
  • 更换随机效应类型:用bs = "fs"(因子平滑)替代bs = "re",这种结构更适合观测数不平衡的分组,允许个体间存在非线性变异,能更好适配观测数差异大的情况。示例代码:

    mod_d1ID_fs <- gam(egg_volume ~ s(year, k = 30) + P1_WING + P1_CULMEN +
                        ind_lay_doy + clutch_size + s(n_nests) + s(parent1_age) +
                        s(parent1_band, bs = "fs", k = 5), 
                      data = P1P2_eggs_clean2, method = "REML", na.action = na.fail)
    

    可通过调整k值控制平滑灵活度,k越大拟合越细致。

  • 引入随机效应与协变量的交互:个体可能在某些协变量(如parent1_age、year)上存在异质性,尝试加入交互项捕捉这类差异。例如:

    # 个体随年龄变化的随机效应
    mod_d1ID_interact <- gam(egg_volume ~ s(year, k = 30) + P1_WING + P1_CULMEN +
                              ind_lay_doy + clutch_size + s(n_nests) + s(parent1_age) +
                              s(parent1_band, parent1_age, bs = "re"), 
                            data = P1P2_eggs_clean2, method = "REML", na.action = na.fail)
    
  • 改用广义加性混合模型(GAMM)并指定合适分布:如果响应变量egg_volume存在过度离散,即使对数转换后仍不满足正态假设,尝试用GAMM指定伽马或负二项分布(需确保变量符合分布要求)。示例:

    library(mgcv)
    mod_d1ID_gamma <- gamm(egg_volume ~ s(year, k = 30) + P1_WING + P1_CULMEN +
                            ind_lay_doy + clutch_size + s(n_nests) + s(parent1_age), 
                          random = list(parent1_band = ~1),
                          data = P1P2_eggs_clean2, method = "REML", 
                          family = Gamma(link = "log"))
    

    若存在0值,可给egg_volume加极小偏移量(如egg_volume + 1e-6)后再用伽马分布。

  • 定位残差拖尾的来源:提取模型残差,按parent1_band分组查看残差分布,确认是否是特定个体(观测数极少或极多的)导致的异常。如果是,可检查这些个体的数据质量,或对极端观测数的个体设置自定义权重(比如给观测数少的个体适当提高权重)。

  • 分层建模:将观测数少的个体合并为一个组,对不同观测数的组设置不同的平滑结构,不过这种方法需要额外的模型验证来确保合理性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:59:53