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 slotST
da un montato il modello e utilizzare questi, vale a dire utilizzare[email protected]
maxiter
- fornito come argomento di nome dicontrol
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’
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 ... –
@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
è 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 ... –