假设我们有一个玩具数据集:
library(tidyverse)
library(purrr)
tbl <- tibble(a = rep(c(0, 1), each = 5),
b = rep(c(0, 1), times = 5),
c = runif(10),
d = rexp(10)) %>%
mutate_at(vars(1,2), as.factor)
其中a
是因变量,b:d
是自变量。想法是为每个自变量运行glm
模型:
glm(a ~ b, data = tbl)
glm(a ~ c, data = tbl)
glm(a ~ d, data = tbl)
我最初的尝试如下:
tbl %>%
pivot_longer(2:4, names_to = "key", values_to = "val") %>%
group_split(key) %>%
map(~ glm(a ~ val, data = .x, family = "binomial"))
这会导致错误,因为b
和c
(或d
)的数据类型不同。
Error: No common type for `b` <factor<dec08>> and `c` <double>.
我想知道如何解决这个问题。
如果我对您的数据运行glm(a ~ b, data = tbl)
,它将返回错误说明
glm.fit(x = c(1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,:NA / NaN / Inf in'y'
此外:警告消息:
1:在Ops.factor(y,mu)中:“-”对于因子没有意义
2:在Ops.factor(eta,offset)中:“-”对因子没有意义
3:在Ops.factor(y,mu)中:“-”对于因子没有意义
因此避免将数据转换为因子
set.seed(123)
tbl <- tibble(a = rep(c(0, 1), each = 5),
b = rep(c(0, 1), times = 5),
c = runif(10),
d = rexp(10))
然后我们可以将map
与reformulate
结合使用来创建类似公式:
map(names(tbl)[-1], ~glm(reformulate(.x, 'a'), data = tbl))