16

我需要对具有 480.000 个条目和 3 个固定效应变量的相对较大的数据框运行逻辑回归。固定效应 var A 有 3233 级,var B 有 2326 级,var C 有 811 级。所以总的来说我有6370个固定效果。数据是横截面的。如果我无法使用正常glm函数运行此回归,因为回归矩阵对于我的记忆来说似乎太大(我收到消息“ Error: cannot allocate vector of size 22.9 Gb”)。我正在寻找在我的 Macbook Air(OS X 10.9.5 8GB RAM)上运行此回归的替代方法。我还可以访问具有 16GB RAM 的服务器。

我已经尝试以几种不同的方式解决这个问题,但到目前为止都没有产生令人满意的结果:

lfe/felm:使用lfe的 felm 回归函数,在运行回归之前减去固定效应。这完美地工作,并允许我在短短几分钟内将上述回归作为正常的线性模型运行。但是,lfe不支持逻辑回归和 glms。所以 felm 非常适合了解模型是否适合不同模型,但不适用于最终的逻辑回归模型。

biglm/bigglm:我考虑过使用bigglm将我的功能分解成更易于管理的块。但是,有几个来源(例如link1link2link3) 提到为了使它起作用,因子水平需要跨块保持一致,即每个块必须包含每个因子变量的每个因子中的至少一个。因素 A 和 B 包含只出现一次的关卡,因此我无法将这些集合分成具有一致关卡的不同块。如果我删除 10 个固定效应 A 因子和 8 个 B 因子(一个微小的变化),我将只剩下 4 个以上水平的因子,将我的数据分成 4 个块将使它更易于管理。但是,我仍然需要弄清楚如何对我的 df 进行排序,以确保我的 480.000 个条目被分类为 4 个块,其中 3 个因子中的每个因子的每个因子级别至少出现一次。

GlmmGS/glmgsglmmgs同名包中的函数执行固定效应减法,就像lfe使用“Gauss-Seidel”算法进行逻辑回归的包一样。不幸的是,该软件包不再被开发。对 R 来说相对较新,并且对统计没有深入的经验,我无法理解输出,也不知道如何以一种可以给我正常的“效果大小”、“模型拟合”、“ glm 回归摘要提供的显着性区间”指标。

我向包的作者发送了一条消息。他们友好地回应如下:

该包不提供与 glm 对象相同格式的输出。但是,给定当前输出(在 CRAN 版本中,我相信当前输出是系数估计的向量,以及相关向量标准误差;对于协方差分量也是如此,但如果您正在拟合没有随机效应的模型,则不必担心它们)。请注意,用于计算标准误差的协方差矩阵是与 Gauss-Seidel 算法相关的精度矩阵的对角块的逆矩阵,因此它们往往会低估联合似然的标准误差。我不再维护该软件包,也没有时间了解具体细节; 手册中引用的纸张,其他一切都需要您用笔和纸来解决:)。

如果有人可以解释如何“轻松计算大多数拟合统计数据”,让没有任何统计学知识的人可以理解它(可能是不可能的),或者提供 R 代码来举例说明如何做到这一点,我会非常感谢!

革命分析:我在我的 Mac 上模拟 Windows 7 的虚拟机上安装了革命分析企业。该程序有一个RxLogit针对大型逻辑回归进行了优化的函数。使用RxLogit我得到的函数the error (Failed to allocate 326554568 bytes. Error in rxCall("RxLogit", params) : bad allocation),所以该函数似乎也遇到了内存问题。但是,该软件使我能够在分布式计算集群上运行我的回归。因此,我可以通过在具有大量内存的集群上购买计算时间来“解决问题”。但是,我想知道革命分析程序是否提供了任何我不知道的公式或方法,这些公式或方法可以让我进行某种考虑因素lfe的固定效应减法运算或分块运算。bigglm

MatrixModels/glm4:有人建议我使用带有属性的包的glm4功能来加快计算速度。如果我使用所有固定效果运行回归,我会得到一个“错误。如果我只使用固定效果变量 B OR A 和 C 运行它,则计算工作并返回一个对象。就像我在将输出转换为一种对我有意义的形式,因为标准方法似乎不适用于它。MatrixModelssparse = TRUEglm4"Error in Cholesky(crossprod(from), LDL = FALSE) : internal_chm_factor: Cholesky factorization failed"glpModel"glmmGSsummary()

我很乐意就上述任何问题或完全不同的方法在 R 中运行具有多个大型固定效应和内存限制的逻辑回归提供建议。

4

4 回答 4

7

查看

glmmboot{glmmML}

http://cran.r-project.org/web/packages/glmmML/glmmML.pdf

Brostrom 和 Holmberg 也有一个很好的文档(http://cran.r-project.org/web/packages/eha/vignettes/glmmML.pdf

这是他们文档中的示例:

dat <- data.frame(y = rbinom(5000, size = 1, prob = 0.5),
               x = rnorm(5000), group = rep(1:1000, each = 5))
fit1 <- glm(y ~ factor(group) + x, data = dat, family = binomial)

require(glmmML)
fit2 <- glmmboot(y ~ x, cluster = group,data = dat)

计算时差是“巨大的”!

于 2015-02-27T11:59:42.067 回答
4

对于后代,我还想推荐 package speedglm,我发现它在尝试对大型数据集执行逻辑回归时很有用。它似乎使用了大约一半的内存,并且比glm.

于 2016-08-29T23:36:36.763 回答
3

我同意任何人(我猜是@Ben Bolker?)建议您glm4使用MatrixModels. 首先,如果您使用sparse参数,它可以解决您的记忆问题。具有 480.000 个条目和 6370 个固定效果的密集设计矩阵将需要 6371 * 480.000 * 8 = 24.464.640.000 字节。但是,您的设计矩阵将非常稀疏(许多零),因此如果您使用稀疏矩阵,您可以使用更小的(在内存中)设计矩阵。其次,您可以利用稀疏性来进行更快的估计。

至于选项,快速搜索显示虽然我没有尝试过,但speedglm也有参数。sparse无论你用什么方法结束,我的关键是它应该使用你的设计矩阵是稀疏的,以减少计算时间和减少内存需求。

您得到的错误 ( Error in Cholesky(crossprod(from), LDL = FALSE) : internal_chm_factor: Cholesky factorization failed" error) 可能是因为您的设计矩阵是奇异的。在这种情况下,您的问题没有唯一的解决方案,并且一些选项是合并一些组级别,使用惩罚或随机效应模型。

您是对的,似乎glpModel该类没有摘要方法。虽然,插槽似乎有明显的名称,并且它不应该花很长时间来获得,例如,估计器的标准误差,计算方差估计等。

于 2017-10-17T18:02:33.403 回答
1

羊驼feglm包中的功能可能是您需要的。它允许同时运行 logit 和 probit。

语法就像在lfe::felm()

请参阅从文档中获取的示例:

# Generate an artificial data set for logit models
library(alpaca)
data <- simGLM(1000L, 20L, 1805L, model = "logit")
# Fit 'feglm()'
mod <- feglm(y ~ x1 + x2 + x3 | i + t, data)
summary(mod)
于 2022-01-05T17:43:27.263 回答