首页 > 解决方案 > 仅存储回归系数和统计数据,然后使用 Stargazer 导出它们

问题描述

我正在对大样本和许多协变量进行回归,导致每个 lm 对象大约 10Gb(我需要运行几十个回归)。我想保存回归输出,然后导入它们并使用 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")

在此示例中,您可以在此处找到 Stargazer 的输出(抱歉,我是新成员,Stack Overflow 不允许我在帖子中嵌入图像)

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

标签: rstargazer

解决方案


存储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]。我会在此处添加代码以实现目标,但我通常会保留该服务以供提问并提供完整示例。如果这还不够,您应该参考如何制作一个出色的 R 可重现示例并编辑您的问题。


推荐阅读