### Eclipse Workspace Patch 1.0 #P lme4Eigen Index: R/lmer.R =================================================================== --- R/lmer.R (revision 1635) +++ R/lmer.R (working copy) @@ -77,7 +77,7 @@ lmer <- function(formula, data, REML = TRUE, sparseX = FALSE, control = list(), start = NULL, verbose = 0L, subset, weights, na.action, offset, - contrasts = NULL, devFunOnly=FALSE, ...) + contrasts = NULL, devFunOnly=FALSE, optimizer=c("NelderMead","bobyqa"), ...) { if (sparseX) warning("sparseX = TRUE has no effect at present") mf <- mc <- match.call() @@ -136,21 +136,51 @@ ## FIXME: this code is replicated in lmer/glmer/nlmer ... ## it seems good to have it in R rather than C++ code but maybe it should go within Nelder_Mead() ?? - control$iprint <- switch(as.character(min(verbose,3L)), - "0"=0, "1"=20,"2"=10,"3"=1) - - lower <- reTrms$lower - ## FIXME: allow user control of xst, xt ? - xst <- rep.int(0.1, length(lower)) - opt <- Nelder_Mead(devfun, x0=rho$pp$theta, xst=0.2*xst, xt=xst*0.0001, - lower=lower, control=control) - if (opt$ierr < 0L) { - if (opt$ierr > -4L) - stop("convergence failure, code ", opt$ierr, " in NelderMead") - else - warning("failure to converge in", opt$control$maxfun, "evaluations") - } - mkMerMod(environment(devfun), opt, reTrms, fr, mc) + lower <- reTrms$lower + # RJ's changes begin + opt <- switch(match.arg(optimizer), + bobyqa = { + if(!is.numeric(control$rhobeg)) control$rhobeg <- 0.0002 + if(!is.numeric(control$rhoend)) control$rhoend <- 2e-7 + rho$control <- control + # Delete unused options to prevent warning from showing up + control$FtolAbs <- NULL + control$FtolRel <- NULL + bobyqa(rho$pp$theta, devfun, lower, control=control) + }, + NelderMead = { + ## FIXME: this code is replicated in lmer/glmer/nlmer ... + ## it seems good to have it in R rather than C++ code but maybe it should go within Nelder_Mead() ?? + control$iprint <- switch(as.character(min(verbose,3L)), "0"=0, "1"=20,"2"=10,"3"=1) + xst <- rep.int(0.1, length(lower)) + # RJ -- allow user control of xst, xt + ctl <- control + if(!is.numeric(control$xstFactor)) + xstFactor <- 0.2 + else + xstFactor <- control$xstFactor + if(!is.numeric(control$xtFactor)) + xtFactor <- 0.0001 + else + xtFactor <- control$xtFactor + ctl$xstFactor <- NULL + ctl$xtFactor <- NULL + Nelder_Mead(devfun, x0=rho$pp$theta, xst=xstFactor*xst, xt=xst*xtFactor, lower=lower, control=ctl) + }) + + if(optimizer=="NelderMead") { + if (opt$ierr < 0L) { + if (opt$ierr > -4L) + stop("convergence failure, code ", opt$ierr, " in NelderMead") + else + warning("failure to converge in", opt$control$maxfun, "evaluations") + } + } else if (optimizer=="bobyqa") { + if (opt$ierr > 0L) + warning("convergence problem, code ", opt$ierr, " in bobyqa") + } + # RJ's changes end + mkMerMod(environment(devfun), opt, reTrms, fr, mc) }## { lmer } ##' Fit a generalized linear mixed model (GLMM)