Come adattare un modello misto con una variabile di risposta compresa tra 0 e 1?


15

Sto cercando di utilizzare lme4::glmer()per adattare un modello misto generalizzato binomiale (GLMM) con una variabile dipendente che non è binaria, ma una variabile continua tra zero e uno. Si può pensare a questa variabile come a una probabilità; in effetti è la probabilità riportata da soggetti umani (in un esperimento che aiuto ad analizzare). Cioè non è una frazione "discreta", ma una variabile continua.

La mia glmer()chiamata non funziona come previsto (vedi sotto). Perché? Cosa posso fare?

Modifica successiva: la mia risposta di seguito è più generale della versione originale di questa domanda, quindi ho modificato la domanda per essere anche più generale.


Più dettagli

Apparentemente è possibile usare la regressione logistica non solo per DV binario ma anche per DV continuo tra zero e uno. Anzi, quando corro

glm(reportedProbability ~ a + b + c, myData, family="binomial")

Ricevo un messaggio di avvertimento

Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!

ma una misura molto ragionevole (tutti i fattori sono categorici, quindi posso facilmente verificare se le previsioni del modello sono vicine alle medie tra soggetti e lo sono).

Tuttavia, ciò che voglio effettivamente usare è

glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")

Mi dà l'avvertimento identico, restituisce un modello, ma questo modello è chiaramente molto spento; le stime degli effetti fissi sono molto lontane da glm()quelle e dai mezzi trasversali. (E ho bisogno di includere glmerControl(optimizer="bobyqa")nella glmerchiamata, altrimenti non converge affatto.)


1
Che ne dici di trasformare prima le probabilità? Riesci a ottenere qualcosa che è più vicino alla distribuzione normale con dire, una trasformazione logit? O l'arcosin-sqrt? Questa sarebbe la mia preferenza piuttosto che usare glmer. O nella tua soluzione di hacking, potresti anche provare ad aggiungere un effetto casuale per ogni osservazione per tenere conto della sottodispersione dovuta alla scelta dei pesi.
Aaron - Ripristina Monica il

Grazie. Sì, posso registrare il DV e quindi utilizzare il modello misto gaussiano (lmer), ma anche questo è un tipo di hack e ho letto che non è raccomandato. Proverò un effetto casuale per ogni osservazione! Al momento, sto provando il modello beta misto; lme4 non può gestirlo, ma glmmadmb può farlo. Quando corro glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta"), ottengo la giusta misura e intervalli di confidenza ragionevoli, ma un avviso di convergenza fallito : - / Sto cercando di capire come aumentare il numero di iterazioni. Beta potrebbe funzionare per me perché non ho casi DV = 0 o DV = 1.
ameba dice Reinstate Monica il

Non so per glmer, ma per glm questo può aiutare: stats.stackexchange.com/questions/164120/… :

1
@Aaron: ho provato ad aggiungere + (1 | rowid)alla mia chiamata glmer e questo produce stime stabili e intervalli di confidenza stabili, indipendentemente dalla mia scelta di peso (ho provato 100 e 500). Ho anche provato a eseguire lmer su logit (reportingProbability) e ottengo quasi esattamente la stessa cosa. Quindi entrambe le soluzioni sembrano funzionare bene! Beta MM con glmmadmb offre anche risultati molto vicini, ma per qualche motivo non riesce a convergere completamente e impiega un'eternità a funzionare. Valuta di pubblicare una risposta in cui sono elencate queste opzioni e spiega un po 'le differenze e i pro / contro! (Gli intervalli di confidenza che ho citato sono tutti Wald.)
ameba dice Reinstate Monica il

1
E sono assolutamente certi del loro valore come 0,9 o hanno anche un "margine di errore"? Puoi presumere che la fiducia segnalata da diversi soggetti sia ugualmente precisa?

Risposte:


20

Ha senso iniziare con un caso più semplice senza effetti casuali.

Esistono quattro modi per gestire la variabile di risposta zero-to-one continua che si comporta come una frazione o una probabilità ( questo è il nostro thread più canonico / aggiornato / visualizzato su questo argomento, ma sfortunatamente non tutte le quattro opzioni sono discusse lì):

  1. p=m/nnnN

    glm(p ~ a+b+c, myData, family="binomial", weights=n)
  2. pp01

    betareg(p ~ a+b+c, myData)
  3. Logit trasforma la risposta e usa la regressione lineare. Questo di solito non è consigliato.

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. Adatta un modello binomiale ma poi calcola gli errori standard tenendo conto dell'eccessiva dispersione. Gli errori standard possono essere calcolati in vari modi:

    • (a) errori standard ridimensionati tramite la stima di sovradispersione ( uno , due ). Questo si chiama GLM "quasi binomiale".

    • (b) errori standard robusti tramite lo stimatore sandwich ( uno , due , tre , quattro ). Questo è chiamato "logotipo frazionario" in econometria.


    Le lettere (a) e (b) non sono identiche (vedere questo commento e le sezioni 3.4.1 e 3.4.2 in questo libro , in questo post SO e anche in questo e in questo ), ma tendono a dare risultati simili. L'opzione (a) è implementata glmcome segue:

    glm(p ~ a+b+c, myData, family="quasibinomial")

Gli stessi quattro modi sono disponibili con effetti casuali.

  1. Utilizzo weightsdell'argomento ( uno , due ):

    glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

    Secondo il secondo link sopra, potrebbe essere una buona idea modellare la sovradispersione, vedi qui (e anche il n. 4 sotto).

  2. Utilizzando il modello beta misto:

    glmmadmb(p ~ a+b+c + (1|subject), myData, family="beta")

    o

    glmmTMB(p ~ a+b+c + (1|subject), myData, 
            family=list(family="beta",link="logit"))

    Se ci sono zero o esatti nei dati di risposta, allora si può usare il modello beta zero / gonfiato in glmmTMB.

  3. Utilizzo della trasformazione logit della risposta:

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. Contabilizzazione della sovradispersione nel modello binomiale. Questo utilizza un trucco diverso: aggiungere un effetto casuale per ciascun punto dati:

    myData$rowid = as.factor(1:nrow(myData))
    glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
          glmerControl(optimizer="bobyqa"))

    Per qualche motivo questo non funziona correttamente poiché si glmer()lamenta di non numeri interi pe produce stime senza senso. Una soluzione che mi è venuta in mente è usare una costante falsa weights=ke assicurarmi che p*ksia sempre intero. Ciò richiede l'arrotondamento, pma selezionando kabbastanza grande non dovrebbe importare molto. I risultati non sembrano dipendere dal valore di k.

    k = 100
    glmer(round(p*k)/k ~ a+b+c + (1|subject) + (1|rowid), myData, 
          family="binomial", weights=rowid*0+k, glmerControl(optimizer="bobyqa"))

    Aggiornamento successivo (gennaio 2018): potrebbe trattarsi di un approccio non valido. Vedi la discussione qui . Devo indagare di più.


Nel mio caso specifico l'opzione n. 1 non è disponibile.

L'opzione n. 2 è molto lenta e ha problemi con la convergenza: glmmadmbrichiede cinque-dieci minuti (e si lamenta ancora che non è convergente!), Mentre lmerfunziona in una frazione di secondo e glmerrichiede un paio di secondi. Aggiornamento: ho provato glmmTMBcome suggerito nei commenti di @BenBolker e funziona quasi altrettanto velocemente glmer, senza problemi di convergenza. Quindi questo è quello che userò.

Le opzioni n. 3 e n. 4 forniscono stime molto simili e intervalli di confidenza Wald molto simili (ottenuti con confint). Non sono un grande fan del n. 3 perché è una specie di imbroglione. E # 4 sembra un po 'confuso.

Un enorme grazie a @Aaron che mi ha indicato il n. 3 e il n. 4 nel suo commento.


1
Bella risposta, ben spiegata e connessa con i modelli senza effetti casuali. Non definirei imbroglio n. 3 (la trasformazione), tuttavia, questo tipo di trasformazioni è molto comune in analisi come queste. Direi invece che sia il n. 3 che il n. 4 fanno ipotesi sulla relazione relativa alla distribuzione dei dati, e quindi anche sulla relazione tra media e varianza, e solo perché il n. 4 sta modellando sulla scala che i dati è stato raccolto su non significa che quei presupposti saranno migliori.
Aaron - Ripristina Monica il

1
Il n. 3 presuppone che il logit delle probabilità sia normale con varianza costante, mentre il n. 4 presuppone che la varianza sia proporzionale a p (1-p). Dalla tua descrizione della misura, questi sembrano essere abbastanza simili da non importare troppo. E il numero 3 è quasi certamente più standard (a seconda del pubblico), quindi se la diagnostica è ragionevole, è quella che preferirei.
Aaron - Ripristina Monica il

1
un'altra possibilità è usare glmmTMB ; dopo l'installazione con devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB"), l'utilizzo glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))dovrebbe funzionare ...
Ben Bolker,

@BenBolker Grazie! C'è qualche motivo per preferire glmmTMB a glmmADMB (per i modelli beta) o viceversa? Uno di questi pacchetti è più recente o sviluppato più attivamente? A parte questo, posso chiedere quale approccio tra quelli elencati in questa risposta - gluss gaussiano dopo trasformazione logit, beta glmm o glmm binomiale con termine (1 | rowid) - trovi generalmente preferibile?
ameba dice Ripristina Monica il

1
Preferisco il beta GLMM se possibile - è il modello statistico che ha lo scopo di misurare i cambiamenti nelle proporzioni tra covariate / gruppi. glmmTMBè più veloce e più stabile rispetto glmmADMBe sotto (leggermente) uno sviluppo più attivo, sebbene non così maturo.
Ben Bolker,
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.