将 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
给你的。
我希望得到一些可以帮助解决我心中的这个谜。我的 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
给你的。