我正在尝试使用R来估算具有手动规范的多项式logit模型。我发现了一些软件包,可以让您估算MNL模型herehere

我发现了其他一些有关“滚动”自己的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

10-06 04:23