Используйте lapply для множественной регрессии с изменением формулы, а не набора данных

Я видел пример применения list (lapply), которое прекрасно работает, чтобы получить список объектов данных и вернуть список результатов регрессии, которые мы можем передать Stargazer для вывода в хорошем формате. Использование stargazer со списком объектов lm, созданных путем наложения на разделенную data.frame

library(MASS)
library(stargazer)
data(Boston)

by.river <- split(Boston, Boston$chas)
class(by.river)

fit <- lapply(by.river, function(dd)lm(crim ~ indus,data=dd))
stargazer(fit, type = "text")

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

fit2 <- vector(mode = "list", length = 2)
fit2[[1]] <- lm(nox ~ indus, data = Boston)
fit2[[2]] <- lm(crim ~ indus, data = Boston)
stargazer(fit2, type = "text")

с lapply, я попробовал это, и это не работает. Где я неправ?

myvarc <- c("nox","crim")
class(myvarc)
myvars <- as.list(myvarc)
class(myvars)
fit <- lapply(myvars, function(dvar)lm(dvar ~ indus,data=Boston))
stargazer(fit, type = "text")

4 ответа

Решение

Это должно работать:

fit <- lapply(myvars, function(dvar) lm(eval(paste0(dvar,' ~ wt')), data = Boston))

Попробуйте создать динамические формулы из строки:

fit <- lapply(myvars, function(dvar)
    lm(as.formula(paste0(dvar, " ~ indus")),data=Boston))

Вы также можете использовать dplyr & purrr подход, держи все в tibbleвытащите то, что вы хотите, когда вам это нужно. Нет отличий в функциональности от lapply методы.

library(dplyr)
library(purrr)
library(MASS)
library(stargazer)

var_tibble <- tibble(vars = c("nox","crim"), data = list(Boston)) 

 analysis <- var_tibble %>% 
  mutate(models = map2(data, vars, ~lm(as.formula(paste0(.y, " ~ indus")), data = .x))) %>% 
  mutate(tables = map2(models, vars, ~stargazer(.x, type = "text", dep.var.labels.include = FALSE, column.labels = .y)))

Вы также можете использовать get():

# make a list of independent variables
  list_x <- list("nox","crim")

# create regression function
  my_reg <- function(x) { lm(indus ~ get(x), data = Boston) }

# run regression
  results <- lapply(list_x, my_reg)
Другие вопросы по тегам