在 R 中管理多个模型和 运行 次

Managing multiple models and run times in R

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

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

这里有一个基本方法可以满足我的要求:

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()

但是,如您所见,我必须手动为每个模型和时间记录命名。我正在寻找的是类似于使用以下代码生成的 table 的内容,其中 "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

无论使用何种软件包,我都将不胜感激。

如果您在 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)