来自glmer输出的比率和置信区间

16

我制作了一个模型,考虑了多个变量以及它们对妊娠结果的影响。妊娠结果是分组二元的。一群动物有34例怀孕和3例未怀孕,下一群动物有20例怀孕和4例未怀孕,以此类推。

我使用glmer函数对这些数据进行建模,其中y表示妊娠结果(怀孕或未怀孕)。

mclus5 <- glmer(y~adg + breed + bw_start + year + (1|farm),
                data=dat, family=binomial)

我获得了所有通常的输出,包括系数等,但为了解释,我想将其转换为每个系数的比率和置信区间。

在以往的逻辑回归模型中,我使用了以下代码。

round(exp(cbind(OR=coef(mclus5),confint(mclus5))),3)

这很好地提供了我想要的内容,但它似乎不能与我运行的模型一起工作。

有人知道我如何通过R获得我的模型的这个输出的方法吗?


输入以下命令:?fixefclass(mclus5)showMethods("fixef", includeDefs=TRUE)glmer 是一个 S4 函数。 - IRTFM
3个回答

23

唯一的真正区别是您必须使用fixef()而不是coef()来提取固定效应系数(coef()为您提供了每个组的估计系数)。

我将用lme4包中的内置示例进行说明。

library("lme4")
gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd),
               data = cbpp, family = binomial)

固定效应系数和置信区间,对数几率比例尺:

cc <- confint(gm1,parm="beta_")  ## slow (~ 11 seconds)
ctab <- cbind(est=fixef(gm1),cc)

如果您希望使用更快但不太精确的 Wald 置信区间,可以使用 confint(gm1,parm="beta_",method="Wald");这等效于 @Gorka 的回答,但略微更方便。

取指数以获得赔率比:

rtab <- exp(ctab)
print(rtab,digits=3)
##               est 2.5 % 97.5 %
## (Intercept) 0.247 0.149  0.388
## period2     0.371 0.199  0.665
## period3     0.324 0.165  0.600
## period4     0.206 0.082  0.449

一个稍微更简单/更通用的解决方案:

library(broom.mixed)
tidy(gm1,conf.int=TRUE,exponentiate=TRUE,effects="fixed")

对于 Wald 置信区间,请不要做任何修改。如果需要使用基于概率轮廓的置信区间,请添加 conf.method="profile"


6
我相信有一种更快的方法(如果你可以接受不太准确的结果)。
来源:http://www.ats.ucla.edu/stat/r/dae/melogit.htm 首先,我们获取估计值的置信区间。
se <- sqrt(diag(vcov(mclus5)))
# table of estimates with 95% CI
tab <- cbind(Est = fixef(mclus5), LL = fixef(mclus5) - 1.96 * se, UL = fixef(mclus5) + 1.96 * se)

然后计算出95%置信区间内的赔率比

print(exp(tab), digits=3)

3
我认为另一种选择是仅使用emmeans软件包:
library(emmeans)
data.frame(confint(pairs(emmeans(fit, ~ factor_name,type="response"))))

1
不需要将调用包装在 data.frame 中。事实上,这样做会抑制可能有用的消息。 - Russ Lenth
哈,是的,这是一个好观点 - 我通常会将其制作成数据框以保存到CSV文件中。但最好还是分两步来完成... - Tom Wenseleers
1
请注意,现在可能需要切换到使用“emmeans”。 - Ben Bolker
1
当然,现在也可以使用更新的包emmeans,这是个好点子! - Tom Wenseleers
@BenBolker,emmeans 的结果与您在先前的回答中提供的结果不同,包括 broom.mixed 给出的结果。 - toto_tico
此答案提供了成对比较的置信区间。emmeans()旨在为预期边际均值、对比等提供估计和置信区间,与参数本身不同。如果您想要解释这些差异(这可能更适合CrossValidated),请发布一个新问题,并提供可重现的示例和明确表达的问题... - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接