如何在 purrr 中的多个数据集上拟合多个模型?

Dam*_*mbo 5 r purrr

我有以下小标题

    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)

Bri*_*ian 1

我们想要建立一个包含所有并行参数的列表列表,然后调用一个接受所有参数的函数。我们将使用 来完成此操作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)
# 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>
Run Code Online (Sandbox Code Playgroud)

您可以在 的各种模型整理函数中使用列表列拟合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)
  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
Run Code Online (Sandbox Code Playgroud)

更新

另一种方法,与第一种方法更相似:

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。