我正在研究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值等。这些项目不应占用太多空间。我怎样才能解决这个问题呢?
答案 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"))