lme4
authors and maintainers) are still in the process
of finding the best strategies for testing convergence. Some of the
relevant issues are
lme4
; direct computation
of derivatives based on analytic expressions may eventually be
available for some special classes, but we have not yet
implemented them) they may not be sufficiently accurate for
reliable convergence testing. scale
)
optim
, nlminb
,
…) While this will of course be slow for large fits, we consider
it the gold standard; if all optimizers converge to values that
are practically equivalent, then we would consider the convergence
warnings to be false positives.
lmerControl
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
## 1. center and scale predictors:
ss.CS <- transform(sleepstudy, Days=scale(Days))
fm1.CS <- update(fm1, data=ss.CS)
## 2. check singularity
diag.vals <- getME(fm1,"theta")[getME(fm1,"lower") == 0]
any(diag.vals < 1e-6) # FALSE
## 3. recompute gradient and Hessian with Richardson extrapolation
devfun <- update(fm1, devFunOnly=TRUE)
if (isLMM(fm1)) {
pars <- getME(fm1,"theta")
} else {
## GLMM: requires both random and fixed parameters
pars <- getME(fm1, c("theta","fixef"))
}
if (require("numDeriv")) {
cat("hess:\n"); print(hess <- hessian(devfun, unlist(pars)))
cat("grad:\n"); print(grad <- grad(devfun, unlist(pars)))
cat("scaled gradient:\n")
print(scgrad <- solve(chol(hess), grad))
}
## compare with internal calculations:
fm1@optinfo$derivs
## 4. restart the fit from the original value (or
## a slightly perturbed value):
fm1.restart <- update(fm1, start=pars)
## 5. try all available optimizers
source(system.file("utils", "allFit.R", package="lme4"))
fm1.all <- allFit(fm1)
ss <- summary(fm1.all)
ss$ fixef ## extract fixed effects
ss$ llik ## log-likelihoods
ss$ sdcor ## SDs and correlations
ss$ theta ## Cholesky factors
ss$ which.OK ## which fits worked
Run the code above in your browser using DataLab