使用 lapply 进行公式更改的多元回归,而不是数据集
Use lapply for multiple regression with formula changing, not the dataset
我看过一个列表应用 (lapply) 的示例,它可以很好地获取数据对象列表,
return 回归输出列表,我们可以将其传递给 Stargazer 以获得格式良好的输出。
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")
这应该有效:
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)
我看过一个列表应用 (lapply) 的示例,它可以很好地获取数据对象列表,
return 回归输出列表,我们可以将其传递给 Stargazer 以获得格式良好的输出。
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")
这应该有效:
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)