可以使用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那样产生一个系数矩阵,输出的格式与指定的结果相同。
发布于 2022-10-10 14:50:20
不是这边。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
)
还有很多其他的问题,所以这些问题的变体(对不同的响应变量运行lm()
/glm()
,列表的元素等等),但是我很难找到它们。
https://stackoverflow.com/questions/74021243
复制相似问题