【问题标题】:Store only regression coefficients and statistics and then export them with Stargazer仅存储回归系数和统计数据,然后使用 Stargazer 导出它们
【发布时间】:2019-04-10 03:19:23
【问题描述】:

我正在使用大样本和许多协变量运行回归,导致每个大约 10Gb 的 lm 对象(我需要运行几十个回归)。我想保存回归输出,然后将它们导入并使用 Stargazer 创建表。我一直在通过以下方式做到这一点:

#Fake dataset
set.seed(1)
dataset<- data.frame(
x = rnorm(100),
z = rnorm(100),
w = rnorm(100),
y = rnorm(100) + 2*x + 3*w,
)

#Running regressions and storing them
reg1<-lm(y ~ x + z, data=dataset)
saveRDS(reg1, "reg1.rds")
rm(reg1)

reg2<-lm(y ~ x + w, data=dataset)
saveRDS(reg2, "reg2.rds")
rm(reg2)

#Later, I decide which models to report and export outputs tables using Stargazer
reg1<-read_rds("reg1.rds")
reg2<-read_rds("reg2.rds")
stargazer(reg1,reg2, type="text")

Here你在这个例子中找到了 Stargazer 的输出(抱歉,我是新成员,Stack Overflow 不允许我在帖子中嵌入图片)

这样做的问题是rds文件太大,占用了我的HD很多内存空间。即使我在 lm() 函数中设置了选项 model=FALSE,问题仍然存在。有没有其他方法可以在不占用大量磁盘空间的情况下完成我一直在做的事情?

【问题讨论】:

  • 如果您只想保留系数和标准误差,那么coef(reg1)vcov(reg1) 将只提取您需要的信息。请注意,reg1 是一个列表,其中的内容可能比您需要的要多得多。另一种选择是从每个列表中删除/删除您不需要的大项目,例如,reg1$residuals &lt;- NULL
  • 另一种节省空间的方法是只将summary(reg1)$coefficients 写入磁盘。这是一个包含 'Estimate''Std. Error''t value''Pr(&gt;|t|)' 列的数据框。
  • @DanY 我知道我可以以这种方式存储回归输出,但问题是如果我以后不知道如何使用 Stargazer 创建一个以这种方式存储结果的表。
  • @RuiBarradas 这是存储结果的好方法。但是,如果使用 summary(reg1)$coefficients 作为 stargazer 的输入,它将打印整个数据框,而不是创建回归表并在第一列中打印 reg1 结果。

标签: r stargazer


【解决方案1】:

存储summary 结果的建议实际上是针对您的目标。您还需要知道 stargazer 从 model.object 中获取的确切值。这实际上并没有在帮助页面中详细描述,但是一旦您查看它的代码,它就相当明显了。这是stargazer使用的核心函数的顶部。如果您的控制台存储了足够多的代码行,您可能会看到它(但我的 Rstudio 安装没有,所以我在从 CRAN 下载包并解包后在编辑器中查看了它):

stargazer:::.stargazer.wrap  # scrolls off the top of my console
# cut from stargazer-internal.R
.stargazer.wrap <-
  function(..., type, title, style, summary, out, out.header, covariate.labels, column.labels, column.separate, 
           dep.var.caption, dep.var.labels, dep.var.labels.include, align, coef, se, t, p, t.auto, 
           p.auto, ci, ci.custom, ci.level, ci.separator, add.lines, apply.coef, apply.se, apply.t, apply.p, apply.ci,
           colnames,
           column.sep.width, decimal.mark, df, digit.separate, digit.separator, digits, digits.extra, 
           flip, float, 
           float.env, font.size, header, initial.zero, intercept.bottom, intercept.top, keep, keep.stat, 
           label, model.names, model.numbers, multicolumn, no.space, notes, notes.align, notes.append, 
           notes.label, object.names, omit, omit.labels, omit.stat, omit.summary.stat, omit.table.layout,
           omit.yes.no, order, ord.intercepts, perl, report, rownames,
           rq.se, selection.equation, single.row, star.char, star.cutoffs, suppress.errors, 
           table.layout, table.placement, 
           zero.component, summary.logical, summary.stat, nobs, mean.sd, min.max, median, iqr, warn) {

  .add.model <-
  function(object.name, user.coef=NULL, user.se=NULL, user.t=NULL, user.p=NULL, auto.t=TRUE, auto.p=TRUE, user.ci.lb=NULL, user.ci.rb=NULL) {

    if (class(object.name)[1] == "Glm") {
        .summary.object <<- summary.glm(object.name)
    }
    else if (!(.model.identify(object.name) %in% c("aftreg", "coxreg","phreg","weibreg", "Glm", "bj", "cph", "lrm", "ols", "psm", "Rq"))) {
      .summary.object <<- summary(object.name)
    }
    else {
      .summary.object <<- object.name
    }

所以为了欺骗stargazer,你需要做的就是将摘要对象内容的类更改为原始模型的类。

(保存并返回示例代码。)

哎呀。我回到你的问题来设置我测试过的代码,但遗憾的是......它没有 [MCVE]。我会在此处添加代码以实现目标,但我通常保留该服务以供提问并提供完整示例。如果这还不够,您应该参考How to make a great R reproducible example 并编辑您的问题。

【讨论】:

  • 感谢您的帮助。我更新了帖子,现在我认为它是可复制的。我不确定如何以与 Stargazer 兼容的方式将对象的类更改为 lm。你能帮我解决这个问题吗?
猜你喜欢
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多