[英]Using purrr to fit many models using tidymodels
仍然習慣於stackoverflow,如果沒有正確發布,請道歉。
最近,我發現自己必須運行許多預測變量略有不同的模型來衡量模型性能(我確信有一種更優雅的方法),我正在考慮創建一個函數或使用 map 來做一些舉重。
這里有兩個代表來說明我的困境
這按預期工作:
library(tidymodels)
workflow() %>%
add_model(linear_reg()) %>%
add_formula(mpg ~ hp) %>%
fit(mtcars)
但是,創建我想使用的各種其他預測變量的向量並嘗試通過它進行映射是行不通的(產生錯誤:在data
中找不到以下預測變量:'.x'。)
library(tidymodels)
preds <- c("disp", "hp", "wt")
map(preds, ~workflow() %>% add_model(linear_reg()) %>% add_formula(mpg ~ .x) %>% fit(mtcars))
我懷疑這可能是由於我正在努力尋找解決方案來解決我期望的一個相當普遍的問題?
我們可以使用paste
或reformulate
公式來構造公式
library(tidymodels)
library(purrr)
modlst <- map(preds,
~workflow() %>%
add_model(linear_reg()) %>%
add_formula(reformulate(.x, response = 'mpg')) %>%
fit(mtcars))
-輸出
> modlst
[[1]]
══ Workflow [trained] ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Preprocessor: Formula
Model: linear_reg()
── Preprocessor ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
mpg ~ disp
── Model ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Call:
stats::lm(formula = ..y ~ ., data = data)
Coefficients:
(Intercept) disp
29.59985 -0.04122
[[2]]
══ Workflow [trained] ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Preprocessor: Formula
Model: linear_reg()
── Preprocessor ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
mpg ~ hp
── Model ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Call:
stats::lm(formula = ..y ~ ., data = data)
Coefficients:
(Intercept) hp
30.09886 -0.06823
[[3]]
══ Workflow [trained] ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Preprocessor: Formula
Model: linear_reg()
── Preprocessor ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
mpg ~ wt
── Model ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Call:
stats::lm(formula = ..y ~ ., data = data)
Coefficients:
(Intercept) wt
37.285 -5.344
為了幫助其他偶然發現此問題的人,下面的代碼塊是@akrun 建議的替代方式(使用 paste0 和 as.formula)
library(tidymodels)
preds <- c("disp", "hp", "wt")
map(preds,
~workflow() %>%
add_model(linear_reg()) %>%
add_formula(as.formula(paste0("mpg ~ ", .x))) %>%
fit(mtcars)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.