我正在尝试使用R来估计具有手动规范的多项logit模型.我找到了一些允许您在此处或此处估算MNL模型的软件包.
我发现在"滚动"自己MLE功能的一些其他著作在这里.然而,从我的挖掘 - 所有这些功能和包依赖于内部optim功能.
在我的基准测试中,optim是瓶颈.使用具有约16000个观测值和7个参数的模拟数据集,R在我的机器上花费大约90秒.Biogeme中的等效模型需要大约10秒钟.在Ox报告自己的代码的同事报告这个模型的时间约为4秒.
有没有人有编写自己的MLE功能的经验,或者可以指出我的方向优化超出默认optim功能(没有双关语)?
如果有人想要R代码重新创建模型,请告诉我 - 我会提供它.我没有提供它,因为它与优化optim功能和保留空间的问题没有直接关系......
编辑:感谢大家的想法.基于下面的无数评论,我们能够将R与Biogeme放在同一个球场,以获得更复杂的模型,对于我们运行的几个更小/更简单的模型,R实际上更快.我认为这个问题的长期解决方案是编写一个单独的最大化函数,它依赖于fortran或C库,但我肯定对其他方法持开放态度.
Jor*_*eys 20
尝试过nlm()函数了吗?不知道它是否更快,但确实提高了速度.还要检查选项.optim使用慢速算法作为默认值.通过使用Quasi-Newton算法(method ="BFGS")而不是默认值,您可以获得> 5倍的加速.如果你不太关心最后的数字,你也可以设置更高的nlm()公差等级来获得额外的速度.
f <- function(x) sum((x-1:length(x))^2)
a <- 1:5
system.time(replicate(500,
optim(a,f)
))
user system elapsed
0.78 0.00 0.79
system.time(replicate(500,
optim(a,f,method="BFGS")
))
user system elapsed
0.11 0.00 0.11
system.time(replicate(500,
nlm(f,a)
))
user system elapsed
0.10 0.00 0.09
system.time(replicate(500,
nlm(f,a,steptol=1e-4,gradtol=1e-4)
))
user system elapsed
0.03 0.00 0.03
Run Code Online (Sandbox Code Playgroud)
我是 R 包optimParallel的作者,这对您的情况可能会有所帮助。该包提供了基于梯度的优化方法的并行版本optim()。该包的主要功能是optimParallel(),其用法和输出与optim(). 使用optimParallel()可以显着减少优化时间,如下图所示(p是参数的数量)。
有关更多信息,请参阅https://cran.r-project.org/package=optimParallel和http://arxiv.org/abs/1804.11058。
| 归档时间: |
|
| 查看次数: |
9490 次 |
| 最近记录: |