Запуск нескольких вложенных регрессионных моделей в рабочем процессе tidyverse - PullRequest
0 голосов
/ 03 августа 2020

Я часто хочу запустить одну и ту же регрессию для обеих разных подгрупп моих данных и с несколькими моделями (например, двумерная модель и модель с элементами управления). Мне кажется, что для этого должен хорошо работать рабочий процесс муррр / тидир / веник, состоящий из вложений, карт и уборки. Я понимаю, как создавать подгруппы во вложенном рабочем процессе, но я не понимаю, как запускать более одной модели и выводить список результатов упорядоченной регрессии для каждой.

Например, это:

mtcars %>% 
  nest(data=-c(vs)) %>%
  mutate(
    fit = map(data,~lm(mpg ~ cyl, data = .x)),
    fit1 = map(data,~lm(mpg ~ cyl + gear + wt, data = .x)),
    tidied = map(fit, tidy),
    tidied1 = map(fit1, tidy),
  ) %>% 
  unnest(tidied) %>% 
  unnest(tidied1) 

генерирует результат «Имена должны быть уникальными», предположительно потому, что он думает, что я хочу привязать результаты к столбцу, но bind_rows (tidied, tidied1) возвращает «object 'tidied' not found».

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Одно из предложений - добавить операцию gather() между подгонкой с помощью lm() и уборкой с помощью broom::tidy(). Это эффективно объединяет все модели в один столбец и упрощает уборку с помощью одной операции:

mtcars %>%
    nest(data=-c(vs)) %>%
    mutate(
        fit = map(data,~lm(mpg ~ cyl, data = .x)),
        fit1 = map(data,~lm(mpg ~ cyl + gear + wt, data = .x))
    ) %>%
    gather(name, model, fit:fit1) %>%        # <--- consolidate before tidying
    mutate(tidied = map(model, tidy)) %>%
    unnest(tidied)
# # A tibble: 12 x 9
#        vs data        name  model  term    estimate std.error statistic   p.value
#     <dbl> <list>      <chr> <list> <chr>      <dbl>     <dbl>     <dbl>     <dbl>
#   1     0 <tibble [1… fit   <lm>   (Inter…   36.9       3.69     10.0     2.73e-8
#   2     0 <tibble [1… fit   <lm>   cyl       -2.73      0.490    -5.56    4.27e-5
#   3     1 <tibble [1… fit   <lm>   (Inter…   41.9       5.78      7.26    1.00e-5
#   4     1 <tibble [1… fit   <lm>   cyl       -3.80      1.24     -3.07    9.78e-3
#   5     0 <tibble [1… fit1  <lm>   (Inter…   41.9       5.71      7.33    3.76e-6
# ...
1 голос
/ 03 августа 2020

EDITED

Вот вариант, использующий вложенные вызовы map и избегающий необходимости извлекать данные. модели

library(dplyr)
library(ggplot2)
library(dotwhisker)

map(formulae, function (y) 
  mtcars %>%
    split(.$am) %>%
    purrr::map(~ lm(y, data = .x)) %>%
    dwplot() %>%
    relabel_predictors(c(wt = "Weight", cyl = "Cylinders", gear = "Gears")) +
    theme_bw() + xlab("Coefficient") + ylab("") +
    geom_vline(xintercept = 0, colour = "grey60", linetype = 2) +
    ggtitle(paste("The model is", deparse(y, width.cutoff = 100), collapse=""))  +
    scale_colour_grey(start = .4, end = .8,
                      name = "Transmission",
                      breaks = c("Model 0", "Model 1"),
                      labels = c("Automatic", "Manual"))
)
#> $bivariate

#> 
#> $wcontrol

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...