如何加速GLM估计?

14

我正在使用Amazon EC2上的RStudio 0.97.320(R 2.15.3)。我的数据框有20万行和12列。

我正在尝试拟合大约1500个参数的逻辑回归模型。

R正在使用7%的CPU和60+GB的内存,但仍需要很长时间。

以下是代码:

glm.1.2 <- glm(formula = Y ~ factor(X1) * log(X2) * (X3 + X4 * (X5 + I(X5^2)) * (X8 + I(X8^2)) + ((X6 + I(X6^2)) * factor(X7))), 
  family = binomial(logit), data = df[1:150000,])

有什么建议可以显著加快这个过程的速度吗?


5
我暂时无法提供关于速度的建议,但是就推理而言,你不应该使用 var+I(var^2),而应该使用 poly(var,2)。你构建了一个非常复杂的公式,很难确定你是否需要这样一个庞然大物。你应该描述研究问题,并获得有关分析设计的进一步建议,最好在CrossValidated上进行。 - IRTFM
10
我怀疑拟合1500个参数会得到有用的结果。 - Roland
4
有趣的技术问题,尽管我同意其他评论者的担忧。(1) 在 RcppArmadillo 包中有一个名为fastLm 的函数,演示了如何加速线性回归 http://gallery.rcpp.org/articles/fast-linear-model-with-armadillo/ ,但重新实现GLM需要更多的工作。(2) 安装优化后的BLAS库可能是更容易实现的目标: http://www.r-bloggers.com/faster-r-through-better-blas/。(3) 线性回归可能效果不错,尽管这种情况下 N/P 只有133。(4) 通过 glmnet 包尝试惩罚GLM... - Ben Bolker
1
(5)由于您的某些预测因素是因子,因此使用稀疏模型矩阵(请参阅Matrix软件包中的?glm.fit?sparse.model.matrix)可能会提高速度--特别是如果您的因子具有许多级别。 - Ben Bolker
6
你应该认真考虑使用glmnet,它非常快(采用梯度下降法),并且在拟合1500个参数时,我认为正则化(通过弹性网络)不会造成伤害... - dickoa
显示剩余2条评论
3个回答

11

有几个包可以加速glm拟合。 fastglm的基准测试显示它甚至比speedglm更快。

您还可以在计算机上安装一个性能更好的BLAS库(如Ben Bolker在评论中建议的那样),这将有助于任何方法。


我能在逐步回归中使用speedglm吗? - mql4beginner
不要使用逐步回归,而要使用套索回归。 - Gregor Thomas

7

虽然有点晚,但我只能支持dickoa的建议,使用Matrix包生成稀疏模型矩阵,然后将其馈送给speedglm.wfit函数。这样做非常好;)这样,我能够在不到3分钟的时间内对一个1e6 x 3500的模型矩阵进行逻辑回归。


6
假设你的设计矩阵不是稀疏的,那么你也可以考虑使用我的包 parglm。请参见此文档,以比较计算时间和更多细节。我在这个相关问题中展示了计算时间的比较。 parglm函数中的一种方法类似于mgcv中的bam函数。该方法在以下文献中有详细描述:

Wood, S.N., Goude, Y. & Shaw S. (2015) Generalized additive models for large datasets. Journal of the Royal Statistical Society, Series C 64(1): 139-155.

该方法的一个优点是,即使使用非并发QR实现,仍然可以并行计算。另一个优点是潜在的较低内存占用。这在mgcvbam函数中被使用,并且也可以在此处实现,如speedglmshglm函数设置。

1
你能否再多提供一点关于 parglm 的背景信息吗?比如它是如何实现计算效率的? - Ben Bolker
2
我已经按照mgcv中的bam函数所做的那样,首先对数据的不同块进行了一系列QR分解的估计。然后在最后将结果组合起来。更多细节可以在“Wood,S.N.,Goude,Y.&Shaw S.(2015)Generalized additive models for large datasets. Journal of the Royal Statistical Society,Series C 64(1):139-155”中找到。 - Benjamin Christoffersen
2
太好了。你能把这个解释编辑到你的问题中吗?(评论是短暂的) - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接