Come posso accelerare il calcolo degli effetti fissi in un GLMM?


9

Sto facendo uno studio di simulazione che richiede stime di bootstrap ottenute da un modello misto lineare generalizzato (in realtà, il prodotto di due stime per effetti fissi, uno da un GLMM e uno da un LMM). Per fare bene lo studio richiederebbero circa 1000 simulazioni con 1000 o 1500 repliche bootstrap ogni volta. Ciò richiede una notevole quantità di tempo sul mio computer (molti giorni).

How can I speed up the computation of these fixed effects?

Per essere più specifici, ho soggetti che vengono misurati ripetutamente in tre modi, dando origine alle variabili X, M e Y, dove X e M sono continui e Y è binario. Abbiamo due equazioni di regressione dove Y è la variabile continua latente sottostante per e gli errori non sono iid. La statistica che vogliamo è . Pertanto, ogni replica bootstrap richiede il montaggio di un LMM e un GLMM. Il mio codice R è (usando lme4)

M=α0+α1X+ϵ1
Y=β0+β1X+β2M+ϵ2
Y
α1β2
    stat=function(dat){
        a=fixef(lmer(M~X+(X|person),data=dat))["X"]
        b=fixef(glmer(Y~X+M+(X+M|person),data=dat,family="binomial"))["M"]
        return(a*b)
    }

Mi rendo conto che ottengo la stessa stima per se la inserisco semplicemente come modello lineare, in modo da risparmiare un po 'di tempo, ma lo stesso trucco non funziona per .α1β2

Devo solo acquistare un computer più veloce? :)


1
@BR qual è il collo di bottiglia qui? Fondamentalmente cosa ci vuole tempo Rprof.
suncoolsu,

1
Un modo è semplicemente ignorare la parte "mista" del GLMM. Semplicemente adatto a un normale GLM, le stime non cambieranno molto, ma probabilmente i loro errori standard cambieranno
probabilitlogico

@probabilityislogic. Oltre alla tua osservazione, penso anche, se la risposta differirebbe molto dipende dalla dimensione del gruppo e dal comportamento individuale nel gruppo. Come dicono Gelman e Hill: i risultati del modello di effetti misti sarebbero tra pool e no pool. (Ovviamente questo è per i modelli gerarchici bayesiani, ma i modelli misti sono un modo classico di fare lo stesso.)
suncoolsu,

@probabilityislogic: Questo funziona per LMM, ma sembra fallire per GLMM (il che significa che ho eseguito modelli con e senza la M in più sugli stessi dati e ho ottenuto risultati significativamente diversi). A meno che, naturalmente, non vi sia un errore nell'implementazione di glmer.
BR

@suncoolsu: il collo di bottiglia è la stima del GLMM, che può richiedere un paio di secondi (specialmente con diversi effetti casuali). Ma fallo 1000 * 1000 volte, e sono 280 ore di calcolo. Il montaggio di un GLM richiede circa 1/100 del tempo.
BR

Risposte:


4

Dovrebbe aiutare a specificare i valori iniziali, anche se è difficile sapere quanto. Durante la simulazione e il bootstrap, dovresti conoscere i valori "veri" o le stime non avviate o entrambi. Prova a usare quelli start =nell'opzione di glmer.

Si potrebbe anche considerare di esaminare se le tolleranze per dichiarare la convergenza siano più rigide del necessario. Non sono chiaro come modificarli dalla lme4documentazione però.


4

Anche altre due possibilità considerano, prima di acquistare un nuovo computer.

  1. Elaborazione parallela: il bootstrap è facile da eseguire in parallelo. Se il tuo computer è abbastanza nuovo, probabilmente hai quattro core. Dai un'occhiata alla libreria multicore in R.
  2. Il cloud computing è anche una possibilità e ragionevolmente economico. Ho colleghi che hanno utilizzato il cloud Amazon per eseguire script R. Hanno scoperto che era abbastanza conveniente.

1
Grazie per la risposta. In qualche modo, ho trascurato il fatto che ho due core (il mio computer non è molto nuovo). Avrei dovuto guardare il multicore molto tempo fa.
BR

2

Potrebbe essere un computer più veloce. Ma ecco un trucco che potrebbe funzionare.

Genera una simultanea di , ma solo in base a , quindi esegui OLS o LMM sui valori simulati .YYY

Supponendo che la funzione di collegamento sia . questo dice come si ottiene dalla probabilità di al valore ed è molto probabilmente la funzione logistica .g(.)Y=1Yg(z)=log(z1z)

Quindi, se si assume una distribuzione di campionamento di bernouli per , e quindi si utilizzano i jeffreys precedenti per la probabilità, si ottiene un beta posteriore per . Simulare da questo dovrebbe essere come l'illuminazione, e se non lo è, allora hai bisogno di un computer più veloce. Inoltre, i campioni sono indipendenti, quindi non è necessario controllare alcun tipo di diagnostica di "convergenza" come in MCMC e probabilmente non è necessario un numero così elevato di campioni: 100 potrebbero funzionare correttamente per il proprio caso. Se hai binomiali , sostituisci semplicemente nella parte posteriore sopra con , il numero di prove del binomio per ogni .YYBernoulli(p)pBeta(Yobs+12,1Yobs+12)Ys1niYi

Quindi hai una serie di valori simulati . Quindi applicare la funzione di collegamento a ciascuno di questi valori, per ottenere . Adatta un LMM a , che probabilmente è più veloce del programma GLMM. In pratica puoi ignorare i valori binari originali (ma non eliminarli!) E lavorare con la "matrice di simulazione" ( , dove è la dimensione del campione e è il numero di simulazioni).psimYsim=g(psim)YsimN×SNS

Quindi nel tuo programma, sostituirei la funzione con la funzione e con una singola simultanea, quindi creeresti una sorta di loop che applica la funzione a ciascuna simulazione, e quindi accetta il media come la stima di . Qualcosa come gmler()lmer()Ylmer()b

a=
b=0
do s=1,,S
best=lmer(Ys)
endreturn(ab)
b=b+1s(bestb)
end
return(ab)

Fammi sapere se devo spiegare qualcosa di più chiaro


Grazie per la risposta, mi ci vorrà un po 'per digerirlo (e ho già piani per il mio sabato sera). È abbastanza diverso che non mi sia chiaro se fornisce la stessa risposta dell'approccio GLMM, ma devo pensarci di più.
BR
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.