Перебор разных переменных и наборов данных в R регрессии

#r #loops #regression

#r #циклы #регрессия

Вопрос:

Я могу запустить одну и ту же регрессию, используя разные фреймы данных, используя канал и цикл (см. Ниже):

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

Однако, что, если мне интересно увидеть результаты для одной и той же регрессии, но для ряда разных зависимых переменных — например, «mpg», «hp», «drat». Есть ли быстрый способ сделать это с использованием циклов?

Я пробовал использовать вложенные циклы lapply, group_by и т.д. однако, похоже, я не могу найти решение.

Любая помощь была бы отличной.

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

1. Что такое одна и та же регрессия с разными зависимыми переменными?

2. Привет @r.user.05apr, я имею в виду, что я хотел бы сохранить все в регрессии как есть, но изменить зависимую переменную (т. Е. Запускать регрессию, используя каждый раз другую зависимую переменную).

Ответ №1:

Похоже, вы хотите перебирать имена столбцов каждого фрейма данных. Фактически вам нужна двойная карта или double lapply . Что-то вроде этого сработало бы:

 mtcars %>%
        split(.$cyl) %>%
        lapply(function(x)
        {
          lapply(paste("mpg ~", names(x)[-1]), function(y) {
            lm(formula = as.formula(y), data = x)
        })})

#> $`4`
#> $`4`[[1]]
#> 
#> Call:
#> lm(formula = as.formula(y), data = x)
#> 
#> Coefficients:
#> (Intercept)          cyl  
#>       26.66           NA  
#> 
#> 
#> $`4`[[2]]
#> 
#> Call:
#> lm(formula = as.formula(y), data = x)
#> 
#> Coefficients:
#> (Intercept)         disp  
#>     40.8720      -0.1351  

# ... etc (very long list)
  

Ответ №2:

Аккуратный цикл может быть:

 library(tidyverse)

mtcars %>%
  select(-mpg) %>%
  map(~lm(mtcars$mpg ~ .x), data = mtcars)
  

Ответ №3:

Это может выглядеть как:

 library(dplyr)


label <- "mpg"
features <- setdiff(names(mtcars), label)
generate_formula <- function(feature) sprintf("%s ~ %s", label, feature) %>% as.formula

features %>% 
  map(~ lm(generate_formula(.x), data = mtcars))
  

Вывод:

 [[1]]

Call:
lm(formula = generate_formula(.x), data = mtcars)

Coefficients:
(Intercept)          cyl  
     37.885       -2.876  


[[2]]

Call:
lm(formula = generate_formula(.x), data = mtcars)

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122  


[[3]]

Call:
lm(formula = generate_formula(.x), data = mtcars)

Coefficients:
(Intercept)           hp  
   30.09886     -0.06823
  

Ответ №4:

Мы можем использовать nest_by

 library(dplyr)
mtcars %>% 
   nest_by(cyl) %>% 
   mutate(model = list(lm(mpg~ ., data = data)))
# A tibble: 3 x 3
# Rowwise:  cyl
#    cyl                data model 
#  <dbl> <list<tbl_df[,10]>> <list>
#1     4           [11 × 10] <lm>  
#2     6            [7 × 10] <lm>  
#3     8           [14 × 10] <lm>