Используйте 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)