簡體   English   中英

如何在purrr中的多個數據集上擬合多個模型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM