【问题标题】:Memory issue when using factor for fixed effect regression使用因子进行固定效应回归时的内存问题
【发布时间】:2025-11-28 02:20:07
【问题描述】:

我正在处理包含 900,000 个观察值的数据。有一个分类变量x 具有 966 个唯一值,需要用作固定效果。我在回归中使用factor(x) 包含固定效果。它给了我这样的错误

错误:无法分配大小为 6.9 Gb 的向量

如何解决这个错误?还是我需要在回归中为固定效果做一些不同的事情?

那么,我该如何运行这样的回归:

rlm(y~x+ factor(fe), data=pd)

【问题讨论】:

  • 996 列乘以 9e5 为 896400000。乘以每个整数 4 个字节为 3.5 Gb。 R 的内部操作通常需要更多内存。
  • 对!那么人们如何在 R 中进行这样的回归呢?
  • 除了购买更多内存? Here 是一些提示。

标签: r regression


【解决方案1】:

由一个因子构建的虚拟变量集的信息含量非常低。例如,仅考虑与 966 级分类预测器对应的模型矩阵的列,每行恰好包含一个 1 和 965 个零。

因此,您通常可以通过使用Matrix::sparse.model.matrix()(或MatrixModels::model.Matrix(*, sparse=TRUE),如sparse.model.matrix 文档所建议的那样)构造稀疏模型矩阵来节省大量内存。但是,要使用它,您使用的任何回归机制都必须接受模型矩阵 + 响应向量,而不是需要公式(例如,要进行线性回归,您需要 sparse.model.matrix + lm.fit 而不是能够使用lm)。

与@RuiBarradas 对密集模型矩阵的 3.5Gb 估计相比:

m <- Matrix::sparse.model.matrix(~x,
     data=data.frame(x=factor(sample(1:966,size=9e5,replace=TRUE))))
format(object.size(m),"Mb")
## [1] "75.6 Mb"

如果您正在使用 MASS 包中的 rlm 函数,则应该可以使用以下方法:

library(Matrix)
library(MASS)
mm <- sparse.model.matrix(~x + factor(fe), data=pd)
rlm(y=pd$y, x=mm, ...)

请注意,我没有实际测试过这个(你没有给出一个可重现的例子);这至少应该让您完成创建模型矩阵的步骤,但我不知道rlm() 是否会进行任何会破坏和/或使模型矩阵非稀疏的内部计算。

【讨论】:

  • 谢谢!但是要运行 rlm(y~x+ factor(fe), data=pd),我应该怎么做呢?我如何为它编写上面的命令?
  • 我已经回答了这个问题。请注意,这是首先包含在您的问题中的真正有用的信息......
  • 不!我得到了同样的错误,这次是 5.9 Gb。我在上面简化了我的问题:我有两个系列的固定效果,一个有 966 个唯一值,另一个有 170 个唯一值。这就是我收到错误的原因吗?
  • 是两个因素吗?也就是说,您的模型是 y~ factor(x1)+factor(x2) 吗?正如我所说,MASS::rlm 可能会在某些时候进行一些内部计算,从而将模型矩阵强制为稠密......