#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>