69
votes

I'm using lmer() in package lme4 to estimate mixed effects models. This works well, but now I want to run the estimation process for a fixed number of iterations, then resume the process by specifying start values, as calculated by the last estimation process.

According to the help for ?lmer this is possible, by setting the arguments:

  • start - these are the new start values, and according to the help one can extract the value in slot ST from a fitted model and use these, i.e. use x@ST
  • maxiter - supplied as a named argument to control

So, for example, suppose I want to fit a lme using the iris data, one can try this:

library(lme4)

# Fit model with limited number of iterations

frm <- "Sepal.Length ~ Sepal.Width | Species"

x <- lmer(frm, data=iris, 
          verbose=TRUE, control=list(maxIter=1), model=FALSE)

# Capture starting values for next set of iterations
start <- list(ST=x@ST)

# Update model
twoStep <-  lmer(frm, data=iris, 
          verbose=TRUE, control=list(maxIter=100), model=TRUE, 
          start=start)

This works. Take a look at the output, where the first column is the REML, i.e. the random effect maximum likelihood. Notice especially that the REML in model 2 starts where model 1 terminates:

> x <- lmer(frm, data=iris, 
+           verbose=TRUE, control=list(maxIter=1), model=FALSE)
  0:     264.60572: 0.230940 0.0747853  0.00000
  1:     204.22878: 0.518239  1.01025 0.205835
  1:     204.22878: 0.518239  1.01025 0.205835

> # Capture starting values for next set of iterations
> start <- list(ST=x@ST)

> # Update model
> twoStep <-  lmer(frm, data=iris, 
+           verbose=TRUE, control=list(maxIter=100), model=TRUE, 
+           start=start)
  0:     204.22878: 0.518239  1.01025 0.205835
  1:     201.51667: 0.610272  2.00277 0.286049
  2:     201.46706: 0.849203  1.94906 0.358809
  3:     201.44614: 0.932371  1.88581 0.482423
  4:     201.39421:  1.00909  1.71078 0.871824
  5:     201.36543:  1.00643  1.60453  1.01663
  6:     201.31066:  1.00208  1.35520  1.27524
  7:     201.28458:  1.08227  1.22335  1.35147
  8:     201.24330:  1.50333 0.679759  1.31698
  9:     201.11881:  1.95760 0.329767 0.936047

However, when I have a different value of maxIters this no longer works:

x <- lmer(frm, data=iris, 
          verbose=TRUE, control=list(maxIter=3), model=FALSE)
start <- list(ST=x@ST)
twoStep <-  lmer(frm, data=iris, 
                 verbose=TRUE, control=list(maxIter=100), model=TRUE, 
                 start=start)

Notice that the REML value restarts at 264, i.e. the beginning:

> x <- lmer(frm, data=iris, 
+           verbose=TRUE, control=list(maxIter=3), model=FALSE)
  0:     264.60572: 0.230940 0.0747853  0.00000
  1:     204.22878: 0.518238  1.01025 0.205835
  2:     201.94075:  0.00000  1.51757 -1.18259
  3:     201.71473:  0.00000  1.69036 -1.89803
  3:     201.71473:  0.00000  1.69036 -1.89803

> # Capture starting values for next set of iterations
> start <- list(ST=x@ST)

> # Update model
> twoStep <-  lmer(frm, data=iris, 
+           verbose=TRUE, control=list(maxIter=100), model=TRUE, 
+           start=start)
  0:     264.60572: 0.230940 0.0747853  0.00000
  1:     204.22878: 0.518238  1.01025 0.205835
  2:     201.94075:  0.00000  1.51757 -1.18259
  3:     201.71473:  0.00000  1.69036 -1.89803
  4:     201.64641:  0.00000  1.82159 -2.44144
  5:     201.63698:  0.00000  1.88282 -2.69497
  6:     201.63649:  0.00000  1.89924 -2.76298
  7:     201.63649: 4.22291e-08  1.90086 -2.76969
  8:     201.63649: 4.22291e-08  1.90086 -2.76969

Question: How can I reliably restart lmer() with start values obtained from a previously fitted model?


Session information:

packageVersion("lme4")
[1] ‘0.999999.2’
1
This is very likely a bug; the start functionality of lme4 has not been very thoroughly exercised, so I'm sure there are lots of issues like this. How strong is your need to use the stable rather than the development version? I will look into this, but we're hoping to do most of our debugging on the stable version ...Ben Bolker
@BenBolker I can use either dev or test code, since I'm just running some experiments at the moment. I can help, if you let me know where to find the dev branch.Andrie
it's on github: library(devtools); install_github("lme4",user="lme4"). It is easier in this version to extract the deviance function and use it in your own optimization, which you might prefer if you want more control. Alternatively, do try out the start experiment and let me know at github.com/lme4/lme4/issues if you find something not working ...Ben Bolker
bump .. I'm curious to know if you get farther with the dev version ...Ben Bolker
This should be fixed now for lmer (although not for glmer, which is slightly trickier).Ben Bolker

1 Answers

3
votes

This was a confirmed bug in lme4 and as per the comments

I've logged an issue at github.com/lme4/lme4/issues/55 – Andrie Jul 2 '13 at 15:42

This should be fixed now for lmer (although not for glmer, which is slightly trickier). – Ben Bolker Jul 14

That was back when the version was < 0.99999911-6; lme4 on CRAN has had versions > 1.0-4 since 21-Sep-2013.