我正在尝试使用R来估计具有手动规范的多项logit模型。我找到了一些允许您估算MNL模型here或here的软件包。
我发现了一些关于“滚动”你自己的MLE函数here的其他着作。但是,从我的挖掘 - 所有这些函数和包依赖于内部optim
函数。
在我的基准测试中,optim
是瓶颈。使用具有约16000个观测值和7个参数的模拟数据集,R在我的机器上花费大约90秒。 Biogeme中的等效模型需要大约10秒。在Ox中编写自己的代码的同事在同一模型中报告大约4秒钟。
有没有人有编写自己的MLE功能的经验,或者可以指出我的方向超出默认的optim
功能(没有双关语)?
如果有人想要R代码重新创建模型,请告诉我 - 我会提供它。我没有提供它,因为它与优化optim
函数和保留空间的问题没有直接关系......
编辑:感谢大家的想法。基于下面的无数评论,我们能够将R与Biogeme放在同一个球场,以获得更复杂的模型,对于我们运行的几个更小/更简单的模型,R实际上更快。我认为这个问题的长期解决方案是编写一个单独的最大化函数,它依赖于fortran或C库,但我肯定对其他方法持开放态度。
答案 0 :(得分: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
答案 1 :(得分:6)
您是否考虑了CRAN Task View for Optimization上的资料?
答案 2 :(得分:2)
FWIW,我在C-ish中使用OPTIF9完成了这项工作。你很难比这更快。有很多方法可以让事情变得更慢,比如运行像R这样的翻译。
补充:从评论中可以清楚地看出,OPTIF9被用作优化引擎。这意味着很可能大部分时间花在评估R中的目标函数上。虽然C函数可能在下面用于某些操作,但仍然存在解释器开销。有一种快速的方法可以确定R中哪些代码行和函数调用负责大部分时间,也就是使用Escape键暂停它并检查堆栈。如果一个语句花费X%的时间,那么它在X%的时间内处于堆栈中。您可能会发现有些操作不是C,应该是。当您找到并行化R执行的方法时,将保留以此方式获得的任何加速因子。
答案 3 :(得分:2)
我是R包 optimParallel 的作者,这可能对您的情况有所帮助。该软件包提供optim()
基于梯度的优化方法的并行版本。包的主要功能是optimParallel()
,其用法和输出与optim()
相同。使用optimParallel()
可以显着缩短优化时间,如下图所示(p
是参数的数量)。
有关详细信息,请参阅https://cran.r-project.org/package=optimParallel和http://arxiv.org/abs/1804.11058。