2

我正在尝试运行以下回归:

m1=glm(y~x1+x2+x3+x4,data=df,family=binomial())
m2=glm(y~x1+x2+x3+x4+x5,data=df,family=binomial())
m3=glm(y~x1+x2+x3+x4+x5+x6,data=df,family=binomial())
m4=glm(y~x1+x2+x3+x4+x5+x6+x7,data=df,family=binomial())

然后使用stargazer包打印它们:

stargazer(m1,m2,m3,m4 type="html", out="models.html")

问题是,数据帧 df 相当大(~600MB),因此我创建的每个 glm 对象至少为~1.5GB。这会产生一个内存问题,使我无法创建我需要在stargazer中打印的所有回归。

为了减小 glm 对象的大小,我尝试了 2 种方法:

  1. 使用本教程修剪 glm 对象。这确实将 glm 对象修剪为 <1MB,尽管我从 stargazer 函数中得到以下错误:
Error in Qr$qr[p1, p1, drop = FALSE] : incorrect number of dimensions
  1. 使用包speedglm。但是,stargazer不支持它。

有什么建议么?

4

2 回答 2

2

需要的stargazer调用(参见源代码)。所以——据我所知——这是不可能的。summaryqr

但我认为重写 stargazer 以处理摘要列表作为输入应该很容易。这将非常方便。

于 2015-01-06T20:35:52.357 回答
2

对我来说效果很好的一个选项是首先使用lmtest包将大型 *lm 对象转换为“coeftest”类。“coeftest”对象实际上只是汇总回归结果的矩阵,因此几乎不占用任何空间。此外,Stargazer 很容易接受“coeftest”类作为输入,因此您的代码根本不需要更改太多。

使用您的示例:

library(lmtest)

m1 <- glm(y~x1+x2+x3+x4,data=df,family=binomial())
m1 <- coeftest(m1)
m2 <- glm(y~x1+x2+x3+x4+x5,data=df,family=binomial())
m2 <- coeftest(m2)
m3 <- glm(y~x1+x2+x3+x4+x5+x6,data=df,family=binomial())
m3 <- coeftest(m3)
m4 <- glm(y~x1+x2+x3+x4+x5+x6+x7,data=df,family=binomial())
m4 <- coeftest(m4)

stargazer(m1,m2,m3,m4 type="html", out="models.html")

除了解决内存问题之外,这种方法还有一个额外的好处是coeftest()转换本身非常快。(好吧,除了当您通过调用“vcov = vcovHC”选项要求它在特别大的 *lm 对象上产生稳健/聚集的标准错误时,值得注意的例外情况。然而,即使那样,coeftest()转换也是导出的必要步骤首先是稳健的回归结果。)

这种方法的一个小缺点是它不会保存一些可能对您的 Stargazer 表感兴趣的回归统计数据(例如 R 平方或 N)。但是,您可以在转换之前从 *lm 对象轻松获取这些内容。

于 2016-10-13T19:36:46.523 回答