将 glmer 输出从 logit 转换为响应比例

converting the glmer output from logit to response scale

我希望得到一些可以帮助解决我心中的这个谜。我的 glmer() 调用中的第 7 个系数在 logit 尺度上是 0.28779305。

这个系数也可以通过emmeans包中的contrast()得到。然而,这个包显然输出了不同尺度的第 7 个系数,即 response 尺度。

我想知道如何转换 contrast() 调用给出的估计值,使其与我的 glmer() 调用中的第 7 个系数匹配?

ps。 提供了一些见解,但我看不出这两个包的系数可能相关。

library(lme4)
library(emmeans)
library(broom.mixed)

dat <- read.csv("https://raw.githubusercontent.com/fpqq/w/main/d.csv")

form2 <- y ~ item_type*time + (1 | user_id)

m2 <- glmer(form2, family = binomial, data = dat,
            control =
              glmerControl(optimizer = "bobyqa"))

coef(summary(m2))[7,]
#  Estimate Std. Error    z value   Pr(>|z|)   # This Estimate 
#0.28779305 0.11271202 2.55334842 0.01066927   # is on logit scale
#------------------------------------------------------------------
EMM <- emmeans(m2, ~ item_type * time)

CON <- list(c1 = c(1, 0, -1, 0, -1, 0, 1, 0))

contrast(regrid(EMM), CON)
# contrast estimate     SE  df z.ratio p.value # This Estimate
# c1          0.106 0.0299 Inf 3.526   0.0004  # is on response scale

最重要的是,如果你这样做

contrast(EMM, CON)

然后也许你会得到你问的那个系数。这是假设第 7 个系数被正确识别。

EMM 对象包含有关 8 个不同概率(称为 p1、p2、...、p8)的估计信息,在对数尺度上。

  • 如果您这样做 summary(EMM),您将得到 logit(p1), logit(p2), ..., logit(p8) 的估计值。
  • 如果您这样做 summary(EMM, type = "response"),您将得到 p1, p2, ..., p8
  • 的估计值
  • 如果您这样做 contrast(EMM, CON),您将得到 logit(p1) - logit(p3) - logit(p5) + logit(p7) = log(o1) - log(o3) - log(o5) + log(o7) 的估计值,其中 oj = pj / (1 - pj) 是第 j 种情况的几率。
  • 如果你这样做 contrast(EMM, CON, type = "response"),你会得到 exp(log(o1) - log(o3) - log(o5) + log(o7)) = (o1*o7) / (o3*o5)
  • 的估计值

现在,如文档所述,REMM = regrid(EMM) 一劳永逸地撤消了对数转换。它不保留它来自哪里的记忆,它只有关于响应尺度及其协方差矩阵的估计的信息。于是

  • 如果您这样做 summary(REMM),您将得到 p1, p2, ..., p8
  • 的估计值
  • 如果您这样做 summary(REMM, type = "response"),您将得到 p1, p2, ..., p8 的估计值。 REMM没有转换信息,已经在响应量表上了
  • 如果您执行 contrast(REMM, CON)(或 contrast(REMM, CON, type = "response")),您将得到 p1 - p3 - p5 + p7 的估计值。

emmeans 包记录了所有这些,此外还包含几个带示例的小插图。特别是 transformations and the one on comparisons and contrasts 上的那个在这里特别相关。

继@RussLenth 的回答之后:

  • contrast(EMM, CON)给你log(o1) - log(o3) - log(o5) + log(o7),确实等于第7个系数值
  • contrast(REMM, CON)(即重新网格化)给你 p1 - p3 - p5 - p7.

(其中 oi = 第 i 组的赔率,pi = 第 i 组的概率,oi = pi/(1-pi))。

虽然可以将单个 log-odds 值转换为概率(如果 loi 是 log-odds 值,则 pi = 1/(1+exp(-loi))),但我不会认为有什么方法可以将 log-odds 值的 线性组合 直接转换为相应的概率值线性组合;相反,您无论如何都必须执行 emmeans 正在执行的操作 — 即,将单个 log-odds 值转换为概率标度,然后计算线性组合。 (事实上​​ emmeans 正朝着另一个方向发展 — 当您指定重新网格化时从 log-odds 计算概率。)

你的问题也揭示了对这里发生的事情的误解:你说

apparently outputs the 7th coefficient on a different scale, the response scale

输出响应量表上的第 7 个系数;相反,它将对数尺度 上的第 7 个系数应用于概率尺度 上的组值的相同对比。 “[T] 响应量表上的第 7 个系数”将是

L(log(o1) - log(o3) - log(o5) + log(o7))

(其中 L(x) 是逻辑函数 1/(1+exp(-x)) [plogis() in R])。这与

不一样
L(log(o1)) - L(log(o3)) - L(log(o5)) + L(log(o7))

这就是 emmeans 给你的。