【问题标题】:Use lapply for multiple regression with formula changing, not the dataset使用 lapply 进行具有公式更改的多元回归,而不是数据集
【发布时间】:2017-06-25 09:57:59
【问题描述】:

我看到了一个 list apply (lapply) 的示例,它可以很好地获取数据对象列表, 并返回一个回归输出列表,我们可以将其传递给 Stargazer 以获得格式良好的输出。 Using stargazer with a list of lm objects created by lapply-ing over a split 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")

【问题讨论】:

  • 这可行,但不整洁(使用列号而不是名称,不保留名称作为 stargazer 输出的标题)fit3 = lapply(Boston[,c(1,5)], function(x)(lm(x ~ Boston$indus))) stargazer(fit3, type = "text")
  • 问题解决如下。然而,这些标签并不能很好地流向 Stargazer。这段代码将解决这个问题。stargazer(fit, type = "text", dep.var.labels.include = FALSE, column.labels = myvarc)

标签: r regression lapply stargazer


【解决方案1】:

你也可以使用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)

【讨论】:

  • @rafapereira 感谢分享您的代码。有用。赞成。有没有办法检索独立预测变量的 p 值?
【解决方案2】:

您还可以使用dplyrpurrr 方法,将所有内容保存在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)))

【讨论】:

    【解决方案3】:

    考虑从字符串创建动态公式:

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

    【讨论】:

    • 类似地,reformulate,您可以使用fit &lt;- lapply(myvars, function(dvar) lm(reformulate("indus", dvar)),data=Boston))
    【解决方案4】:

    这应该可行:

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

    【讨论】:

    • 虽然这和 Parfait 的一样有效,但 Parfait 的 as.formula 阅读起来更有意义。不过我怀疑,使用更通用的eval() 更灵活,并且在其他一些情况下可能会有所帮助。干杯,
    • 在 R 中,eval(parse...)) 虽然这里使用了eval(paste0(...)),但出于各种原因(即安全性、一致性),通常不建议使用相同的概念来评估字符串表达式。见herehere
    • 感谢您的教育!干杯,-
    • 感谢@Parfait 的链接
    猜你喜欢
    • 2019-11-11
    • 2019-07-20
    • 2015-07-21
    • 2015-10-03
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多