我有一些使用nlm()进行非线性优化的遗留代码。我打算将代码更新为nlminb(),以便可以进行约束优化。我知道这两个方法可能不相同或不等价,但是考虑到提供给nlm()的以下参数,为类似的nlminb调用提供的调用和参数是什么?
##' @param print.level Arguments for nlm.
##' @param typsize Arguments for nlm.
##' @param ndigit Arguments for nlm.
##' @param gradtol Arguments for nlm.
##' @param stepmax Arguments for nlm.
##' @param steptol Arguments for nlm.
##' @param iterlim Arguments for nlm.
##' @param fscale Arguments for nlm.
# Take the legacy nlm() call and ...
z0 <- nlm(like,p=p,hessian=TRUE,print.level=print.level,typsize=typsize,
ndigit=ndigit,gradtol=gradtol,stepmax=stepmax,steptol=steptol,
iterlim=iterlim,fscale=fscale)
# turn into nlminb call:
z0 <- nlminb(nlminb args with different names but taking same @param from parent function)发布于 2017-10-26 01:15:20
有趣的问题!我最终会建议使用optimx ( Rdocs和JSS site),但现在让我们将nlm映射到nlminb上。
我会补充一下你写的内容:
##' @param print.level Arguments for nlm.
##' @param typsize Arguments for nlm.
##' @param ndigit Arguments for nlm.
##' @param gradtol Arguments for nlm.
##' @param stepmax Arguments for nlm.
##' @param steptol Arguments for nlm.
##' @param iterlim Arguments for nlm.
##' @param fscale Arguments for nlm.
# Take the legacy nlm() call and ...
z0 <- nlm(f=like,
p=p,
hessian=TRUE,
print.level=print.level,
typsize=typsize,
ndigit=ndigit,
gradtol=gradtol,
stepmax=stepmax,
steptol=steptol,
iterlim=iterlim,
fscale=fscale
)在nlminb()中类似的调用将如下所示。我们注意到的第一件事是,nlminb()使用了一个带有control parameters的control参数,以及参数objective和start,而不是f和p (分别以不同于nlm的顺序,所以一定要显式地输入参数):
# turn into nlminb call:
z0 <- nlminb(objective=like,
start=p,
hessian=TRUE,
control = list(trace=print.level, #for 0, same behavior
#typsize=typsize,
#ndigit=ndigit,
#gradtol=gradtol,
step.max=stepmax,
#steptol=steptol,
iter.max=iterlim,
#fscale=fscale
)
)我建议在父函数中添加更多参数,并使用optimx
##' @param print.level Arguments for nlm.
##' @param typsize Arguments for nlm.
##' @param ndigit Arguments for nlm.
##' @param gradtol Arguments for nlm.
##' @param stepmax Arguments for nlm, nlminb
##' @param steptol Arguments for nlm.
##' @param iterlim Arguments for optimx, nlm, nlminb
##' @param fscale Arguments for nlm.
##' @param trace Arguments for nlminb
##' @param method Argument for optimx
z0 <- optimx(fn=like,
par=p,
hessian=TRUE, ## not `hess`
method=c("nlminb"),
itnmax=iterlim,
control = list(
# for nlm:
print.level=print.level,
typsize=typsize,
ndigit=ndigit,
gradtol=gradtol,
stepmax=stepmax,
steptol=steptol,
#iterlim=iterlim, # preferred as itnmax above
fscale=fscale,
# for nlminb:
trace=trace,
step.max=stepmax
# ... any other nlminb args
)
)要从optimx中提取hessian,请这样做:
## hessian extraction (1st row or by name):
attr(fit, "details")[1,]$nhatend
attr(fit, "details")["nlminb",]$nhatend下面的nlminb不是问题所必需的,只需将感兴趣的 nlm 参数放在一个位置,然后得出结论,即a不存在完美的一对一匹配
以下是nlm() (摘自Rdocs)的print.level、typsize、ndigit、gradtol、stepmax、steptol、iterlim和fscale的nlm()参数定义:
print.level此参数确定最小化过程中执行的打印级别。默认值0表示不进行打印,值1表示打印初始和最终细节,值2表示完整的跟踪信息是minimum.ndigit处每个参数大小的估计值,函数f.gradtol中的有效位数是一个正标量,在该公差处缩放的渐变被认为足够接近于零,从而终止算法。缩放梯度是每个方向pi上f的相对变化除以pi.stepmax中的相对变化的度量,正标量给出了最大允许的缩放步长。stepmax用于防止可能导致优化函数溢出的步骤,防止算法离开参数空间中的感兴趣区域,或检测算法中的发散。可以选择足够小以防止前两次发生的步长,但应该大于任何预期的合理step.steptol提供最小允许相对步长的正标量length.iterlim一个正整数,指定在程序terminated.fscale最小f的大小之前执行的最大迭代次数。现在我们尝试在nlminb() (从Rdocs中提取)中查找匹配项。我们注意到的第一件事是,nlminb()对control parameters使用了control参数
# turn into nlminb call:
z0 <- nlminb(objective=like,
start=p,
hessian=TRUE,
control = list(trace=print.level, #for 0, same behavior
#typsize=typsize,
#ndigit=ndigit,
#gradtol=gradtol,
step.max=stepmax,
#steptol=steptol,
iter.max=iterlim,
#fscale=fscale
)
)与nlm的print.level最接近的可能是trace。对于值为0的值,两者做的是相同的事情。但是,对于非零值,它们的操作是不同的。
trace目标函数值和参数值在每次trace迭代时打印。默认值为0,表示不打印跟踪信息。结论:更多地查看文档,看起来找到一个精确的匹配可能是具有挑战性的。这就是为什么我建议扩展父参数和使用优化的原因。
https://stackoverflow.com/questions/46938381
复制相似问题