使用purrr在混合数据上运行多个glm模型

问题描述 投票:0回答:1

假设我们有一个玩具数据集:

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"))

这会导致错误,因为bc(或d)的数据类型不同。

Error: No common type for `b` <factor<dec08>> and `c` <double>.

我想知道如何解决这个问题。

r tidyverse purrr
1个回答
0
投票

如果我对您的数据运行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))

然后我们可以将mapreformulate结合使用来创建类似公式:

map(names(tbl)[-1], ~glm(reformulate(.x, 'a'), data = tbl))
© www.soinside.com 2019 - 2024. All rights reserved.