2013-06-26 24 views
67

Sto utilizzando lmer() nel pacchetto lme4 per stimare i modelli di effetti misti. Funziona bene, ma ora voglio eseguire il processo di stima per un numero fisso di iterazioni, quindi riprendere il processo specificando i valori iniziali, come calcolato dall'ultimo processo di stima.Riavviare la stima del modello a effetti misti con valori stimati in precedenza

Secondo l'aiuto per ?lmer questo è possibile, impostando gli argomenti:

  • start - questi sono i nuovi valori iniziali, e secondo l'aiuto si può estrarre il valore nello slot ST da un montato il modello e utilizzare questi, vale a dire utilizzare [email protected]
  • maxiter - fornito come argomento di nome di control

Così, per esempio, supponiamo che io voglio montare un lme utilizzando i dati iris, si può provare questo:

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([email protected]) 

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

Questo funziona. Dai un'occhiata all'output, dove la prima colonna è il REML, ovvero la massima probabilità dell'effetto casuale. Si noti in particolare che il REML nel modello 2 inizia dove il modello 1 termina:

> 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([email protected]) 

> # 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 

Tuttavia, quando ho un valore diverso di maxIters questo non funziona più:

x <- lmer(frm, data=iris, 
      verbose=TRUE, control=list(maxIter=3), model=FALSE) 
start <- list([email protected]) 
twoStep <- lmer(frm, data=iris, 
       verbose=TRUE, control=list(maxIter=100), model=TRUE, 
       start=start) 

notare che il riavvio del valore REML a 264, cioè l'inizio:

> 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([email protected]) 

> # 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 

Domanda: Come posso riavviare in modo affidabile lmer() con i valori iniziali ottenuti da un modello precedentemente montato?


informazioni di sessione:

packageVersion("lme4") 
[1] ‘0.999999.2’ 
+1

Questo è molto probabilmente un bug; la funzione 'start' di' lme4' non è stata esercitata in modo molto approfondito, quindi sono sicuro che ci sono molti problemi come questo. Quanto è forte il tuo bisogno di usare la versione stabile piuttosto che quella di sviluppo? Approfondirò questo, ma speriamo di fare la maggior parte del nostro debugging sulla versione stabile ... –

+0

@BenBolker Posso usare sia il codice di sviluppo che il codice di test, dato che sto facendo alcuni esperimenti al momento. Posso aiutarti, se mi fai sapere dove trovare il ramo dev. – Andrie

+0

è su github: 'library (devtools); install_github ("lme4", user = "lme4") '. In questa versione è più semplice estrarre la funzione devianza e usarla nella tua ottimizzazione, che potresti preferire se vuoi un maggiore controllo. In alternativa, prova l'esperimento 'start' e fammi sapere a https://github.com/lme4/lme4/issues se trovi qualcosa che non funziona ... –

risposta

3

Questo era un bug confermato lme4 e, come per i commenti

ho registrato un problema a github.com/lme4/lme4/issues/55 - Andrie 2 luglio 13 alle 15:42

Questo dovrebbe essere risolto ora per lmer (anche se non per glmer, che è leggermente tr ickier). - Ben Bolker Lug 14

Questo era di nuovo quando la versione era < 0.99999911-6; lme4 on CRAN ha avuto versioni> 1.0-4 dal 21-set-2013.