如何通过使用lapply函数将带有broom :: tidy的回归输出列表转换为数据帧?

时间:2019-05-16 14:22:42

标签: r regression lapply broom

我有一个包含多个数据框的列表。每个数据帧包含三列(ColumnOne,ColumnTwo和ColumnThree)。

list <- list(df1, df2, df3)

我正在使用lapply在每个数据帧上运行回归。

regression <- lapply(list, function (x) 
  lm(x$ColumnOne ~ x$ColumnTwo + x$ColumnThree))

当我显示回归输出时,一切似乎都正确。

现在,我想使用broom :: tidy收集表中每个数据框的回归输出。

library(broom)
df <- lapply(regression, function(x)
  tidy(regression$x))
df

但是,当我显示df时,它仅显示空(0x0)数据帧。

不胜感激!

2 个答案:

答案 0 :(得分:0)

使用 purrr 非常紧凑。

首先,模拟一些数据:

library(tidyverse)
library(broom)

df_list = map(1:3, ~ data.frame(matrix(sample.int(10, 30, replace = TRUE), ncol = 3)))

然后简单地拟合模型并清除结果:

> df_list %>% map( ~ tidy(lm(.)))
[[1]]
# A tibble: 3 x 5
  term        estimate std.error statistic p.value
  <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 (Intercept)   7.40       3.08     2.40    0.0474
2 X2            0.0309     0.341    0.0905  0.930
3 X3           -0.0387     0.358   -0.108   0.917

[[2]]
# A tibble: 3 x 5
  term        estimate std.error statistic p.value
  <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 (Intercept)   4.63       1.51      3.07   0.0181
2 X2            0.252      0.272     0.923  0.387
3 X3            0.0340     0.261     0.130  0.900

[[3]]
# A tibble: 3 x 5
  term        estimate std.error statistic p.value
  <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 (Intercept)   6.62       5.68      1.17    0.282
2 X2            0.0946     0.630     0.150   0.885
3 X3           -0.405      0.419    -0.967   0.366

答案 1 :(得分:0)

对于这样的应用程序,我建议以略有不同的方式使用扫帚软件包。方法如下:

require(broom)

# simulate data
make_df <- function(){data.frame(ColumnOne = rnorm(5), 
                                 ColumnTwo=rnorm(5),
                                 ColumnThree=rnorm(5)
                                 )
                     }

my_list <- list(df1 = make_df(), 
                df2 = make_df(),
                df3=make_df()
                )

# bind the rows of the dataframe together and group by origin
my_list %>% 
     bind_rows(.id='df') %>% 
     group_by(df) %>% 
     do(tidy(lm(data=., 
                formula=ColumnOne ~ ColumnTwo + ColumnThree
                )
             )
        )

我对随机玩具数据所做的结果是一个数据帧,如下所示:

 A tibble: 9 x 6
# Groups:   df [3]
  df    term        estimate std.error statistic p.value
  <chr> <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 df1   (Intercept)  -1.23      0.840     -1.47  0.280  
2 df1   ColumnTwo     0.944     0.573      1.65  0.241  
3 df1   ColumnThree  -0.532     0.486     -1.09  0.388  
4 df2   (Intercept)   0.942     0.718      1.31  0.320  
5 df2   ColumnTwo     0.900     1.02       0.885 0.470  
6 df2   ColumnThree  -0.0596    0.443     -0.135 0.905  
7 df3   (Intercept)   0.0453    0.0742     0.610 0.604  
8 df3   ColumnTwo     0.554     0.0509    10.9   0.00833
9 df3   ColumnThree  -0.229     0.114     -2.00  0.183  

Broom的设计策略是尽可能使用数据框。如果您从一列具有相同列的数据帧开始,将它们合并为一个数据帧会更容易,然后用扫帚让您直接对其进行处理,而不必对列表进行功能编程。