2017-05-05 51 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

太好了!我不再在工作,但我會調查一次,我回來。 –

相關問題