Learn R Programming

lme4 (version 1.1-21)

nloptwrap: Wrappers for additional optimizers

Description

Wrappers to allow use of alternative optimizers, from NLopt library or elsewhere, for nonlinear optimization stage

Usage

nloptwrap(par, fn, lower, upper, control=list(),...)
nlminbwrap(par, fn, lower, upper, control=list(),...)

Arguments

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

Value

par

estimated parameters

fval

objective function value at minimum

feval

number of function evaluations

conv

convergence code (0 if no error)

message

convergence message

Details

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).

Examples

Run this code
# NOT RUN {
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)))
}
# }

Run the code above in your browser using DataLab