在 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)
我正在构建数十个预测模型,以努力确定冠军模型。我正在处理数 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)