mgcv包GAM模型绘图未显示部分残差问题求助
GAM模型绘图未显示部分残差的问题分析
问题描述
使用mgcv包拟合细胞丰度随时间变化的GAM模型,模型运行正常(已知残差存在模式,但此为无关问题)。在plot()函数中设置residuals = TRUE后,绘图仍未显示部分残差,此前相同代码在其他数据集上可正常运行。
模型代码
GAM_EA <- mgcv::gam(EUB_FISH ~ s(Day, by = Heatwave), data = HnH, method = "REML") gam.check(GAM_EA) # 检查模型 mgcv::anova.gam(GAM_EA) # 获取统计结果,详见?anova.gam summary.gam(GAM_EA) plot(GAM_EA, shift = coef(GAM_EA)[1], residuals = TRUE)
可能的原因及解决方法
分组平滑项的残差范围截断
模型使用了by = Heatwave参数,Day的平滑项按Heatwave的不同水平分组拟合。plot()默认会分别绘制每个分组的曲线,若某个分组的残差超出当前绘图的y轴默认范围,就会被自动截断不显示。可添加ylim = "all"参数强制显示所有数据点:plot(GAM_EA, shift = coef(GAM_EA)[1], residuals = TRUE, ylim = "all")shift参数导致残差偏移出可视范围
你用shift = coef(GAM_EA)[1]将曲线平移到响应变量原始尺度,但残差是基于线性预测值与观测值的差值,平移后可能部分残差超出了绘图默认y轴范围。可以先去掉shift参数验证残差是否显示,再调整平移后的y轴范围。残差点重叠导致视觉上的“缺失”
若同一Day和Heatwave分组下存在多个观测值,残差点会重叠在一起,看起来像是部分残差缺失。可添加jitter = TRUE参数让残差点随机偏移,查看隐藏的点:plot(GAM_EA, shift = coef(GAM_EA)[1], residuals = TRUE, jitter = TRUE)mgcv版本差异影响绘图逻辑
不同版本的mgcv在plot.gam()的残差处理逻辑上可能存在细微差异。可通过packageVersion("mgcv")检查当前版本,对比之前正常运行时的版本,必要时更新或回退版本。
内容的提问来源于stack exchange,提问作者Reesa
相关产品推荐
相关产品推荐

