我正在尝试使用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库的单独的最大化函数,但是当然可以接受其他方法。
最佳答案
已经尝试过nlm()函数了吗?不知道它是否快得多,但是它确实提高了速度。还要检查选项。 optim使用慢速算法作为默认算法。使用拟牛顿算法(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