Regressione non lineare di effetti misti in R


14

Sorprendentemente, non sono stato in grado di trovare una risposta alla seguente domanda utilizzando Google:

Ho alcuni dati biologici di diversi individui che mostrano un comportamento di crescita approssimativamente sigmoideo nel tempo. Pertanto, desidero modellarlo utilizzando una crescita logistica standard

P(t) = k*p0*exp(r*t) / (k+p0*(exp(r*t)-1))

con p0 come valore iniziale a t = 0, k come limite asintotico a t-> infinito e r come velocità di crescita. Per quanto posso vedere, posso facilmente modellarlo usando nls (mancanza di comprensione da parte mia: perché non posso modellare qualcosa di simile usando la regressione logit standard ridimensionando tempo e dati? EDIT: Grazie Nick, a quanto pare le persone lo fanno ad es. Per proporzioni, ma raramente http://www.stata-journal.com/article.html?article=st0147 . La domanda successiva su questa tangente sarebbe se il modello è in grado di gestire valori anomali> 1).

Ora desidero consentire alcuni effetti fissi (principalmente categorici) e casuali (un ID individuale e possibilmente anche un ID di studio) sui tre parametri k, p0 e r. Nlme è il modo migliore per farlo? Il modello SSlogis sembra ragionevole per quello che sto cercando di fare, è corretto? Uno dei seguenti è un modello ragionevole per cominciare? Non riesco a ottenere i valori iniziali giusti e update () sembra funzionare solo per effetti casuali, non fissi - qualche suggerimento?

nlme(y ~ k*p0*exp(r*t) / (k+p0*(exp(r*t)-1)), ## not working at all (bad numerical properties?)
            data = data,
            fixed = k + p0 + r ~ var1 + var2,
            random = k + p0 + r ~ 1|UID,
            start = c(p0=1, k=100, r=1))

nlme(y ~ SSlogis(t, Asym, xmid, scal), ## not working, as start= is inappropriate
            data = data,
            fixed = Asym + xmid + scal ~ var1 + var2, ## works fine with ~ 1
            random = Asym + xmid + scal ~ 1|UID,
            start = getInitial(y ~ SSlogis(Dauer, Asym, xmid, scal), data = data))

Dato che sono nuovo ai modelli misti non lineari in particolare e ai modelli non lineari in generale, apprezzerei alcuni consigli di lettura o collegamenti a tutorial / FAQ con domande per principianti.


2
Se consideri k come noto, potresti ridimensionare le tue popolazioni di P / k. Se k è qualcosa da stimare, questo da solo significa che il tuo problema non è la regressione logit standard.
Nick Cox,

1
Grazie Nick. Sì, alla fine credo che k debba essere stimato e incluso nella regressione. Il mio interesse nell'usare la regressione del logit era puramente accademico. Ho pensato che questo potrebbe essere un bel modello con cui iniziare prima di passare alla modellazione non lineare, ma non sono stato in grado di trovare alcun esempio per la regressione del logit per i dati non binari utilizzando Google. Mi chiedevo se ci fosse qualche motivo (ad esempio ipotesi distributive sugli errori) che rende una cattiva idea usare ad esempio glmer con un collegamento logit con dati continui.
Rob Hall,

3
La modellazione del logit per risposte che sono proporzioni continue è in circolazione da qualche tempo, ma a quanto pare non è ben noto. Vedi ad esempio Baum in stata-journal.com/sjpdf.html?articlenum=st0147 Tuttavia non è la tua situazione. Non posso commentare le implementazioni di R.
Nick Cox,

Grazie Nick per questo link interessante - che mi chiarisce alcune cose. Purtroppo, non riesco ancora a votare la tua risposta. (Nel caso in cui le persone abbiano difficoltà ad accedere al collegamento diretto, per me ha funzionato quanto segue: stata-journal.com/article.html?article=st0147 )
Rob Hall

1
La crescita logistica implica una curva ascendente monotona. Se i dati non corrispondono, si otterrà uno scarso adattamento o il software non verrà riprodotto, a seconda di ciò che si sta facendo.
Nick Cox,

Risposte:


12

Volevo condividere alcune delle cose che ho imparato da quando ho posto questa domanda. nlme sembra un modo ragionevole per modellare effetti misti non lineari in R. Inizia con un semplice modello base:

library(nlme)
data <- groupedData(y ~ t | UID, data=data) ## not strictly necessary
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)
baseModel<- nlme(y ~ SSlogis(t, Asym, xmid, scal),
    data = data,
    fixed = list(Asym ~ 1, xmid ~ 1, scal ~ 1),
    random = Asym + xmid + scal ~ 1|UID,
    start = initVals
)

Quindi utilizzare l'aggiornamento per aumentare la complessità del modello. Il parametro start è leggermente complicato con cui lavorare, potrebbe essere necessario armeggiare per capire l'ordine. Nota come il nuovo effetto fisso per var1 su Asym segue l'effetto fisso normale per Asym.

 nestedModel <- update(baseModel, fixed=list(Asym ~ var1, xmid ~ 1, scal ~ 1), start = c(fixef(baseModel)[1], 0, fixef(baseModel)[2], fixef(baseModel)[3]))

lme4 sembrava più robusto rispetto agli outlier nel mio set di dati e sembrava offrire una convergenza più affidabile per i modelli più complessi. Tuttavia, sembra che il lato negativo sia che le funzioni di probabilità rilevanti devono essere specificate manualmente. Di seguito è riportato il modello di crescita logistica con un effetto fisso di var1 (binario) su Asym. È possibile aggiungere effetti fissi su xmid e ridimensionare in modo simile. Nota lo strano modo di specificare il modello usando una doppia formula come risultato ~ effetti fissi ~ effetti casuali.

library(lme4) ## careful loading nlme and lme4 concurrently
customLogitModel <- function(t, Asym, AsymVar1, xmid, scal) {
    (Asym+AsymVar1*var1)/(1+exp((xmid-t)/scal))
}

customLogitModelGradient <- deriv(
    body(customLogitModel)[[2]], 
    namevec = c("Asym", "AsymVar1", "xmid", "scal"), 
    function.arg=customLogitModel
)

## find starting parameters
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)

# Fit the model
model <- nlmer(
    y ~ customLogitModelGradient(t=t, Asym, AsymVar1, xmid, scal, var1=var) ~ 
    # Random effects with a second ~
    (Asym | UID) + (xmid | UID) + (scal | UID), 
    data = data, 
    start = c(Asym=initVals[1], AsymVar1=0, xmid=initVals[2], scal=initVals[3])
)

1
Grazie Rob per il tuo post, in realtà è esattamente quello che sto cercando di fare con i miei dati. Non capisco cos'è var1 nel nestedModel su Asym e come lo hai calcolato?

Questo è solo un esempio di come includere l'effetto di alcune variabili su Asym: "Quello che segue è il modello di crescita logistica con un effetto fisso di var1 (binario) su Asym". Ad esempio, hai la variabile "Trattato" che ha due valori 0 e 1, quindi sostituisci "Trattato" per "var1".
PA6OTA,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.