如何处理逻辑 GLMM 中的准完全分离?

机器算法验证 r 物流 标准错误 lme4-nlme 分离
2022-03-13 09:54:40

更新:因为我现在知道我的问题被称为准完全分离,所以我更新了问题以反映这一点(感谢 Aaron)。


我有一个实验的数据集,其中 29 名人类参与者(因子code)在一组试验中工作,并且response是 1 或 0。此外,我们操纵材料,使我们有三个交叉因子,p.validity(有效与无效),type(肯定与否定)和counterexamples(少数与多数):

d.binom <- read.table("http://pastebin.com/raw.php?i=0yDpEri8")
str(d.binom)
## 'data.frame':   464 obs. of  5 variables:
##      $ code           : Factor w/ 29 levels "A04C","A14G",..: 1 1 1 1 1 1 1 1 1 1 ...
##      $ response       : int  1 1 1 1 0 1 1 1 1 1 ...
##      $ counterexamples: Factor w/ 2 levels "few","many": 2 2 1 1 2 2 2 2 1 1 ...
##      $ type           : Factor w/ 2 levels "affirmation",..: 1 2 1 2 1 2 1 2 1 2 ...
##      $ p.validity     : Factor w/ 2 levels "invalid","valid": 1 1 2 2 1 1 2 2 1 1 ...

总体上只有少量的 0:

mean(d.binom$response)
## [1] 0.9504

一个假设是有 的影响validity,但是初步分析表明可能有 的影响counterexamples由于我有相关数据(每个参与者都参与了所有试验),我想对数据使用 GLMM。不幸的是,counterexamples准完全分离数据(至少在一个级别):

with(d.binom, table(response, counterexamples))
##         counterexamples
## response few many
##        0   1   22
##        1 231  210

这也反映在模型中:

require(lme4)
options(contrasts=c('contr.sum', 'contr.poly'))


m2 <- glmer(response ~ type * p.validity * counterexamples + (1|code), 
            data = d.binom, family = binomial)
summary(m2)
## [output truncated]
## Fixed effects:
##                                      Estimate Std. Error z value Pr(>|z|)
##   (Intercept)                            9.42     831.02    0.01     0.99
##   type1                                 -1.97     831.02    0.00     1.00
##   p.validity1                            1.78     831.02    0.00     1.00
##   counterexamples1                       7.02     831.02    0.01     0.99
##   type1:p.validity1                      1.97     831.02    0.00     1.00
##   type1:counterexamples1                -2.16     831.02    0.00     1.00
##   p.validity1:counterexamples1           2.35     831.02    0.00     1.00
##   type1:p.validity1:counterexamples1     2.16     831.02    0.00     1.00

参数的标准错误简直是疯了。由于我的最终目标是评估某些影响是否显着,因此标准误差并非完全不重要。

  • 如何处理准完全分离?我想要的是获得估计值,我可以从中判断某种影响是否显着(例如,使用PRmodcompfrom package pkrtest,但这是此处未描述的另一个步骤)。

使用其他包的方法也很好。

2个回答

恐怕你的标题中有一个错字:你不应该尝试拟合混合模型,更不用说非线性混合模型了,只有 30 个集群。除非您相信您可以将正态分布拟合到被测量误差、非线性和几乎完全分离(也称为完美预测)所阻碍的 30 个点。

我在这里要做的是将其作为带有Firth 校正的常规逻辑回归运行:

library(logistf)
mf <- logistf(response ~ type * p.validity * counterexamples + as.factor(code),
      data=d.binom)

Firth 的修正包括对可能性增加惩罚,并且是一种收缩形式。在贝叶斯术语中,得到的估计是具有 Jeffreys 先验的模型的后验模式。用频率论术语来说,惩罚是对应于单个观察的信息矩阵的行列式,因此渐近消失。

您可以在固定效果上使用具有弱先验的贝叶斯最大值后验方法来获得大致相同的效果。特别是,如果您在此处的示例中为固定效果指定先验(搜索“完全分离”) ,则 R 的blme 包(它是包周围的薄包装器)会执行此操作:lme4

cmod_blme_L2 <- bglmer(predation~ttt+(1|block),data=newdat,
                       family=binomial,
                       fixef.prior = normal(cov = diag(9,4)))

这个例子来自一个实验,其中ttt是一个具有 4 个级别的分类固定效应,因此向量的长度为 4。指定的先验方差-协方差矩阵为,即固定效应参数具有独立的(或,即标准偏差,)先验。这很好用,尽管它与 Firth 校正不同(因为 Firth 对应于Jeffreys prior,这并不完全相同)。βΣ=9IN(μ=0,σ2=9)σ=3

链接的示例显示您也可以使用MCMCglmm包来执行此操作,如果您想使用全贝叶斯...