[R] Order of methods for optimx

J C Nash profjcnash at gmail.com
Sun Dec 31 18:05:38 CET 2017

The results are very sensitive in some cases to configuration (tolerances, etc.) and problem.

Are you using the "follow-on" option? That will definitely be order dependent.

optimx is currently under review by Ravi Varadhan and I. Updating optimx proved very difficult
because of interactions between different options, so I introduced optimr, with version optimrx
on R-forge to have more solvers. When solvers were "down" on CRAN the codes would sometimes give
trouble, but we think we can check for this now. Also we want to leave optimx present because a
number of people are using it, so that function will be part of the updated package which will
be called optimx, and optimr/rx will be deprecated to reduce the package count.

There is still work to be done, though we think it is now more or less fixed, and I can send
a tarball if desired. We'd welcome feedback. The new structure uses a single function optimr()
that can call any one of nearly 2 dozen solvers, and function opm() will do what optimx does for
multiple methods. opm() simply loops through optimr() for each method. A big change is that
optimr() uses the optim() syntax INCLUDING parscale for all methods. The "follow-on"
polyalgorithm and multiple starts are in separate functions to avoid the interaction that was
giving me maintenance issues with the optimx function (and which could give strange behaviour
with optimx() now, so multiple features at once is likely suspect).

If you have gradients, I recommend using Rvmmin (callable from optimr()) or a method that can
use gradients. If you have bounds, do use a method with bounds capability.

No gradient, then BOBYQA from minqa (also callable from optimx() or optimr()) can often be
very efficient, but is quirky and occasionally gives rubbish in my experience.

Cheers, JN

On 2017-12-31 09:03 AM, Marc Girondot via R-help wrote:
> Dear R-er,
> For a non-linear optimisation, I used optim() with BFGS method but it stopped regularly before to reach a true mimimum.
> It was not a problem with limit of iterations, just a local minimum. I was able sometimes to reach better minimum using
> several rounds of optim().
> Then I moved to optimx() to do the different optim rounds automatically using "Nelder-Mead" and "BFGS" methods
> I find a huge time difference using system.time() based on the order of these both methods:
>> snb # "Nelder-Mead" and "BFGS"
>     user   system  elapsed
> 1021.656    0.200 1021.695
>> sbn # "BFGS" and "Nelder-Mead"
>     user   system  elapsed
> 3140.096    0.384 3139.728
> But optimx() with "Nelder-Mead" and "BFGS" stops in local minimum:
>> o_mu2p1$value
> [1] 2297.557
> whereas "BFGS" and "Nelder-Mead" stops in better model (not sure if it is a global minimum, but it is better):
>> o_mu2p1$value
> [1] 2297.305
> ####################
> My questions are:
> Are my findings common and documented (order of methods giving non consistant results) or are they specific to the model
> I try to fit ?
> If it is known problem, where I can find the best advice about order of methods ?
> ####################
> To reproduce what I said:
> install.packages("http://www.ese.u-psud.fr/epc/conservation/CRAN/HelpersMG.tar.gz", repos=NULL, type="source")
> install.packages("http://www.ese.u-psud.fr/epc/conservation/CRAN/phenology.tar.gz", repos=NULL, type="source")
> library("phenology")
> library("car")
> library("optimx")
> library("numDeriv")
> ECFOCF_2002 <- TableECFOCF(MarineTurtles_2002)
> snb <- system.time(
>   o_mu2p1_nb <- fitCF(par = structure(c(0.244863062899293,
>                                    43.5578630363601,
>                                    4.94764539004454,
>                                    129.606771856887,
>                                    -0.323749593604171,
>                                    1.37326091618759),
>                                  .Names = c("mu1", "size1", "mu2",
>                                             "size2", "p", "OTN")),
>                  method = c("Nelder-Mead", "BFGS"),
>                  data=ECFOCF_2002, hessian = TRUE)
> )
> sbn <- system.time(
>   o_mu2p1_bn <- fitCF(par = structure(c(0.244863062899293,
>                                      43.5578630363601,
>                                      4.94764539004454,
>                                      129.606771856887,
>                                      -0.323749593604171,
>                                      1.37326091618759),
>                                    .Names = c("mu1", "size1", "mu2",
>                                                "size2", "p", "OTN")),
>                    method = c("BFGS", "Nelder-Mead"),
>                    data=ECFOCF_2002, hessian = TRUE)
> )
> snb
> o_mu2p1_nb$value
> sbn
> o_mu2p1_bn$value
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

More information about the R-help mailing list