多元结果二项回归R



可以使用cbind为普通lm回归指定多个结果,例如:

set.seed(11)
df <- iris %>%
mutate(var1 = sample(c(0L,1L), 150, replace = TRUE),
var2 = sample(c(0L,1L), 150, replace = TRUE))
df %>%
lm(cbind(var1, var2) ~ Sepal.Width + Sepal.Length, data = .) %>%
coef()
#                      var1        var2
# (Intercept)  0.5010092855  1.17035845
# Sepal.Width  0.0015431925 -0.16210972
# Sepal.Length 0.0001607519 -0.03218511

这可以用二项式glm来实现吗?如果没有,应如何进行预期分析(MANOVA(?

df %>%
glm(cbind(var1, var2) ~ Sepal.Width + Sepal.Length, family = binomial, data = .) %>%
coef()
# (Intercept)  Sepal.Width Sepal.Length 
#  -1.3886130    0.3587017    0.0588412 

上面的glm似乎不像lm那样产生系数矩阵,输出的格式与只指定一个结果的格式相同。

不是这样。lm()允许这样做,因为线性回归的特定结构允许同时(有效地(求解几个响应变量的线性回归方程。这个技巧不适用于广义线性模型。

要使用glm()做到这一点,您必须自己设置,例如

ff <- function(var) {
f <- reformulate(c("Sepal.Length", "Sepal.Width"), response = var)
glm(f, data = df, family = binomial)
}
(c("var1", "var2")
|> purrr::map(ff)
|> purrr::map(coef)
|> bind_cols()
)

(您仍然需要整理行/列名(

library(broom)
(c("var1", "var2")
|> setNames(nm = _)
|> purrr::map(ff)
|> purrr::map_dfr(tidy, .id = "respvar")
|> select(respvar, term, estimate)
|> pivot_wider(names_from = "respvar", values_from = "estimate")
)

lme4::lmList()处理数据为长格式的情况:

library(broom.mixed)
library(lme4)
(df 
|> pivot_longer(c(var1, var2))
|> lmList(formula = value ~ Sepal.Length + Sepal.Width | name,
family = binomial)
|> coef()
|> t() ## transpose
)

关于SO,还有很多其他问题可以做这方面的变体(对不同的响应变量、列表元素等运行lm()/glm()(,但我不容易找到它们。

最新更新