[英]How to fit multiple models on multiple dataset in purrr?
我有以下的東西
tribble(
~func, ~models, ~data,
'lm' , formula = mpg ~ disp, mtcars,
'lm' , formula = mpg ~ disp, filter(mtcars, carb < 4)
)
現在我想在數據集data
上使用公式models
func
指定的模型類型與rowise相匹配。 我試着使用這樣的invoke
但它不起作用:
tribble(
~func, ~models, ~data,
'lm' , formula = mpg ~ disp, mtcars,
'lm' , formula = mpg ~ disp, filter(mtcars, carb < 4)
)%>% invoke_map(func, list(models, data))
如果每個模型的參數列表都在一個變量中, invoke_map
可以處理這樣的數據集。
這看起來像下面這樣。 注意使用花括號,這樣我就可以從管道鏈中的數據集中調用每一列。
tribble(~func, ~params,
'lm' , list(formula = mpg ~ disp, data = mtcars),
'lm' , list(formula = mpg ~ disp, data = filter(mtcars, carb < 4) ) ) %>%
{invoke_map(.$func, .$params)}
如果您需要從當前的tribble中使用多列中的參數轉換為參數作為單個列中的列表,您可以執行類似的操作
tribble(~func, ~models, ~data,
'lm' , formula = mpg ~ disp, mtcars,
'lm' , formula = mpg ~ disp, filter(mtcars, carb < 4) ) %>%
mutate(params = pmap(list(models, data), list) ) %>%
{invoke_map(.$func, .$params)}
如果您的最終目標是將模型添加到數據集中,則可以在mutate
使用invoke_map
。
tribble(~func, ~models, ~data,
'lm' , formula = mpg ~ disp, mtcars,
'lm' , formula = mpg ~ disp, filter(mtcars, carb < 4) ) %>%
mutate(params = pmap(list(models, data), list),
fit = invoke_map(func, params ) )
我們想要建立一個包含所有並行參數的列表列表,然后調用一個包含所有這些參數的函數。 我們將使用pmap
執行此操作。 方便地, modelr
包具有fit_with
,它采用建模函數,公式和數據集。 由於pmap
返回列表列表,因此我們將其flatten
為數據框中的列表列。
tribble(~funcs, ~models, ~dat,
glm, "len ~ dose", ToothGrowth,
lm, "len ~ dose", filter(ToothGrowth, supp == "VC")) %>%
mutate(fit = flatten(pmap(.l = list(.f = funcs, .formulas = models, data = dat),
.f = modelr::fit_with)))
# A tibble: 2 x 4 funcs models dat fit <list> <chr> <list> <list> 1 <fun> len ~ dose <data.frame [60 x 3]> <S3: glm> 2 <fun> len ~ dose <data.frame [30 x 3]> <S3: lm>
您可以使用list-column 適合 broom
各種模型整理功能。
library(broom)
tribble(~funcs, ~models, ~dat,
glm, "len ~ dose", ToothGrowth,
lm, "len ~ dose", filter(ToothGrowth, supp == "VC")) %>%
mutate(fit = flatten(pmap(.l = list(.f = funcs, .formulas = models, data = dat),
.f = modelr::fit_with))) %>%
do(map_dfr(.$fit, tidy, .id = "dataset"))
dataset term estimate std.error statistic p.value 1 1 (Intercept) 7.422500 1.2600826 5.890487 2.064211e-07 2 1 dose 9.763571 0.9525329 10.250114 1.232698e-14 3 2 (Intercept) 3.295000 1.4270601 2.308943 2.854201e-02 4 2 dose 11.715714 1.0787561 10.860392 1.509369e-11
另一種方法,更類似於您的第一種方法:
tribble(~funcs, ~models, ~dat,
"glm", len ~ dose, ToothGrowth,
"lm", len ~ dose, filter(ToothGrowth, supp == "VC")) %>%
rowwise() %>%
mutate(fit = invoke_map(.f = funcs, .x = list(list(formula = models, data = dat)))) %>%
{map_dfr(.$fit, tidy, .id = "dataset")}
注意在函數名稱周圍使用引號和使用rowwise
使列表( .x )的每個列表元素的長度為1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.