繁体   English   中英

第二次使用dplyr :: do时失去group_by信息

[英]Loosing group_by information when using dplyr::do for the second time

我在数据集的多个部分上运行多个模型,类似于(但使用更多模型)

library(tidyverse)
d1 <- mtcars %>% 
  group_by(cyl) %>% 
  do(mod_linear = lm(mpg ~ disp + hp, data = ., x = TRUE))
d1 
# Source: local data frame [3 x 3]
# Groups: <by row>
# 
# # A tibble: 3 x 3
#     cyl mod_linear 
# * <dbl> <list>     
# 1    4. <S3: lm>   
# 2    6. <S3: lm>   
# 3    8. <S3: lm>   

然后,我整理一下此小节,并使用tidy()将我的参数估计值保存在扫帚包中。

我还想计算预测变量的标准偏差(当我将x = TRUE设置x = TRUE存储在上面的模型中)以创建然后比较重新缩放的参数。 我可以使用

d1 %>%
  # group_by(cyl) %>% 
  do(term = colnames(.$mod$x),
     pred_sd = apply(X = .$mod$x, MARGIN = 2, FUN = sd)) %>%
  unnest()
# # A tibble: 9 x 2
#          term  pred_sd
#         <chr>    <dbl>
# 1 (Intercept)  0.00000
# 2        disp 26.87159
# 3          hp 20.93453
# 4 (Intercept)  0.00000
# 5        disp 41.56246
# 6          hp 24.26049
# 7 (Intercept)  0.00000
# 8        disp 67.77132
# 9          hp 50.97689

但是,结果不是成组的小标题,因此我最终失去了cyl列以告诉我哪些术语属于哪个模型。 如何避免这种损失? -再次添加group_by似乎会引发错误。

nb我想避免至少在第一部分中使用purrr(拟合模型),因为我运行不同类型的模型,然后需要调整结果的形状( d1 ),并且我喜欢do的进度条。

nb我想使用模型的$x组件而不是原始数据,因为它们具有正确比例的数据(我正在试验预测变量的不同转换)

我们可以做到这一点nest ING开始,然后做unnest

mtcars %>% 
    group_by(cyl) %>% 
      nest(-cyl) %>% 
      mutate(mod_linear = map(data, ~ lm(mpg ~ disp + hp, data = .x, x = TRUE)),
           term  = map(mod_linear, ~ names(coef(.x))),
           pred = map(mod_linear, ~ .x$x %>%
                                       as_tibble %>% 
                                       summarise_all(sd) %>% 
                                       unlist )) %>%
   select(-data, -mod_linear) %>%
     unnest
# A tibble: 9 x 3
#    cyl term         pred
#  <dbl> <chr>       <dbl>
#1  6.00 (Intercept)   0  
#2  6.00 disp         41.6
#3  6.00 hp           24.3
#4  4.00 (Intercept)   0  
#5  4.00 disp         26.9
#6  4.00 hp           20.9
#7  8.00 (Intercept)   0  
#8  8.00 disp         67.8
#9  8.00 hp           51.0

或者,您可以使用以下方法进一步简化该方法,而不是多次调用map

mtcars %>% 
       group_by(cyl) %>% 
        nest(-cyl) %>% 
        mutate(mod_contents = map(data, ~ {
           mod <- lm(mpg ~ disp + hp, data = .x, x = TRUE)
           term <- names(coef(mod))
           pred <- mod$x %>%
                      as_tibble %>%
                            summarise_all(sd) %>%
                            unlist
            tibble(term, pred)        
            }
         )) %>%
      select(-data) %>%
      unnest    
# A tibble: 9 x 3
#    cyl term         pred
#  <dbl> <chr>       <dbl>
#1  6.00 (Intercept)   0  
#2  6.00 disp         41.6
#3  6.00 hp           24.3
#4  4.00 (Intercept)   0  
#5  4.00 disp         26.9
#6  4.00 hp           20.9
#7  8.00 (Intercept)   0  
#8  8.00 disp         67.8
#9  8.00 hp           51.0

如果我们从“ d1”开始(基于OP的代码)

d1 %>% 
   ungroup %>%
   mutate(mod_contents = map(mod_linear, ~ {

             pred <- .x$x %>%
                       as_tibble %>%
                        summarise_all(sd) %>%
                        unlist
            term <- .x %>%
                          coef %>% 
                          names 
            tibble(term, pred)                        

        }))  %>%
   select(-mod_linear) %>%
   unnest     

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM