当数据量巨大时,如何在R中输出多个回归结果

时间:2017-11-22 00:50:03

标签: r xtable stargazer pander

我正在研究R中的三个线性回归模型。例如:

reg1=lm(y~x1,data=dataset)
reg2=lm(y~x2,data=dataset)
reg3=lm(y~x3,data=dataset)

我想使用'stargazer'包输出这些结果。代码如下:

library(stargazer)
stargazer(reg1, reg2, reg3, title="Results", align=TRUE,type = "html",style = "qje", out="Table1.html")

但问题是我正在使用的数据集是巨大的。因此reg1,reg2和reg3的大小很大(每个大约为3.8Gb)。我的电脑无法同时保存所有三个回归模型的结果。但直觉上我只需要系数,标准偏差和p值等。这些项目不应占用太多空间。我怎样才能解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

可以大大删除lm对象,但不是一直都是如此。 (更有原则的方法是沿着不同的行重建stargazer,但这需要做更多的工作。)特别是,删除残差和与某些组件相关的行/列名称有很大帮助(但它对上面给出的例子产生了最大的影响,其中有一个数字预测器;如果有更多的预测变量,它将帮助更少。) stargazer工作所需的最大剩余组件是QR矩阵和拟合值。

生成一个例子:

set.seed(101)
dd <- data.frame(y=rnorm(1e5),x1=rnorm(1e5),x2=rnorm(1e5),x3=rnorm(1e5))
reg1=lm(y~x1,data=dd)
reg2=lm(y~x2,data=dd)
reg3=lm(y~x3,data=dd)

用于探索模型组件大小的实用程序函数:

inspect <- function(x=reg1) {
    sapply(x,function(z) round(as.numeric(object.size(z))/2^20,2))
}
s <- function(x) cat(format(object.size(x),units="Mb"),"\n")

尝试一下:

s(reg1)  ## 24.4 Mb
inspect(reg1)
##  coefficients     residuals       effects          rank fitted.values 
##          0.00          6.87          1.53          0.00          6.87 
##        assign            qr   df.residual       xlevels          call 
##          0.00          7.63          0.00          0.00          0.00 
##         terms         model 
##          0.00          1.53 

删除组件的功能:

strip_lm <- function(x) {
    x$residuals <- NULL
    x$model <- NULL
    x$effects <- NULL
    names(x$fitted.values) <- NULL
    dimnames(x$qr$qr) <- NULL
    return(x)
}

尝试一下:

reg1B <- strip_lm(reg1)
s(reg1B)
##2.3 Mb 
inspect(reg1B)
## coefficients          rank fitted.values        assign            qr 
##         0.00          0.00          0.76          0.00          1.53 
##  df.residual       xlevels          call         terms 
##        0.00          0.00          0.00          0.00 

在这种情况下,剩下的唯一大部件是拟合值和QR分解,两者都需要stargazer,但删除名称节省了大量空间。如果有很多预测变量(即X矩阵很宽,而不是很长),删除名称几乎没有帮助...

尝试stargazer以确保我们没有删除任何所需内容:

library(stargazer)
res <- capture.output(stargazer(reg1B,reg2,reg3,
          title="Results", align=TRUE,type = "html",
          style = "qje", out="Table1.html"))