解决泊松 GLMM 中的异方差性

机器算法验证 r 泊松分布 异方差 咕噜咕噜
2022-04-08 19:32:30

我有长期的采集数据,我想测试采集的动物数量是否受天气影响。我的模型如下所示:

glmer(SumOfCatch ~ I(pc.act.1^2) +I(pc.act.2^2) + I(pc.may.1^2) + I(pc.may.2^2) + 
                   SampSize + as.factor(samp.prog) + (1|year/month), 
      control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=1e9,npt=5)), 
      family="poisson", data=a2)

所用变量的说明:

  • SumOfCatch:收集的动物数量
  • pc.act.1, pc.act.2:代表采样期间天气状况的主成分轴
  • pc.may.1, pc.may.2:代表五月天气状况的 PC 轴
  • SampSize:陷阱的数量,或收集标准长度的横断面
  • samp.prog:采样方法
  • 年份:采样年份(从 1993 年到 2002 年)
  • 月份:采样月份(从 8 月到 11 月)

当针对拟合值绘制时,拟合模型的残差显示出相当大的不均匀性(异方差?)(见图 1):

残差与拟合值 - 主模型

我的主要问题是:这是一个使我的模型的可靠性有问题的问题吗?如果是这样,我能做些什么来解决它?

到目前为止,我已经尝试了以下方法:

  • 通过定义观察级别的随机效应来控制过度分散,即为每个观察使用唯一的 ID,并将此 ID 变量用作随机效应;尽管我的数据确实显示出相当大的过度分散,但这并没有帮助,因为残差变得更加丑陋(见图 2)

残差与拟合值 - 具有 OD 控制的模型

  • 我用准泊松 glm 和 glm.nb 拟合了没有随机效应的模型;也产生了与原始模型相似的残差与拟合图

据我所知,可能有一些方法可以估计异方差一致的标准误差,但我没有找到任何用于 R 中泊松(或任何其他类型)GLMM 的方法。


作为对@FlorianHartig 的回应:我的数据集中的观察次数是 N=554,我认为这是一个公平的问题。这样的模型数量,当然,越多越好。我发布了两个数字,第一个是主模型的 DHARMa 比例残差图(由 Florian 建议)。

在此处输入图像描述

第二个图来自第二个模型,其中唯一的区别是它包含观察级别的随机效应(第一个没有)。

在此处输入图像描述

更新

天气变量(作为预测变量,即 x 轴)与采样成功(响应)之间的关系图:

Weather-PC 和采样成功

更新二。

显示预测值与残差的图:

预测变量与残差

1个回答

很难评估 Poisson(或任何其他整数值 GLM)与 Pearson 或偏差残差的拟合,因为完美拟合的 Poisson GLMM 也会表现出不均匀的偏差残差。

如果您使用观察级 RE 进行 GLMM,则尤其如此,因为 Pearson 残差不考虑 OL-RE 产生的色散。

为了演示这个问题,下面的代码创建了过度分散的泊松数据,然后拟合了一个完美的模型。皮尔逊残差看起来非常像您的情节 - 因此,可能根本没有问题。

这个问题由DHARMa R 包解决,它从拟合模型中模拟,将任何 GL(M)M 的残差转换为标准化空间。完成此操作后,您可以直观地评估/测试残差问题,例如与分布的偏差、对预测变量的残差依赖性、异方差或正常方式的自相关。请参阅包小插图以获取经过处理的示例。您可以在下图中看到,同一个模型现在看起来很好,应该是这样。

如果在使用 DHARMa 绘图后仍然看到异方差性,则必须将离散度建模为某个函数的函数,这不是一个大问题,但可能需要您转向 JAG 或其他贝叶斯软件。

library(DHARMa)
library(lme4)

testData = createData(sampleSize = 200, overdispersion = 1, randomEffectVariance = 1, family = poisson())

fittedModel <- glmer(observedResponse ~ Environment1 + (1|group) + (1|ID), family = "poisson", data = testData, control=glmerControl(optCtrl=list(maxfun=20000) ))

# standard Pearson residuals
plot(fittedModel, resid(., type = "pearson") ~ fitted(.) , abline = 0)

# DHARMa residuals
plot(simulateResiduals(fittedModel))

在此处输入图像描述

在此处输入图像描述