我有以下小标题
tribble(
~func, ~models, ~data,
'lm' , formula = mpg ~ disp, mtcars,
'lm' , formula = mpg ~ disp, filter(mtcars, carb < 4)
)
Run Code Online (Sandbox Code Playgroud)
现在我想在数据集上拟合func用公式指定的模型类型。我试图这样使用,但它不起作用:modelsdatainvoke
tribble(
~func, ~models, ~data,
'lm' , formula = mpg ~ disp, mtcars,
'lm' , formula = mpg ~ disp, filter(mtcars, carb < 4)
)%>% invoke_map(func, list(models, data))
Run Code Online (Sandbox Code Playgroud)
我们想要建立一个包含所有并行参数的列表列表,然后调用一个接受所有参数的函数。我们将使用 来完成此操作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)))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)# 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>
您可以在 的各种模型整理函数中使用列表列拟合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"))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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")}
Run Code Online (Sandbox Code Playgroud)
请注意在函数名称周围使用引号,以及使用rowwise使列表列表 ( .x ) 的每个列表元素的长度为 1。