trovo l'altro, la risposta più vecchio qui insoddisfacente. Distinguo tra casi in cui, statisticamente, l'età non ha alcun impatto e al contrario incontriamo un errore computazionale. Personalmente, ho commesso errori di carriera confondendo questi due casi. R ha segnalato quest'ultimo e mi piacerebbe immergermi nel perché è così.
Il modello che OP ha specificato è un modello di crescita, con pendenze e intercettazioni casuali. Una grande intercettazione è inclusa ma non una pendenza grand age. Un vincolo sgradevole che viene imposto adattando una pendenza casuale senza l'aggiunta del suo termine "grande" è che si sta costringendo la pendenza casuale ad avere la media 0, che è molto difficile da ottimizzare. I modelli marginali indicano che l'età non ha un valore diverso statisticamente significativo da 0 nel modello. Inoltre, l'aggiunta dell'età come effetto fisso non risolve il problema.
> lme(conc~ age, random=~age|Lot, data=IGF)
Error in lme.formula(conc ~ age, random = ~age | Lot, data = IGF) :
nlminb problem, convergence error code = 1
message = iteration limit reached without convergence (10)
Qui l'errore è ovvio. Potrebbe essere allettante impostare il numero di iterazioni. lmeControl
ha molti stimatori iterativi. Ma anche questo non funziona:
> fit <- lme(conc~ 1, random=~age|Lot, data=IGF,
control = lmeControl(maxIter = 1e8, msMaxIter = 1e8))
Error in lme.formula(conc ~ 1, random = ~age | Lot,
data = IGF, control = lmeControl(maxIter = 1e+08, :
nlminb problem, convergence error code = 1
message = singular convergence (7)
Quindi non è una cosa di precisione, l'ottimizzatore sta finendo i limiti.
Ci devono essere differenze chiave tra i due modelli che hai proposto di montare e un modo per diagnosticare l'errore che hai trovato. Un approccio semplice è specificare una misura "verbose" per il modello problematico:
> lme(conc~ 1, random=~age|Lot, data=IGF, control = lmeControl(msVerbose = TRUE))
0: 602.96050: 2.63471 4.78706 141.598
1: 602.85855: 3.09182 4.81754 141.597
2: 602.85312: 3.12199 4.97587 141.598
3: 602.83803: 3.23502 4.93514 141.598
(truncated)
48: 602.76219: 6.22172 4.81029 4211.89
49: 602.76217: 6.26814 4.81000 4425.23
50: 602.76216: 6.31630 4.80997 4638.57
50: 602.76216: 6.31630 4.80997 4638.57
Il primo termine è la REML (credo). I termini dal secondo al quarto sono i parametri di un oggetto chiamato lmeSt
della classe lmeStructInt
, lmeStruct
e modelStruct
. Se usi il debugger di Rstudio per ispezionare gli attributi di questo oggetto (il lynchpin del problema), vedrai che è il componente degli effetti casuali che esplode qui.coef(lmeSt)
dopo 50 iterazioni produce reStruct.Lot1 reStruct.Lot2 reStruct.Lot3 6.316295 4.809975 4638.570586
come visto sopra e produce
> coef(lmeSt, unconstrained = FALSE)
reStruct.Lot.var((Intercept)) reStruct.Lot.cov(age,(Intercept))
306382.7 2567534.6
reStruct.Lot.var(age)
21531399.4
che è lo stesso del
Browse[1]> lmeSt$reStruct$Lot
Positive definite matrix structure of class pdLogChol representing
(Intercept) age
(Intercept) 306382.7 2567535
age 2567534.6 21531399
Quindi è chiaro che la covarianza degli effetti casuali, è qualcosa che è esplode qui per questo particolare ottimizzatore. Le routine PORT in nlminb
sono state criticate per i loro errori non informativi. Il testo di David Gay (Bell Labs) è qui http://ms.mcmaster.ca/~bolker/misc/port.pdf La documentazione PORT suggerisce che il nostro errore 7 di utilizzare un miliardo di iter max "x potrebbe avere troppi componenti liberi. Piuttosto che correggere l'algoritmo, è necessario chiedere se ci sono risultati approssimativi che dovrebbero generare risultati simili. È, per esempio, facile da montare un oggetto lmList
a venire con l'intercetta casuale e varianza pendenza casuale:
> fit <- lmList(conc ~ age | Lot, data=IGF)
> cov(coef(fit))
(Intercept) age
(Intercept) 0.13763699 -0.018609973
age -0.01860997 0.003435819
sebbene idealmente questi sarebbero ponderati dai rispettivi pesi di precisione:
Per utilizzare la nlme
pacchetto Prendo atto che l'ottimizzazione non vincolata usando BFGS non produce un errore del genere e dà risultati simili:
> lme(conc ~ 1, data=IGF, random=~age|Lot, control = lmeControl(opt = 'optim'))
Linear mixed-effects model fit by REML
Data: IGF
Log-restricted-likelihood: -292.9675
Fixed: conc ~ 1
(Intercept)
5.333577
Random effects:
Formula: ~age | Lot
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 0.9976 (Intr)
age 0.005647296 -0.698
Residual 0.820819785
Number of Observations: 237
Number of Groups: 10
una dichiarazione sintattica alternativa di un tale modello può essere fatto con t ha molto più facile pacchetto lme4
:
library(lme4)
lmer(conc ~ 1 + (age | Lot), data=IGF)
che produce:
> lmer(conc ~ 1 + (age | Lot), data=IGF)
Linear mixed model fit by REML ['lmerMod']
Formula: conc ~ 1 + (age | Lot)
Data: IGF
REML criterion at convergence: 585.7987
Random effects:
Groups Name Std.Dev. Corr
Lot (Intercept) 0.056254
age 0.006687 -1.00
Residual 0.820609
Number of obs: 237, groups: Lot, 10
Fixed Effects:
(Intercept)
5.331
Un attributo di lmer
e la sua ottimizzatore è che le correlazioni effetti casuali che sono molto vicino a 1, 0, -1 o vengono semplicemente inseriti a quei valori poiché semplifica notevolmente l'ottimizzazione (e l'efficienza statistica della stima).
Prendendo insieme, questo non suggerisce che l'età non ha un effetto, come è stato detto in precedenza, e questo argomento può essere supportato dai risultati numerici.
Ho dato una rapida occhiata a questo e niente mi salta addosso. Potresti avere più fortuna nella mailing list 'r-sig-mixed-models', che ha una maggiore concentrazione di persone che hanno familiarità con questo pacchetto ... –
Hai provato ad aumentare i limiti di iterazione nel primo esempio? Vedi '? LmeControl'. –
Vedere la risposta e i commenti di seguito. Il tuo primo modello non ha età come effetto fisso, né i vincoli di effetti casuali che ha il secondo modello. –