添加随机效应后gam.check()残差正态性异常的解决方法咨询
我尝试运行一个包含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)
异常残差图

更换随机效应类型:用
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

