2017-05-05 47 views
0

为了确定冠军模型,我正在构建数十个预测模型。我正在处理千兆字节的数据,因此跟踪运行时间非常重要。在R中管理多个模型和运行时间

我想以列表式格式构建我的所有模型,所以我不必在全局环境中管理所有不同的模型名称。但是,看起来每个模型获得计时的唯一方法是使用单独的命名对象。

这里有一个基本的方法是什么方法我在寻找:

library(tidyverse) 

# Basic Approach 

Time_1 <- system.time(
    Model_1 <- lm(am ~ disp, mtcars) 
) 

Time_2 <- system.time(
    Model_2 <- lm(am ~ disp + cyl, mtcars) 
) 

# etc. for dozens more 

Time_List <- 
    mget(ls(pattern = "Time")) %>% 
    bind_rows() 

然而,正如你所看到的,我必须手动命名每个模型和时间记录。我正在寻找的东西类似于使用以下代码生成的表格,其中“xxx”是运行时间的实际记录。

# Tribble Output 
tribble(
    ~Model_Name, ~Model_Function, ~Run_Time, 
    "Model_1", lm(am ~ disp, mtcars), "xxx", 
    "Model_2", lm(am ~ disp + cyl, mtcars), "xxx" 
) 

# A tibble: 2 × 3 
    Model_Name Model_Function Run_Time 
     <chr>   <list> <chr> 
1 Model_1  <S3: lm>  xxx 
2 Model_2  <S3: lm>  xxx 

我很感激任何提供的输入,无论使用什么软件包。

回答

1

如果在system.time内分配,则可以同时保存时间和计算的内容。如果您分配的结果列表栏,你可以解开它:

library(tidyverse) 

data_frame(formula = c(mpg ~ wt, mpg ~ wt + hp)) %>% 
    mutate(model_time = map(formula, ~{ 
       time <- system.time(model <- lm(.x, mtcars)); 
       lst(model, time) 
      }), 
      model = map(model_time, 'model'), 
      time = map(model_time, 'time')) %>% 
    select(-model_time) 
#> # A tibble: 2 × 3 
#>   formula model   time 
#>   <list> <list>   <list> 
#> 1 <S3: formula> <S3: lm> <S3: proc_time> 
#> 2 <S3: formula> <S3: lm> <S3: proc_time> 

因为列都还列出了它看起来并不像很多,但所有的数据都是现在和可以进一步提取。

等效替代:

data_frame(formula = c(mpg ~ wt, mpg ~ wt + hp)) %>% 
    mutate(model_time = map(formula, ~{ 
       time <- system.time(model <- lm(.x, mtcars)); 
       data_frame(model = list(model), 
          time = list(time)) 
      })) %>% 
    unnest(model_time) 
+0

太好了!我不再在工作,但我会调查一次,我回来。 –