R使用map2遍历数据框列表中的列以适合统计模型

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

我正在尝试找到一种purrr方法来迭代映射数据帧列表中的列以适合单变量GLM。使用map2,第一个元素.x将是三个pred列,而第二个元素.y将是数据帧的列表(反之亦然)。 map2似乎可以做到这一点,但是我认识到我需要首先交叉.x和.y元素,因此我首先要使用tidyr::crossing。从这里,我不确定如何正确引用要在数据帧中选择的列。示例代码如下:

#Sample data
set.seed(100)
test_df <- tibble(pred1 = sample(40:80, size = 1000, replace = TRUE),
                  pred2 = sample(40:80, size = 1000, replace = TRUE),
                  pred3 = sample(40:80, size = 1000, replace = TRUE),
                  resp = sample(100:200, size = 1000, replace = TRUE),
                  group = sample(c('a','b','c'), size = 1000, replace = TRUE))

#Split into list
test_ls <- test_df %>% 
  group_by(group) %>% 
  {df_groups <<- .} %>% 
  group_split()

#Obtain keys and name list elements
group_keys <- df_groups %>% 
  group_keys() %>% 
  pull()

test_ls <- test_ls %>% setNames(nm = group_keys)

#Cross all combinations of pred columns and list element names
preds <- c('pred1','pred2','pred3')
map_keys <- crossing(preds, group_keys) 

#.y = list of data frames; iterate over data frames
#.x = three pred columns; iterate over columns
#Use purrr to fit glm of each .x columns within each of .y dfs

#Example structure - does not work
map2(.x, .y, .f = ~glm(resp ~ .x, data = .y))

#Workaround that does work
lapply(test_ls, function(x) {
  x %>% 
    select(pred1, pred2, pred3) %>% 
    map(.f = ~glm(resp ~ .x, data = x))
})

我缺少一些东西,我似乎无法弄清楚。我通过几种方法遇到了各种各样的错误,但是我认为这归结为没有正确引用.x数据帧内的.y列。我的方法似乎没有认识到.x.y中的一列。解决方法可以解决问题,但我希望避免同时使用lapplymap

r mapping purrr
1个回答
0
投票

我的建议是在拟合模型之前不要拆分数据,因为您正在考虑的所有可能的变量组合,这些变量在原始数据集中已经直接可用。而是考虑将原始数据帧转换为“长”格式,然后按必要的变量分组:

test_df %>% gather( pred, value, pred1:pred3 ) %>%
  nest( -c(group, pred) ) %>%
  mutate( models = map(data, ~glm(resp ~ value, data=.x)) )
# # A tibble: 9 x 4
#   group pred  data               models
#   <chr> <chr> <list>             <list>
# 1 b     pred1 <tibble [340 x 2]> <glm> 
# 2 a     pred1 <tibble [317 x 2]> <glm> 
# 3 c     pred1 <tibble [343 x 2]> <glm> 
# 4 b     pred2 <tibble [340 x 2]> <glm> 
# 5 a     pred2 <tibble [317 x 2]> <glm> 
# 6 c     pred2 <tibble [343 x 2]> <glm> 
# 7 b     pred3 <tibble [340 x 2]> <glm> 
# 8 a     pred3 <tibble [317 x 2]> <glm> 
# 9 c     pred3 <tibble [343 x 2]> <glm> 

这大大简化了代码,如果您仍然需要列表中的模型,则现在可以拆分结果。

© www.soinside.com 2019 - 2024. All rights reserved.