r - 完全分离 - 如何在 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
,不是Factor1
或Factor2
一般而言)。或者,如果涉及交互,我是否必须在所有三个元素上放置固定效果先验?
解决方案
如有疑问,请进行实验。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))
推荐阅读
- android - 当我在 Arraylist 中添加一个新元素时,它会替换所有当前元素吗?
- c++ - Rectangle 函数(WinGDI.h) 绘制的矩形在 Windows 7 64 位系统中无法显示
- python - TypeError:“NoneType”类型的参数在 discord.py 中不可迭代
- javascript - 鼠标悬停点时如何更改d3工具提示背景颜色?
- python - Plotly:如何在时间序列数据中添加趋势线和平行线?
- python - 如何在 Django Rest Framework 中获取模型方法的值?
- c# - 无法为 openiddict 创建 dbset
- python - 循环遍历Python中多列中的不同值
- mysql - 如何只选择出现多次的重复数据并对每一行只计算一次?
- cocoapods - 我无法在 Mac OS Big Sur 上安装 Cocoapods