使用具有记忆贪婪的glm对象的观星者

时间:2014-09-24 07:13:17

标签: r glm stargazer

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

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个approches:

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

2 个答案:

答案 0 :(得分:2)

需要stargazer的{​​{1}}来电summary(请参阅源代码)。所以 - 据我所知 - 这是不可能的。

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

答案 1 :(得分:0)

对我来说效果很好的选项是首先将大* lm对象转换为&#34; coeftest&#34;使用lmtest包的类。 A&#34; coeftest&#34;对象实际上只是汇总回归结果的矩阵,因此几乎不占用任何空间。此外,Stargazer乐意接受&#34; coeftest&#34; class作为输入,所以你的代码根本不需要改变。

使用您的示例:

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()转换本身非常快。 (好吧,有一个值得注意的例外,当你要求它通过调用&#34; vcov = vcovHC&#34;选项在特别大的* lm对象上产生强大/聚集的标准错误时。但是,即便如此,{{ 1}}转换是首先导出稳健回归结果的必要步骤。)

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