Использование сопоставления при применении линейной модели к указанным переменным

#r

#r

Вопрос:

Я хочу выполнить линейную модель, такую, чтобы для моих n ковариат она выполнялась n раз за y ~ x1 , …, y ~ xn . Я сделал это с помощью цикла for, и поэтому я был заинтригован тем, что заставил ее работать с отображением.

Например, у map функции есть пример, в котором она запускает линейную модель для mpg ~ wt для каждого из уровней фактора переменной cyl . Затем это дает три линейные модели — по одной для каждого из уровней факторов cyl :

 library(purrr)

mtcars %>%
  split(.$cyl) %>%
  map(~ lm(mpg ~ wt, data = .x))
  

Что, если бы вместо этого я захотел использовать map функцию для запуска линейной модели для определенных переменных (например, скажем, у меня есть вектор с «cyl» и «wt» в нем, и я хотел бы запустить lm(mpg ~ cyl) , а затем lm(mpg ~ wt) .

Спасибо.

Ответ №1:

Мы можем использовать map2 для передачи vector , имеющего ту же длину, что и длина list

 library(tidyverse)
mtcars %>%
  group_split(cyl) %>%
  map2(., c("cyl", "wt", "drat"), ~ lm(paste0("mpg ~ ", .y), data = .x))
  

или использовать reformulate

 mtcars %>%
   group_split(cyl) %>%
   map2(., c("cyl", "wt", "drat"), ~ lm(reformulate(.y, "mpg"), data = .x))
  

Если предполагается иметь несколько lm для каждого list элемента

 mtcars %>%
    group_split(cyl) %>% 
    map(~  {
          data = .x
           map(c("cyl", "wt"), ~ lm(reformulate(.x, "mpg"), data = data))
        })
  

Комментарии:

1. Есть идеи, как сохранить имена разделения / групп в выходных данных? Я вижу, что есть этот метод: github.com/tidyverse/dplyr/issues/4223#issuecomment-469269857 но кажется сложным? Особенно при наличии нескольких групп.

2. @JasonAizkalns split должен сохранить это mtcars %>% split(.$cyl) , в group_split для этого нет параметров

3.@JasonAizkalns В противном случае вам необходимо использовать keep = TRUE mtcars %>% group_split(cyl, keep = TRUE) %>% map(~ .x$cyl)