繁体   English   中英

R中的大型固定效应二项式回归

[英]Large fixed effects binomial regression in R

我需要在具有 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 包含仅出现一次的级别,因此我无法将这些集合分成具有一致级别的不同组块。 如果我删除固定效应 A 的 10 个因子和 B 的 8 个因子(一个小改动),我将只剩下 4 个以上级别的因子,并且将我的数据分成 4 个块将使它更易于管理。 但是,然后我仍然需要弄清楚如何以一种方式对我的 df 进行排序,以确保我的 480.000 个条目被分为 4 个块,其中 3 个因素中的每一个的每个因素级别至少出现一次。

glmmGS/glmgsglmmgs包中的glmmgs函数执行固定效应减法,类似于使用“高斯-赛德尔”算法进行逻辑回归的lfe包。 不幸的是,该软件包不再被开发。 作为 R 的新手并且没有深入的统计经验,我无法理解输出,也不知道如何以一种能给我正常“效果大小”、“模型拟合”、“显着性区间”指标,由 glm 回归摘要提供。

我向软件包的作者发送了一条消息。 他们亲切地回应如下:

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

如果任何人都可以解释如何“轻松计算大部分拟合统计数据”,以使没有受过任何统计学教育的人可以理解它(可能是不可能的),或者提供 R 代码来说明如何做到这一点,我会非常感谢!

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

MatrixModels / glm4:一个人建议我使用glm4所述的功能MatrixModels包与sparse = TRUE属性加快计算。 如果我运行带有所有固定效应的glm4回归,我会收到"Error in Cholesky(crossprod(from), LDL = FALSE) : internal_chm_factor: Cholesky factorization failed错误"Error in Cholesky(crossprod(from), LDL = FALSE) : internal_chm_factor: Cholesky factorization failed ”错误。 如果我仅使用固定效应变量 B 或 A 和 C 运行它,则计算有效并返回"glpModel"对象。 glmmGS我在将该输出转换为对我有意义的形式时glmmGS一些问题,因为标准的summary()方法似乎对它不起作用。

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

查看

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)

计算时差是“巨大的”!

对于后代,我还想推荐一个speedglm包,我发现在尝试对大型数据集进行逻辑回归时,这个包很有用。 它似乎使用了大约一半的内存,并且比glm更快地完成。

我同意谁(@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类的汇总方法。 虽然,插槽看起来有明显的名称,但是你的估算器不应该花费很长时间,例如标准误差,计算方差估计等。

alpaca包中的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM