nloptwrap {lme4} | R Documentation |
Wrappers to allow use of alternative optimizers,
from NLopt
library or elsewhere, for
nonlinear optimization stage
nloptwrap(par, fn, lower, upper, control=list(),...) nlminbwrap(par, fn, lower, upper, control=list(),...)
par |
starting parameter vector |
fn |
objective function |
lower |
vector of lower bounds |
upper |
vector of upper bounds |
control |
list of control parameters |
... |
additional arguments to be passed to objective function |
Using alternative optimizers is an important trouble-shooting
tool for mixed models. These wrappers provide convenient access to
the optimizers provided by Steven Johnson's NLopt
library
(via the nloptr
R package), and to the nlminb
optimizer from base R. (nlminb
is also available via the
optimx
package; this wrapper provides access to nlminb
without the need to install/link the package, and without the additional
post-fitting checks that are implemented by optimx
(see examples
below).
One important difference between the nloptr
-provided
implementation of BOBYQA and the minqa
-provided version accessible
via optimizer="bobyqa"
is that it provides simpler access to
optimization tolerances. minqa::bobyqa
provides only the rhoend
parameter ("[t]he smallest value of the trust region radius that is
allowed"), while nloptr
provides
a more standard set of tolerances for relative
or absolute change in the objective function
or the parameter values (ftol_rel
, ftol_abs
,
xtol_rel
, xtol_abs
).
par |
estimated parameters |
fval |
objective function value at minimum |
feval |
number of function evaluations |
conv |
convergence code (0 if no error) |
message |
convergence message |
Gabor Grothendieck (nlminbwrap
)
environment(nloptwrap)$defaultControl library(lme4) ## BOBYQA (default): note "nloptwrap" is now the default optimizer ## for lmer fm1 <- lmer(Reaction~Days+(Days|Subject), sleepstudy, control=lmerControl(optimizer="nloptwrap")) ## tighten tolerances fm1B <- update(fm1,control=lmerControl(optimizer="nloptwrap", optCtrl=list(xtol_abs=1e-8,ftol_abs=1e-8))) ## run for longer (no effect in this case) fm1C <- update(fm1,control=lmerControl(optimizer="nloptwrap", optCtrl=list(maxeval=10000))) logLik(fm1B)-logLik(fm1) ## small difference in log likelihood logLik(fm1C)-logLik(fm1) ## no difference in LL ## Nelder-Mead fm1_nloptr_NM <- update(fm1,control=lmerControl(optimizer="nloptwrap", optCtrl=list(algorithm="NLOPT_LN_NELDERMEAD"))) ## other nlOpt algorithm options include NLOPT_LN_COBYLA, NLOPT_LN_SBPLX fm1_nlminb <- update(fm1,control=lmerControl(optimizer="nlminbwrap")) if (require(optimx)) { fm1_nlminb2 <- update(fm1,control=lmerControl(optimizer="optimx", optCtrl=list(method="nlminb",kkt=FALSE))) }