簡體   English   中英

R 使用 map2 迭代數據框列表中的列以擬合統計模型

[英]R Use map2 to iterate over columns within a list of data frames to fit statistical models

我試圖找出一種在數據幀列表中的列上迭代 map 以適應單變量 GLM 的 purrr 方法。 使用map2 ,第一個元素.x將是三個 pred 列,第二個元素.y將是數據框列表(反之亦然)。 map2似乎能夠做到這一點,但我認識到我需要先跨越 .x 和 .y 元素,所以我首先使用tidyr::crossing來做到這一點。 從這里開始,我不確定如何正確地將列引用到數據框中的 select 。 示例代碼如下:

#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))
})

我缺少一些東西,我似乎無法弄清楚。 我用幾種方法遇到了各種錯誤,但我認為這歸結為沒有正確引用.y數據框中的.x列。 我的方法似乎沒有認識到.x.y中的一列。 解決方法可以解決問題,但我寧願避免同時使用lapplymap

我的建議是在擬合模型之前不要拆分數據,因為您正在考慮原始數據集中已經直接可用的所有可能的變量組合。 相反,請考慮將原始數據框轉換為“長”格式,然后按必要的變量進行分組:

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> 

這大大簡化了您的代碼,如果您仍然需要列表中的這些模型,您現在可以拆分結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM