1

我正在构建数十个预测模型,以确定一个冠军模型。我正在处理千兆字节的数据,因此跟踪运行时间很重要。

我想以列表类型的格式构建我的所有模型,因此我不必在全局环境中管理所有不同的模型名称。但是,似乎获得每个模型的时间的唯一方法是拥有单独的命名对象。

这是一种接近我正在寻找的基本方法:

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

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

4

1 回答 1

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)
于 2017-05-05T23:26:19.270 回答