Perché SAS PROC GLIMMIX mi offre pendenze casuali MOLTO diverse rispetto a glmer (lme4) per un glmm binomiale


12

Ho una conoscenza più approfondita di R e ho cercato di stimare pendenze casuali (coefficienti di selezione) per circa 35 individui su 5 anni per quattro variabili di habitat. La variabile di risposta è se un luogo è stato "usato" (1) o "disponibile" (0) habitat ("usa" sotto).

Sto usando un computer Windows a 64 bit.

In R versione 3.1.0, utilizzo i dati e l'espressione di seguito. PS, TH, RS e HW sono effetti fissi (standardizzati, misurati a distanza dai tipi di habitat). lme4 V 1.1-7.

str(dat)
'data.frame':   359756 obs. of  7 variables:
 $ use     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Year    : Factor w/ 5 levels "1","2","3","4",..: 4 4 4 4 4 4 4 4 3 4 ...
 $ ID      : num  306 306 306 306 306 306 306 306 162 306 ...
 $ PS: num  -0.32 -0.317 -0.317 -0.318 -0.317 ...
 $ TH: num  -0.211 -0.211 -0.211 -0.213 -0.22 ...
 $ RS: num  -0.337 -0.337 -0.337 -0.337 -0.337 ...
 $ HW: num  -0.0258 -0.19 -0.19 -0.19 -0.4561 ...

glmer(use ~  PS + TH + RS + HW +
     (1 + PS + TH + RS + HW |ID/Year),
     family = binomial, data = dat, control=glmerControl(optimizer="bobyqa"))

glmer mi fornisce stime dei parametri per gli effetti fissi che hanno senso per me, e anche le pendenze casuali (che interpreto come coefficienti di selezione per ciascun tipo di habitat) hanno senso quando indagino i dati qualitativamente. La probabilità logaritmica per il modello è -3050,8.

Tuttavia, la maggior parte della ricerca in ecologia animale non utilizza R perché con i dati sulla posizione degli animali, l'autocorrelazione spaziale può rendere gli errori standard inclini all'errore di tipo I. Mentre R utilizza errori standard basati sul modello, sono preferiti gli errori empirici (anche Huber-white o sandwich).

Mentre R attualmente non offre questa opzione (per quanto ne so - PER FAVORE, correggimi se sbaglio), SAS lo fa - anche se non ho accesso a SAS, un collega ha accettato di farmi prestare il suo computer per determinare se gli errori standard cambia in modo significativo quando viene utilizzato il metodo empirico.

In primo luogo, desideriamo garantire che quando si utilizzano errori standard basati sul modello, SAS produca stime simili a R, per essere certi che il modello sia specificato allo stesso modo in entrambi i programmi. Non mi importa se sono esattamente uguali, solo simili. Ho provato (SAS V 9.2):

proc glimmix data=dat method=laplace;
   class year id;
   model use =  PS TH RS HW / dist=bin solution ddfm=betwithin;
   random intercept PS TH RS HW / subject = year(id) solution type=UN;
run;title;

Ho anche provato varie altre forme, come l'aggiunta di linee

random intercept / subject = year(id) solution type=UN;
random intercept PS TH RS HW / subject = id solution type=UN;

Ho provato senza specificare il

solution type = UN,

o commentando

ddfm=betwithin;

Indipendentemente da come specifichiamo il modello (e abbiamo provato in molti modi), non riesco a ottenere le pendenze casuali in SAS per assomigliare in remoto a quell'output da R - anche se gli effetti fissi sono abbastanza simili. E quando intendo diverso, intendo che nemmeno i segni sono uguali. La probabilità di log di -2 in SAS era 71344,94.

Non riesco a caricare il mio set di dati completo; così ho creato un set di dati giocattolo con solo i record di tre persone. SAS mi dà l'output in pochi minuti; in R ci vuole più di un'ora. Strano. Con questo set di dati giocattolo ora sto ottenendo stime diverse per gli effetti fissi.

La mia domanda: qualcuno può fare luce sul perché le stime delle pendenze casuali potrebbero essere così diverse tra R e SAS? C'è qualcosa che posso fare in R, o SAS, per modificare il mio codice in modo che le chiamate producano risultati simili? Preferirei cambiare il codice in SAS, dal momento che "credo" le mie stime R più.

Sono davvero preoccupato per queste differenze e voglio arrivare al fondo di questo problema!

Il mio output da un set di dati giocattolo che utilizza solo tre dei 35 individui nel set di dati completo per R e SAS sono inclusi come jpeg.

Uscita R. Uscita SAS 1 Uscita SAS 2 Uscita SAS 3


MODIFICA E AGGIORNAMENTO:

Come ha aiutato @JakeWestfall a scoprire, le piste in SAS non includono gli effetti fissi. Quando aggiungo gli effetti fissi, ecco il risultato: confrontare le pendenze R con le pendenze SAS per un effetto fisso, "PS", tra i programmi: (coefficiente di selezione = pendenza casuale). Si noti l'aumento della variazione in SAS.

R vs SAS per PS


Noto che IDnon è un fattore in R; controlla e vedi se questo cambia qualcosa.
Aaron ha lasciato Stack Overflow il

Vedo che stai adattando entrambi usando Laplace Approximation per la verosimiglianza. Quali sono i loro rispettivi punteggi di verosimiglianza?
usεr11852,

1
Hai verificato che stai modellando la variabile dipendente nella stessa direzione?
Peter Flom - Ripristina Monica

1
A proposito, quello che Peter sta ottenendo è che, per impostazione predefinita con i dati binomiali etichettati come 0s e 1s, Rmodellerà la probabilità di una risposta "1" mentre SAS modellerà la probabilità di una risposta "0". Per rendere il modello SAS la probabilità di "1" è necessario scrivere la variabile di risposta come use(event='1'). Naturalmente, anche senza farlo, credo che dovremmo aspettarci ancora le stesse stime delle varianze di effetti casuali, così come le stesse stime di effetti fissi sebbene con i loro segni invertiti.
Jake Westfall,

1
@EricaN Una cosa che mi hai appena ricordato è che dovresti confrontare gli effetti casuali da R a quelli in SAS usando la ranef()funzione piuttosto che coef(). Il primo fornisce gli effetti casuali effettivi, mentre il secondo fornisce gli effetti casuali più il vettore di effetti fissi. Quindi questo spiega molte delle ragioni per cui i numeri illustrati nel tuo post differiscono, ma rimane ancora una sostanziale discrepanza che non posso spiegare totalmente.
Jake Westfall,

Risposte:


11

Sembra che non avrei dovuto aspettarmi che le pendenze casuali fossero simili tra i pacchetti, secondo Zhang et al 2011. Nel loro articolo On Fitting Modelli lineari generalizzati a effetti misti per risposte binarie che usano diversi pacchetti statistici , descrivono:

Astratto:

Il modello di effetti misti lineari generalizzati (GLMM) è un paradigma popolare per estendere i modelli di dati trasversali a un'impostazione longitudinale. Se applicati alla modellazione di risposte binarie, pacchetti software diversi e persino procedure diverse all'interno di un pacchetto possono dare risultati piuttosto diversi. In questo rapporto, descriviamo gli approcci statistici che sono alla base di queste diverse procedure e discutiamo dei loro punti di forza e di debolezza quando applicati per adattarsi alle risposte binarie correlate. Illustriamo quindi queste considerazioni applicando queste procedure implementate in alcuni popolari pacchetti software a dati di studio simulati e reali. I nostri risultati della simulazione indicano una mancanza di affidabilità per la maggior parte delle procedure considerate, il che comporta implicazioni significative per l'applicazione pratica di tali pacchetti software popolari.

Spero che @BenBolker e il team considerino la mia domanda come un voto per R che includa errori standard empirici e capacità di quadratura di Gauss-Hermite per modelli con diversi termini di pendenza casuali da rendere più brillanti, poiché preferisco l'interfaccia R e mi piacerebbe poter applicare alcune ulteriori analisi in quel programma. Fortunatamente, anche se R e SAS non hanno valori comparabili per le pendenze casuali, le tendenze generali sono le stesse. Grazie a tutti per il tuo contributo, apprezzo molto il tempo e la considerazione che hai dedicato a questo!


scusa: cos'è un "errore standard standard"? Intendi errori standard dei componenti di varianza? O intendi errori standard sandwich?
Ben Bolker,

scusa ... significava empirici / sandwich SE. Ho modificato la mia risposta.
Nova,

@BenBolker È mai stato incorporato?
Lepidopterist

No. Continuo a cercare di capire come
sosterrò lo

4

Un mix di risposta e commento / altre domande:

Ho adattato il set di dati "giocattolo" con tre diverse opzioni di ottimizzazione. (* Nota 1: probabilmente sarebbe più utile per scopi comparativi creare un piccolo set di dati eseguendo il sottocampionamento all'interno di ogni anno e ID, piuttosto che sottocampionando le variabili di raggruppamento. Così com'è, sappiamo che il GLMM non funzionerà particolarmente bene con un numero così piccolo di livelli variabili di raggruppamento. Puoi farlo tramite qualcosa come:

library(plyr)
subdata <- ddply(fulldata,c("year","id"),
    function(x) x[sample(nrow(x),size=round(nrow(x)*0.1)),])

Codice di adattamento batch:

Ntoy <- readRDS("Newton_toy.RDS")
library(lme4)
fitfun <- function(opt) {
    tt <- system.time(fit1 <- glmer(use ~  ps + th + rs + hw +
                                    (1 + ps + th + rs + hw |id/year),
                                    family = binomial, data = Ntoy,
                                    control=glmerControl(optimizer=opt),
                                    verbose=100))
    return(list(time=tt,fit=fit1))
}

opts <- c("nloptwrap","nlminbwrap","bobyqa")
## use for() instead of lapply so we can checkpoint more easily
res <- setNames(vector("list",length(opts)),opts)
for (i in opts) {
    res[[i]] <- fitfun(i)
    save("res",file="Newton_batch.RData")
}

Quindi ho letto i risultati in una nuova sessione:

load("Newton_batch.RData")
library(lme4)

Tempo trascorso e devianza:

cbind(time=unname(sapply(res,function(x) x$time["elapsed"])),
          dev=sapply(res,function(x) deviance(x$fit)))
##                time      dev
## nloptwrap  1001.824 6067.706
## nlminbwrap 3495.671 6068.730
## bobyqa     4945.332 6068.731

Queste deviazioni sono considerevolmente al di sotto della deviazione riportata dall'OP da R (6101,7) e leggermente inferiore a quelle riportate dall'OP da SAS (6078,9), sebbene il confronto delle deviazioni tra i pacchetti non sia sempre sensato.

Sono stato davvero sorpreso dal fatto che SAS convergesse solo in circa 100 valutazioni di funzioni!

I tempi vanno da 17 minuti ( nloptwrap) a 80 minuti ( bobyqa) su un Macbook Pro, in linea con l'esperienza dell'OP. Devianza è un po 'meglio per nloptwrap.

round(cbind(sapply(res,function(x) fixef(x$fit))),3)
##             nloptwrap nlminbwrap bobyqa
## (Intercept)    -5.815     -5.322 -5.322
## ps             -0.989      0.171  0.171
## th             -0.033     -1.342 -1.341
## rs              1.361     -0.140 -0.139
## hw             -2.100     -2.082 -2.082

Le risposte sembrano piuttosto diverse con nloptwrap- anche se gli errori standard sono abbastanza grandi ...

round(coef(summary(res[[1]]$fit)),3)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -5.815      0.750  -7.750    0.000
## ps            -0.989      1.275  -0.776    0.438
## th            -0.033      2.482  -0.013    0.989
## rs             1.361      2.799   0.486    0.627
## hw            -2.100      0.490  -4.283    0.000

(il codice qui fornisce alcuni avvertimenti year:idche dovrei rintracciare)

Continua ... ?


sarebbe più utile se ti inviassi il set di dati completo? L'unico problema è che la convergenza richiede circa 9 ore con l'intero set di dati, quindi il tuo suggerimento riguardo al campionamento è buono. Ho provato a trasformare i dati con una trasformazione del registro, ma la trama residua in binn è ancora brutta - pensi che la trama residua spieghi parte del problema con questi dati? Infine - i tuoi risultati in SAS erano simili a quelli di R?
Nova,
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.