Restart mixed effect model estimation with previously estimated values
Asked Answered
M

1

70

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’
Mawson answered 26/6, 2013 at 13:18 Comment(6)
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 ...Kagu
@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.Mawson
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 ...Kagu
@BenBolker I've installed the dev version, but no luck yet with restarting - I just don't seem to be able to construct the appropriate value for theta from the model object. I'll try again tomorrow.Mawson
I've logged an issue at github.com/lme4/lme4/issues/55Mawson
This should be fixed now for lmer (although not for glmer, which is slightly trickier).Kagu
G
3

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.

Gittle answered 30/4, 2014 at 13:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.