我遇到了一些指南,建议我使用 R 的 nlm 进行最大似然估计。但是它们(包括R 的文档)都没有为何时使用或不使用该功能提供很多理论指导。
据我所知,nlm 只是按照牛顿法的方式进行梯度下降。是否有合理使用这种方法的原则?有哪些替代方案?另外,数组的大小是否有限制,等等,可以传递给 nlm 吗?
我遇到了一些指南,建议我使用 R 的 nlm 进行最大似然估计。但是它们(包括R 的文档)都没有为何时使用或不使用该功能提供很多理论指导。
据我所知,nlm 只是按照牛顿法的方式进行梯度下降。是否有合理使用这种方法的原则?有哪些替代方案?另外,数组的大小是否有限制,等等,可以传递给 nlm 吗?
我知道在基础 R 中有许多通用优化例程:optim
、nlminb
和(处理线性不等式约束,并在后台调用nlm
)。以下是您在选择使用哪一个时可能需要考虑的一些事项。constrOptim
optim
optim
可以使用许多不同的算法,包括共轭梯度、牛顿、准牛顿、Nelder-Mead 和模拟退火。最后两个不需要梯度信息,因此如果梯度不可用或计算不可行(但可能更慢并且分别需要更多参数微调),则可能很有用。它还可以选择在解决方案中返回计算出的 Hessian,如果您想要标准错误以及解决方案本身,则需要该选项。
nlminb
使用准牛顿算法,该算法"L-BFGS-B"
与optim
. 根据我的经验,它似乎比它更有可能在无法收敛optim
的边缘情况下返回解决方案更强大,尽管这可能取决于问题。optim
如果您提供显式梯度函数,它具有很好的功能,即在解决方案中对其值进行数值检查。如果这些值与数值差分得到的值不匹配,nlminb
将给出警告;这有助于确保您在指定梯度时没有犯错(对于复杂的可能性很容易做到)。
nlm
仅使用牛顿算法。在需要更少的迭代来达到收敛的意义上,这可能比其他算法更快,但也有其自身的缺点。它对可能性的形状更敏感,所以如果它是强非二次的,它可能会更慢,或者你可能会收敛到错误的解决方案。牛顿算法也使用 Hessian,并且计算在实践中可能足够慢,以至于它抵消了任何理论上的加速。
何时使用和不使用任何特定的最大化方法在很大程度上取决于您拥有的数据类型。nlm
如果似然面不是特别“粗糙”并且在任何地方都是可微的,那么它将工作得很好。nlminb
提供了一种将参数值约束到特定边界框的方法。optim
,这可能是最常用的优化器,提供了一些不同的优化例程;例如,BFGS、L-BFGS-B 和模拟退火(通过 SANN 选项),如果您遇到困难的优化问题,后者可能会很方便。CRAN 上还有许多优化器可用。rgenoud
例如,提供了一种用于优化的遗传算法。DEoptim
使用不同的遗传优化程序。遗传算法收敛速度可能很慢,但即使在可能性中存在不连续性时,通常也能保证收敛(及时)。我不知道DEoptim
,但rgenoud
设置为snow
用于并行处理,这在一定程度上有所帮助。
因此,一个可能有点不令人满意的答案是,nlm
如果它适用于您拥有的数据,您应该使用或任何其他优化器。如果你有一个表现良好的可能性,任何由optim
或提供的例程nlm
都会给你同样的结果。有些可能比其他更快,这可能或可能无关紧要,具体取决于数据集的大小等。至于这些例程可以处理的参数数量,我不知道,尽管可能很多。当然,你拥有的参数越多,你就越有可能遇到收敛问题。