首页 > 解决方案 > 完全分离 - 如何在 bglmer 中对固定效应施加“零均值正态先验”

问题描述

我的glmer模型包含两个预测变量和一个交互项,完全分离。按照 Ben Bolker 在此处此处的建议,然后我使用 拟合模型bglmer,对固定效应施加零均值正态先验。我的代码如下:

bglmer(Binary_outcome ~ (1|Subject) + Factor1 + Factor2 + Factor1:Factor2, 
       mydata, 
       control=glmerControl(optimizer="bobyqa"), 
       family = binomial, 
       fixef.prior = normal(sd = c(3, 3, 3)))

Factor1 和 Factor2 都是因子变量,每个都有四个水平。对于我的代码,我遵循了此处的示例。据我了解,我现在将 SD 为 3 的零均值正态先验放在我的固定效应结构的所有元素上。

代码似乎有效,但我完全不确定我所做的是否正确。3 SD 是帮助完全分离的一般建议吗?我将如何指定fixef.priors仅在交互项上进行?Factor1(完全分离与and的特定组合有关Factor2,不是Factor1Factor2一般而言)。或者,如果涉及交互,我是否必须在所有三个元素上放置固定效果先验?

标签: rmixed-models

解决方案


如有疑问,请进行实验。tl; dr惩罚一切可能很好,但如果你喜欢惩罚交互而不惩罚主要影响(或几乎;你必须给出有限的 sd,但它可能非常大)。sd=3 是合理的;sd=2.5 是截距以外的参数的默认值。除非你正在拟合一个预测模型,并且想要不厌其烦地进行交叉验证来选择最优的惩罚强度,否则实际上并没有一种自动的方式来决定。您只需要选择一个 sd 即可使您的所有参数“合理”,而不会将您确定的参数过多地压向零。

我模拟的数据有点像你的(2 个因子,每个因子有 4 个水平,二元响应,一个随机截距项)并尝试了不同的惩罚方案。我设置了真实参数,以便大多数参数是合理的(beta=1),但有一个大的主效应和一个大的交互参数(beta=12)。

  • 无处罚 ( glmer)
  • 惩罚与sd=3
  • 惩罚所有条款sd=1
  • 主效应项 ( sd=1e4) 的惩罚非常弱,交互作用的惩罚 ( ) 中等sd=2[“混合”]

来自help("bmerDist-class")

指定标准差时,长度小于固定效应数量的向量将重复其尾部,而第一个元素假定仅适用于截距项。所以在默认的 'c(10, 2.5)' 中,截距的标准差为 10,各种斜率的标准差均为 2.5

在此处输入图像描述

library(lme4)
library(blme)
library(broom.mixed)
library(dotwhisker)
library(colorspace)

dd <- expand.grid(Subject=factor(1:10),
                  Factor1=letters[1:4],
                  Factor2=LETTERS[1:4],
                  rep=1:20
                  )
bvec <- rep(1,16)
bvec[c(2,10)] <- 12
form <- response ~ (1|Subject) + Factor1 + Factor2 + Factor1:Factor2
set.seed(101)
dd$response <- simulate(form[-2],
         newdata=dd,
         newparams=list(beta=bvec, theta=1),
         family=binomial,
         weights=rep(1,nrow(dd)))[[1]]

b0 <- glmer(form, 
            dd,
            family = binomial)
bfun <- function(sd) {
   bglmer(form, dd, family = binomial, fixef.prior = normal(sd = sd))
}
b1 <- bfun(3)
b2 <- bfun(1)
## eight intercept + main effects first, then eight interaction parameters
b3 <- bfun(rep(c(1e4,2),c(8,8))

theme_set(theme_bw())
dwplot(list(unpenalized=b0,sd3=b1,sd1=b2,mixed=b3),effect="fixed") +
    coord_cartesian(xlim=c(-5,5))+
    geom_vline(xintercept=c(0,1),lty=2,colour="darkgray") +
    scale_colour_discrete_qualitative(guide=guide_legend(reverse=TRUE))

推荐阅读