Modello di effetti misti: confronta il componente di varianza casuale attraverso i livelli di una variabile di raggruppamento


14

Supponiamo che io abbia N partecipanti, ognuno dei quali dà una risposta Y 20 volte, 10 in una condizione e 10 in un'altra. Adatto un modello lineare di effetti misti confrontando Y in ogni condizione. Ecco un esempio riproducibile che simula questa situazione usando il lme4pacchetto in R:

library(lme4)
fml <- "~ condition + (condition | participant_id)"
d <- expand.grid(participant_id=1:40, trial_num=1:10)
d <- rbind(cbind(d, condition="control"), cbind(d, condition="experimental"))

set.seed(23432)
d <- cbind(d, simulate(formula(fml), 
                       newparams=list(beta=c(0, .5), 
                                      theta=c(.5, 0, 0), 
                                      sigma=1), 
                       family=gaussian, 
                       newdata=d))

m <- lmer(paste("sim_1 ", fml), data=d)
summary(m)

Il modello mproduce due effetti fissi (una intercetta e una pendenza per condizione) e tre effetti casuali (una intercettazione casuale per partecipante, una pendenza casuale per partecipante per condizione e una correlazione intercetta-pendenza).

Vorrei confrontare statisticamente la dimensione della varianza dell'intercettazione casuale per partecipante tra i gruppi definiti da condition(ovvero, calcolare la componente di varianza evidenziata in rosso separatamente all'interno delle condizioni di controllo e sperimentali, quindi verificare se la differenza nelle dimensioni dei componenti è diverso da zero). Come lo farei (preferibilmente in R)?

inserisci qui la descrizione dell'immagine


BONUS

Diciamo che il modello è leggermente più complicato: i partecipanti sperimentano 10 stimoli 20 volte ciascuno, 10 in una condizione e 10 in un'altra. Pertanto, ci sono due serie di effetti casuali incrociati: effetti casuali per i partecipanti e effetti casuali per lo stimolo. Ecco un esempio riproducibile:

library(lme4)
fml <- "~ condition + (condition | participant_id) + (condition | stimulus_id)"
d <- expand.grid(participant_id=1:40, stimulus_id=1:10, trial_num=1:10)
d <- rbind(cbind(d, condition="control"), cbind(d, condition="experimental"))

set.seed(23432)
d <- cbind(d, simulate(formula(fml), 
                       newparams=list(beta=c(0, .5), 
                                      theta=c(.5, 0, 0, .5, 0, 0), 
                                      sigma=1), 
                       family=gaussian, 
                       newdata=d))

m <- lmer(paste("sim_1 ", fml), data=d)
summary(m)

Vorrei confrontare statisticamente la grandezza della varianza casuale di intercettazione per partecipante tra i gruppi definiti da condition. Come lo farei e il processo è diverso da quello nella situazione sopra descritta?


MODIFICARE

Per essere un po 'più specifico su ciò che sto cercando, voglio sapere:

  1. È la domanda ", sono le risposte medie condizionali all'interno di ciascuna condizione (ovvero, valori di intercettazione casuali in ciascuna condizione) sostanzialmente diverse l'una dall'altra, al di là di ciò che ci aspetteremmo a causa dell'errore di campionamento" una domanda ben definita (cioè, è questa domanda anche teoricamente rispondente)? In caso contrario, perché no?
  2. Se la risposta alla domanda (1) è sì, come risponderei? Preferirei Run'implementazione, ma non sono legato al lme4pacchetto - ad esempio, sembra che il OpenMxpacchetto abbia la capacità di ospitare analisi multi-gruppo e multi-livello ( https: //openmx.ssri.psu. edu / openmx-features ), e questo sembra il tipo di domanda a cui dovrebbe essere possibile rispondere in un framework SEM.

1
@MarkWhite, ho aggiornato la domanda in risposta ai tuoi commenti. Voglio dire che voglio confrontare la deviazione standard delle intercettazioni dei partecipanti quando danno risposte nella condizione di controllo rispetto a quando danno risposte nella condizione sperimentale. Voglio fare questo statisticamente, cioè testare se la differenza nella deviazione standard delle intercettazioni è diversa da 0.
Patrick S. Forscher,

2
Ho scritto una risposta, ma ci dormirò perché non sono sicuro che sia molto utile. La domanda si riduce al fatto che non penso che si possa fare ciò che si sta chiedendo. L'effetto casuale dell'intercettazione è la varianza nei mezzi dei partecipanti quando si trovano nella condizione di controllo. Quindi non si può guardare alla varianza di quelli per le osservazioni nella condizione sperimentale. Le intercettazioni sono definite a livello di persona e la condizione è a livello di osservazione. Se stai cercando di confrontare le variazioni tra le condizioni, vorrei pensare a modelli condizionalmente eteroscedastici.
Mark White,

2
Sto lavorando a una revisione e reinvio per un documento in cui ho partecipanti che danno risposte a serie di stimoli. Ogni partecipante è esposto a più condizioni e ogni stimolo riceve una risposta in più condizioni - in altre parole, il mio studio emula l'impostazione che descrivo nella mia descrizione "BONUS". In uno dei miei grafici, sembra che la risposta media dei partecipanti abbia una maggiore variabilità in una delle condizioni rispetto alle altre. Un revisore mi ha chiesto di verificare se questo è vero.
Patrick S. Forscher,

2
Vedere qui stats.stackexchange.com/questions/322213 per come impostare un modello lme4 con parametri di varianza diversi per ogni livello di una variabile di raggruppamento. Non sono sicuro di come fare un test di ipotesi sull'eguaglianza di due parametri di varianza; personalmente, preferirei sempre fare il bootstrap su soggetti e stimoli per ottenere un intervallo di confidenza, o forse per impostare una sorta di test di ipotesi simile a permutazione (basato sul ricampionamento).
ameba dice Ripristina Monica l'

3
Concordo con il commento di @MarkWhite sul fatto che la domanda "sono le varianze di intercettazione casuali sostanzialmente diverse l'una dall'altra ..." è nella migliore delle ipotesi poco chiara e nel peggiore dei casi priva di senso, perché l'intercettazione si riferisce necessariamente ai valori Y in un gruppo specifico (il il gruppo ha assegnato il valore di 0), quindi confrontare "intercettazioni" tra gruppi in senso stretto non ha senso. Penso che un modo migliore per riformulare la tua domanda, per come la comprendo, sarebbe qualcosa del tipo: "le varianze delle risposte medie condizionali dei partecipanti nella condizione A rispetto alla condizione B sono disuguali?"
Jake Westfall,

Risposte:


6

C'è più di un modo per testare questa ipotesi. Ad esempio, la procedura descritta da @amoeba dovrebbe funzionare. Ma mi sembra che il modo più semplice e conveniente per testarlo sia usare un buon vecchio test del rapporto di verosimiglianza confrontando due modelli nidificati. L'unica parte potenzialmente complicata di questo approccio è sapere come impostare la coppia di modelli in modo che l'eliminazione di un singolo parametro verifichi chiaramente l'ipotesi desiderata di varianze disuguali. Di seguito spiego come farlo.

Risposta breve

Passa alla codifica del contrasto (somma a zero) per la tua variabile indipendente e quindi fai un test del rapporto di verosimiglianza confrontando il tuo modello completo con un modello che forza la correlazione tra pendenze casuali e intercettazioni casuali su 0:

# switch to numeric (not factor) contrast codes
d$contrast <- 2*(d$condition == 'experimental') - 1

# reduced model without correlation parameter
mod1 <- lmer(sim_1 ~ contrast + (contrast || participant_id), data=d)

# full model with correlation parameter
mod2 <- lmer(sim_1 ~ contrast + (contrast | participant_id), data=d)

# likelihood ratio test
anova(mod1, mod2)

Spiegazione / intuizione visiva

Affinché questa risposta abbia un senso, è necessario avere una comprensione intuitiva di ciò che i diversi valori del parametro di correlazione implicano per i dati osservati. Considera le linee di regressione specifiche del soggetto (che variano in modo casuale). Fondamentalmente, il parametro di correlazione controlla se le linee di regressione del partecipante "fan out to right" (correlazione positiva) o "fan out to left" (correlazione negativa) rispetto al punto X=0 , dove X è il tuo codice indipendente dal contrasto variabile. Entrambe queste implicano una disparità di disparità nelle risposte medie condizionali dei partecipanti. Questo è illustrato di seguito:

correlazione casuale

In questo diagramma, ignoriamo le molteplici osservazioni che abbiamo per ogni soggetto in ogni condizione e invece tracciamo semplicemente i due mezzi casuali di ciascun soggetto, con una linea che li collega, che rappresenta la pendenza casuale di quel soggetto. (Si tratta di dati composti da 10 soggetti ipotetici, non dai dati pubblicati nel PO.)

Nella colonna a sinistra, dove esiste una forte correlazione negativa tra intercetta e inclinazione, le linee di regressione si estendono a sinistra rispetto al punto X=0 . Come puoi vedere chiaramente nella figura, ciò porta a una maggiore varianza dei mezzi casuali dei soggetti nella condizione X=1 rispetto alla condizione X=1 .

La colonna a destra mostra il contrario, l'immagine speculare di questo modello. In questo caso c'è una maggiore varianza nei mezzi casuali dei soggetti nella condizione X=1 rispetto alla condizione X=1 .

La colonna nel mezzo mostra cosa succede quando le pendenze casuali e le intercettazioni casuali non sono correlate. Ciò significa che le linee di regressione si estendono verso sinistra esattamente quanto si estendono verso destra, rispetto al punto X=0 . Ciò implica che le varianze dei mezzi dei soggetti nelle due condizioni sono uguali.

È cruciale qui che abbiamo usato uno schema di codifica del contrasto somma-zero, non codici fittizi (cioè, non impostando i gruppi su X=0 vs. X=1 ). È solo nell'ambito dello schema di codifica del contrasto che abbiamo questa relazione in cui le varianze sono uguali se e solo se la correlazione intercetta-inclinazione è 0. La figura seguente cerca di costruire quell'intuizione:

inserisci qui la descrizione dell'immagine

Ciò che questa figura mostra è lo stesso set di dati esatto in entrambe le colonne, ma con la variabile indipendente codificata in due modi diversi. Nella colonna a sinistra usiamo i codici di contrasto - questa è esattamente la situazione della prima figura. Nella colonna a destra usiamo i codici fittizi. Ciò altera il significato delle intercettazioni - ora le intercettazioni rappresentano le risposte previste dei soggetti nel gruppo di controllo. Il pannello in basso mostra le conseguenze di questo cambiamento, vale a dire che la correlazione tra pendenza e intercetta non è più da nessuna parte vicino a 0, anche se i dati sono gli stessi in un senso profondo e le varianze condizionali sono uguali in entrambi i casi. Se questo non sembra avere molto senso, studiare questa mia precedente risposta in cui parlo di più su questo fenomeno può essere d'aiuto.

Prova

Let yijk sia il j esima risposta della i esima soggetto in condizioni k . (Abbiamo solo due condizioni qui, quindi k è solo 1 o 2.) Quindi il modello misto può essere scritto

yijk=αi+βixk+eijk,
doveαi sono i soggetti ' intercettazioni casuali e varianzaσα2 ,βisono la pendenza casuale dei soggetti e hanno varianza σβ2 , eijk è il termine di errore a livello di osservazione e cov(αi,βi)=σαβ .

Desideriamo dimostrare che

var(αi+βix1)=var(αi+βix2)σαβ=0.

A partire dal lato sinistro di questa implicazione, abbiamo

var(αi+βix1)=var(αi+βix2)σα2+x12σβ2+2x1σαβ=σα2+x22σβ2+2x2σαβσβ2(x12x22)+2σαβ(x1x2)=0.

I codici di contrasto somma-zero implicano che x1+x2=0 e x12=x22=x2 . Quindi possiamo ridurre ulteriormente l'ultima riga di cui sopra a

σβ2(x2x2)+2σαβ(x1+x1)=0σαβ=0,
che è quello che volevamo dimostrare. (Per stabilire l'altra direzione dell'implicazione, possiamo semplicemente seguire questi stessi passaggi al contrario.)

Per ribadire, ciò dimostra che se la variabile indipendente è codificata in contrasto (somma a zero) , allora le varianze dei mezzi casuali dei soggetti in ciascuna condizione sono uguali se e solo se la correlazione tra pendenze casuali e intercettazioni casuali è 0. La chiave il punto di partenza di tutto ciò è che testare l'ipotesi nulla che σαβ=0 metterà alla prova l'ipotesi nulla di varianze uguali descritte dall'OP.

Questo NON funziona se la variabile indipendente è, diciamo, codificata fittizia. In particolare, se inseriamo i valori x1=0 e x2=1 nelle equazioni sopra, troviamo che

var(αi)=var(αi+βi)σαβ=σβ22.


Questa è già una risposta formidabile, grazie! Penso che questo si avvicini di più alla risposta alla mia domanda, quindi lo accetto e ti do la generosità (sta per scadere), ma mi piacerebbe vedere una giustificazione algebrica se hai il tempo e l'energia per farlo.
Patrick S. Forscher,

1
@ PatrickS.Forscher Ho appena aggiunto una prova
Jake Westfall,

1
@JakeWestfall Nel mio esempio di giocattolo, i soggetti hanno girato le risposte nelle due condizioni. Se un soggetto ha risposta a nella condizione A e - a nella condizione B, quale sarebbe il valore BLUP dell'intercettazione casuale per questo soggetto quando utilizziamo il modello? Penso che possa essere solo 0. Se tutti i soggetti hanno BLUP pari a zero, anche la varianza dell'intercettazione casuale è zero. Quindi questo modello non è in grado di adattarsi a questo esempio di giocattolo. Al contrario, il modello sopra definito avrà due BLUP per ogni soggetto e possono essere facilmente a e - a . Mi sto perdendo qualcosa qui? aa(1 | subject)dummyaa
ameba dice di reintegrare Monica il

1
Vedo ora che hai ragione @amoeba, grazie per avermi spiegato. Modificherò la mia risposta di conseguenza.
Jake Westfall,

1
@amoeba Hai ragione sul fatto che è possibile che i BLUP possano essere correlati anche senza un parametro di correlazione nel modello. Ma credo che ai fini del test la procedura funzioni ancora come previsto (ad esempio, ha il tasso di errore nominale di tipo 1) perché solo il modello con il parametro di correlazione è in grado di incorporarlo nella funzione di probabilità e quindi "ricevere credito" per quello . Cioè, anche se i BLUP escono correlati nel modello più semplice, è comunque come se gli effetti non fossero correlati per quanto riguarda la probabilità totale, quindi il test LR funzionerà. Penso :)
Jake Westfall

6

È possibile verificare la significatività, dei parametri del modello, con l'aiuto di intervalli di confidenza stimati per i quali il pacchetto lme4 ha la confint.merModfunzione.

bootstrap (vedi ad esempio Intervallo di confidenza da bootstrap )

> confint(m, method="boot", nsim=500, oldNames= FALSE)
Computing bootstrap confidence intervals ...
                                                           2.5 %     97.5 %
sd_(Intercept)|participant_id                         0.32764600 0.64763277
cor_conditionexperimental.(Intercept)|participant_id -1.00000000 1.00000000
sd_conditionexperimental|participant_id               0.02249989 0.46871800
sigma                                                 0.97933979 1.08314696
(Intercept)                                          -0.29669088 0.06169473
conditionexperimental                                 0.26539992 0.60940435 

profilo di verosimiglianza (vedi ad esempio Qual è la relazione tra verosimiglianza del profilo e intervalli di confidenza? )

> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
                                                          2.5 %     97.5 %
sd_(Intercept)|participant_id                         0.3490878 0.66714551
cor_conditionexperimental.(Intercept)|participant_id -1.0000000 1.00000000
sd_conditionexperimental|participant_id               0.0000000 0.49076950
sigma                                                 0.9759407 1.08217870
(Intercept)                                          -0.2999380 0.07194055
conditionexperimental                                 0.2707319 0.60727448

  • C'è anche un metodo, 'Wald'ma questo è applicato solo agli effetti fissi.

  • Esistono anche alcuni tipi di espressioni anova (rapporto di verosimiglianza) nel pacchetto lmerTest denominato ranova. Ma non riesco a dare un senso a questo. La distribuzione delle differenze in LogLikelihood, quando l'ipotesi nulla (varianza zero per l'effetto casuale) è vera non è distribuita chi- quadro (probabilmente quando il numero di partecipanti e prove è alto, il test del rapporto di verosimiglianza potrebbe avere senso).


Varianza in gruppi specifici

Per ottenere risultati per la varianza in gruppi specifici, è possibile modificare la parametrizzazione

# different model with alternative parameterization (and also correlation taken out) 
fml1 <- "~ condition + (0 + control + experimental || participant_id) "

Dove abbiamo aggiunto due colonne al frame di dati (questo è necessario solo se si desidera valutare il "controllo" non correlato e "sperimentale" la funzione (0 + condition || participant_id)non porterebbe alla valutazione dei diversi fattori in condizioni come non correlati)

#adding extra columns for control and experimental
d <- cbind(d,as.numeric(d$condition=='control'))
d <- cbind(d,1-as.numeric(d$condition=='control'))
names(d)[c(4,5)] <- c("control","experimental")

Ora lmerdarà varianza per i diversi gruppi

> m <- lmer(paste("sim_1 ", fml1), data=d)
> m
Linear mixed model fit by REML ['lmerModLmerTest']
Formula: paste("sim_1 ", fml1)
   Data: d
REML criterion at convergence: 2408.186
Random effects:
 Groups           Name         Std.Dev.
 participant_id   control      0.4963  
 participant_id.1 experimental 0.4554  
 Residual                      1.0268  
Number of obs: 800, groups:  participant_id, 40
Fixed Effects:
          (Intercept)  conditionexperimental  
               -0.114                  0.439 

E puoi applicare i metodi del profilo a questi. Ad esempio, ora confint fornisce intervalli di confidenza per il controllo e la varianza sperimentale.

> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
                                    2.5 %     97.5 %
sd_control|participant_id       0.3490873 0.66714568
sd_experimental|participant_id  0.3106425 0.61975534
sigma                           0.9759407 1.08217872
(Intercept)                    -0.2999382 0.07194076
conditionexperimental           0.1865125 0.69149396

Semplicità

Potresti usare la funzione di verosimiglianza per ottenere confronti più avanzati, ma ci sono molti modi per fare approssimazioni lungo la strada (ad esempio potresti fare un test anova / lrt conservativo, ma è quello che vuoi?).

A questo punto mi chiedo quale sia effettivamente il punto di questo confronto (non così comune) tra le varianze. Mi chiedo se inizi a diventare troppo sofisticato. Perché la differenza tra varianze invece del rapporto tra varianze (che si riferisce alla classica distribuzione F)? Perché non segnalare solo intervalli di confidenza? Dobbiamo fare un passo indietro e chiarire i dati e la storia che dovrebbe raccontare, prima di intraprendere percorsi avanzati che possono essere superflui e perdere il contatto con la questione statistica e le considerazioni statistiche che sono in realtà l'argomento principale.

Mi chiedo se si dovrebbe fare molto di più che semplicemente dichiarare gli intervalli di confidenza (che in realtà potrebbero dire molto di più di un test di ipotesi. Un test di ipotesi dà un sì nessuna risposta ma nessuna informazione sulla diffusione effettiva della popolazione. Dati sufficienti che puoi fare una leggera differenza da segnalare come differenza significativa). Per approfondire la questione (per qualsiasi scopo), credo, a mio avviso, una domanda di ricerca più specifica (definita in modo restrittivo) al fine di guidare il macchinario matematico a effettuare le opportune semplificazioni (anche quando un calcolo esatto potrebbe essere fattibile o quando potrebbe essere approssimato da simulazioni / bootstrap, anche se in alcune impostazioni richiede comunque un'interpretazione appropriata). Confronta con l'esatto test di Fisher per risolvere esattamente una (particolare) domanda (sulle tabelle di contingenza),

Semplice esempio

Per fornire un esempio della semplicità possibile, mostro di seguito un confronto (mediante simulazioni) con una semplice valutazione della differenza tra le due varianze di gruppo sulla base di un test F fatto confrontando le varianze nelle risposte medie individuali e confrontando il modello misto derivava varianze.

j

Y^i,jN(μj,σj2+σϵ210)

σεσjj={1,2} ) è uguale, allora il rapporto per la varianza per 40 significa nella condizione 1 e la varianza per i 40 mezzi nella condizione 2 è distribuita secondo la distribuzione F con gradi di libertà 39 e 39 per numeratore e denominatore.

Puoi vederlo nella simulazione del grafico sotto dove, a parte il punteggio F basato sul campione, un punteggio F viene calcolato in base alle variazioni previste (o somme di errore al quadrato) dal modello.

differenza di esempio nell'esattezza

σj=1=σj=2=0.5σϵ=1

Puoi vedere che c'è qualche differenza. Questa differenza può essere dovuta al fatto che il modello lineare a effetti misti sta ottenendo le somme dell'errore al quadrato (per l'effetto casuale) in modo diverso. E questi termini di errore al quadrato non sono (più) ben espressi come una semplice distribuzione Chi al quadrato, ma sono ancora strettamente correlati e possono essere approssimati.

σj=1σj=2Y^i,jσjσϵ

esempio differenza di potenza

σj=1=0.5σj=2=0.25σϵ=1

Quindi il modello basato sui mezzi è molto esatto. Ma è meno potente. Ciò dimostra che la strategia corretta dipende da ciò che si desidera / è necessario.

Nell'esempio sopra quando si impostano i confini della coda destra su 2.1 e 3.1 si ottiene circa l'1% della popolazione in caso di varianza uguale (rispettivamente 103 e 104 dei 10.000 casi) ma in caso di varianza diseguale questi confini differiscono molto (dando 5334 e 6716 dei casi)

codice:

set.seed(23432)

# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
fml <- "~ condition + (condition | participant_id)"

n <- 10000

theta_m <- matrix(rep(0,n*2),n)
theta_f <- matrix(rep(0,n*2),n)

# initial data frame later changed into d by adding a sixth sim_1 column
ds <- expand.grid(participant_id=1:40, trial_num=1:10)
ds <- rbind(cbind(ds, condition="control"), cbind(ds, condition="experimental"))
  #adding extra columns for control and experimental
  ds <- cbind(ds,as.numeric(ds$condition=='control'))
  ds <- cbind(ds,1-as.numeric(ds$condition=='control'))
  names(ds)[c(4,5)] <- c("control","experimental")

# defining variances for the population of individual means
stdevs <- c(0.5,0.5) # c(control,experimental)

pb <- txtProgressBar(title = "progress bar", min = 0,
                    max = n, style=3)
for (i in 1:n) {

  indv_means <- c(rep(0,40)+rnorm(40,0,stdevs[1]),rep(0.5,40)+rnorm(40,0,stdevs[2]))
  fill <- indv_means[d[,1]+d[,5]*40]+rnorm(80*10,0,sqrt(1)) #using a different way to make the data because the simulate is not creating independent data in the two groups 
  #fill <- suppressMessages(simulate(formula(fml), 
  #                     newparams=list(beta=c(0, .5), 
  #                                    theta=c(.5, 0, 0), 
  #                                    sigma=1), 
  #                     family=gaussian, 
  #                     newdata=ds))
  d <- cbind(ds, fill)
  names(d)[6] <- c("sim_1")


  m <- lmer(paste("sim_1 ", fml1), data=d)
  m
  theta_m[i,] <- m@theta^2

  imeans <- aggregate(d[, 6], list(d[,c(1)],d[,c(3)]), mean)
  theta_f[i,1] <- var(imeans[c(1:40),3])
  theta_f[i,2] <- var(imeans[c(41:80),3])

  setTxtProgressBar(pb, i)
}
close(pb)

p1 <- hist(theta_f[,1]/theta_f[,2], breaks = seq(0,6,0.06))       
fr <- theta_m[,1]/theta_m[,2]
fr <- fr[which(fr<30)]
p2 <- hist(fr, breaks = seq(0,30,0.06))



plot(-100,-100, xlim=c(0,6), ylim=c(0,800), 
     xlab="F-score", ylab = "counts [n out of 10 000]")
plot( p1, col=rgb(0,0,1,1/4), xlim=c(0,6), ylim=c(0,800), add=T)  # means based F-score
plot( p2, col=rgb(1,0,0,1/4), xlim=c(0,6), ylim=c(0,800), add=T)  # model based F-score
fr <- seq(0, 4, 0.01)
lines(fr,df(fr,39,39)*n*0.06,col=1)
legend(2, 800, c("means based F-score","mixed regression based F-score"), 
       fill=c(rgb(0,0,1,1/4),rgb(1,0,0,1/4)),box.col =NA, bg = NA)
legend(2, 760, c("F(39,39) distribution"), 
       lty=c(1),box.col = NA,bg = NA)
title(expression(paste(sigma[1]==0.5, " , ", sigma[2]==0.5, " and ", sigma[epsilon]==1)))

È utile ma non sembra rispondere alla domanda su come confrontare le varianze in due condizioni.
ameba dice che ripristini Monica il

@amoeba Ho scoperto che questa risposta fornisce il nocciolo del problema (sul test dei componenti di varianza casuali). Ciò che l'OP vuole precisamente è difficile da leggere in tutto il testo. A cosa si riferisce "le varianze delle intercettazioni casuali"? (il plurale in relazione all'intercettazione mi confonde) Un possibile caso potrebbe essere quello di utilizzare il modello sim_1 ~ condition + (0 + condition | participant_id)"nel qual caso si ottiene una parametrizzazione in due parametri (uno per ciascun gruppo) anziché due parametri uno per l'intercetta e uno per l'effetto (che devono essere combinati per i gruppi).
Sesto Empirico,

Ogni soggetto ha una risposta media nella condizione A e una risposta media nella condizione B. La domanda è se la varianza tra i soggetti in A è diversa dalla varianza tra i soggetti in B.
ameba dice Reinstate Monica

Ciò non completa l'attività proposta nel titolo "Confronta componente varianza casuale tra i livelli di una variabile di raggruppamento". Ho notato che c'era un errore di confusione nel corpo della domanda, che ho risolto. Ho anche cercato di chiarire ulteriormente la formulazione della domanda.
Patrick S. Forscher,

Potrebbe essere possibile rispondere alla domanda utilizzando car::linearHypothesisTest( math.furman.edu/~dcs/courses/math47/R/library/car/html/… ), che consente all'utente di testare ipotesi arbitrarie con un modello adattato. Tuttavia, dovrei usare il metodo di @ amoeba per ottenere entrambe le intercettazioni casuali nello stesso modello montato in modo da poterle confrontare con questa funzione. Sono anche un po 'incerto sulla validità del metodo.
Patrick S. Forscher,

5

Un modo relativamente semplice potrebbe essere quello di utilizzare i test del rapporto di verosimiglianza tramite anovacome descritto nelle lme4FAQ .

Iniziamo con un modello completo in cui le varianze non sono vincolate (ovvero, sono consentite due varianze diverse) e quindi adattiamo un modello vincolato in cui si presume che le due varianze siano uguali. Li confrontiamo semplicemente con anova()(nota che ho impostato REML = FALSEanche se REML = TRUEcon anova(..., refit = FALSE)è completamente fattibile ).

m_full <- lmer(sim_1 ~ condition + (condition | participant_id), data=d, REML = FALSE)
summary(m_full)$varcor
 # Groups         Name                  Std.Dev. Corr  
 # participant_id (Intercept)           0.48741        
 #                conditionexperimental 0.26468  -0.419
 # Residual                             1.02677     

m_red <- lmer(sim_1 ~ condition + (1 | participant_id), data=d, REML = FALSE)
summary(m_red)$varcor
 # Groups         Name        Std.Dev.
 # participant_id (Intercept) 0.44734 
 # Residual                   1.03571 

anova(m_full, m_red)
# Data: d
# Models:
# m_red: sim_1 ~ condition + (1 | participant_id)
# m_full: sim_1 ~ condition + (condition | participant_id)
#        Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
# m_red   4 2396.6 2415.3 -1194.3   2388.6                         
# m_full  6 2398.7 2426.8 -1193.3   2386.7 1.9037      2      0.386

Tuttavia, questo test è probabilmente conservativo . Ad esempio, la FAQ dice:

Tenere presente che i test di ipotesi null basati su LRT sono conservativi quando il valore null (come σ2 = 0) si trova al limite dello spazio possibile; nel caso più semplice (varianza a singolo effetto casuale), il valore p è circa il doppio di quello che dovrebbe essere (Pinheiro e Bates 2000).

Esistono diverse alternative:

  1. Creare una distribuzione di prova appropriata, che di solito consiste in una miscela di χ2distribuzioni. Vedi ad esempio,
    Self, SG, & Liang, K.-Y. (1987). Proprietà asintotiche degli stimatori della massima verosimiglianza e test del rapporto di verosimiglianza in condizioni non standard. Journal of American Statistical Association, 82 (398), 605. https://doi.org/10.2307/2289471 Tuttavia, questo è abbastanza complicato.

  2. Simula la corretta distribuzione usando RLRsim(come descritto anche nelle FAQ).

Dimostrerò la seconda opzione di seguito:

library("RLRsim")
## reparametrize model so we can get one parameter that we want to be zero:
afex::set_sum_contrasts() ## warning, changes contrasts globally
d <- cbind(d, difference = model.matrix(~condition, d)[,"condition1"])

m_full2 <- lmer(sim_1 ~ condition + (difference | participant_id), data=d, REML = FALSE)
all.equal(deviance(m_full), deviance(m_full2))  ## both full models are identical

## however, we need the full model without correlation!
m_full2b <- lmer(sim_1 ~ condition + (1| participant_id) + 
                   (0 + difference | participant_id), data=d, REML = FALSE)
summary(m_full2b)$varcor
 # Groups           Name        Std.Dev.
 # participant_id   (Intercept) 0.44837 
 # participant_id.1 difference  0.13234 
 # Residual                     1.02677 

## model that only has random effect to be tested
m_red <- update(m_full2b,  . ~ . - (1 | participant_id), data=d, REML = FALSE)
summary(m_red)$varcor
 # Groups         Name       Std.Dev.
 # participant_id difference 0.083262
 # Residual                  1.125116

## Null model 
m_null <- update(m_full2b,  . ~ . - (0 + difference | participant_id), data=d, REML = FALSE)
summary(m_null)$varcor
 # Groups         Name        Std.Dev.
 # participant_id (Intercept) 0.44734 
 # Residual                   1.03571 

exactRLRT(m_red, m_full2b, m_null)
# Using restricted likelihood evaluated at ML estimators.
# Refit with method="REML" for exact results.
# 
#   simulated finite sample distribution of RLRT.
#   
#   (p-value based on 10000 simulated values)
# 
# data:  
# RLRT = 1.9698, p-value = 0.0719

Come possiamo vedere, l'output suggerisce che con REML = TRUEnoi avremmo ottenuto risultati esatti. Ma questo è lasciato come esercizio al lettore.

Per quanto riguarda il bonus, non sono sicuro che RLRsimconsenta il test simultaneo di più componenti, ma in tal caso, ciò può essere fatto allo stesso modo.


Risposta al commento:

Quindi è vero, quindi, che in generale la pendenza casuale θX consente l'intercettazione casuale θ0 variare tra i livelli di X?

Non sono sicuro che questa domanda possa ricevere una risposta ragionevole.

  • Un'intercettazione casuale consente una differenza idiosincratica nel livello complessivo per ciascun livello del fattore di raggruppamento. Ad esempio, se la variabile dipendente è il tempo di risposta, alcuni partecipanti sono più veloci e altri più lenti.
  • Una pendenza casuale consente a ciascun livello del fattore di raggruppamento un effetto idiosincratico del fattore per il quale sono stimate le pendenze casuali. Ad esempio, se il fattore è congruenza, alcuni partecipanti possono avere un effetto di congruenza maggiore rispetto ad altri.

Quindi le pendenze casuali influenzano l'intercettazione casuale? In un certo senso ciò potrebbe avere senso, poiché consentono a ciascun livello del fattore di raggruppamento un effetto completamente idiosincratico per ogni condizione. Alla fine, stimiamo due parametri idiosincratici per due condizioni. Tuttavia, penso che la distinzione tra il livello complessivo catturato dall'intercettazione e l'effetto specifico della condizione acquisito dalla pendenza casuale sia importante e quindi la pendenza casuale non può davvero influenzare l'intercettazione casuale. Tuttavia, consente comunque a ciascun livello del fattore di raggruppamento un idiosincratico separatamente per ogni livello della condizione.

Tuttavia, il mio test fa ancora quello che vuole la domanda originale. Verifica se la differenza nelle varianze tra le due condizioni è zero. Se è zero, le varianze in entrambe le condizioni sono uguali. In altre parole, solo se non è necessaria una pendenza casuale, la varianza in entrambe le condizioni è identica. Spero che abbia un senso.


1
Si utilizzano contrasti di trattamento ( contr.treatment) per i quali la condizione di controllo è il riferimento (ovvero, per i quali viene calcolata l'intercetta casuale). La parametrizzazione che propongo uso contrasti di somma (cioè, contr.sum) e l'intercettazione è la media. Sento che ha più senso verificare se la differenza è nulla quando l'intercettazione è la media maggiore invece della condizione di controllo (ma scriverlo fatto suggerisce che potrebbe essere relativamente insignificante). Si consiglia di leggere le pagine 24-26 di: singmann.org/download/publications/…
Henrik

1
Grazie! Le mie domande sono leggermente diverse, tuttavia: (1) La tua risposta sembra implicare che la mia domanda si riduce a "è la pendenza casuale per condizione diversa da 0". È vero? (2) Se la risposta a (1) è "sì", ciò suggerisce un'altra interpretazione della pendenza casuale per condition: consente all'intercetta casuale di variare tra i livelli di condition. È vero?
Patrick S. Forscher,

2
Il mio 2 ¢: il controesempio di @amoeba alla procedura proposta da Henrik è corretto. Henrik ha quasi ragione, ma confronta la coppia sbagliata di modelli. Il confronto tra i modelli che la domanda di risposta di Patrick è il confronto tra i modelli Henrik chiamato m_fullvs. m_full2b. Cioè: le varianze delle risposte medie condizionali dei partecipanti in A vs. B sono disuguali se la correlazione casuale tra intercetta e pendenza è diversa da zero , soprattutto sotto la parametrizzazione della codifica del contrasto somma-zero . Non è necessario testare la varianza di pendenza casuale. Sto cercando di pensare a come spiegarlo in modo succinto ...
Jake Westfall,

2
Questa non è davvero una spiegazione corretta, ma studiare la mia risposta qui può far luce sulla questione. Fondamentalmente, il parametro di correlazione controlla se le linee di regressione del partecipante "fan out to right" (correzione positiva) o "fan out to left" (correzione negativa). Entrambe queste implicano una disparità di disparità nelle risposte medie condizionali dei partecipanti. La codifica somma-zero quindi assicura che stiamo cercando la correlazione nel punto giusto su X
Jake Westfall

2
Prenderò in considerazione l'invio di una risposta con foto se riesco a trovare il tempo ...
Jake Westfall,

5

Il tuo modello

m = lmer(sim_1 ~ condition + (condition | participant_id), data=d)

consente già che la varianza tra soggetti nella condizione di controllo differisca dalla varianza tra soggetti nella condizione sperimentale. Ciò può essere reso più esplicito da una parametrizzazione equivalente:

m = lmer(sim_1 ~ 0 + condition + (0 + condition | participant_id), data=d)

La matrice di covarianza casuale ora ha un'interpretazione più semplice:

Random effects:
 Groups         Name                  Variance Std.Dev. Corr
 participant_id conditioncontrol      0.2464   0.4963       
                conditionexperimental 0.2074   0.4554   0.83

Qui le due varianze sono precisamente le due varianze che ti interessano: la varianza [tra soggetti] delle risposte medie condizionali nella condizione di controllo e la stessa nella condizione sperimentale. Nel set di dati simulato, sono 0,25 e 0,21. La differenza è data da

delta = as.data.frame(VarCorr(m))[1,4] - as.data.frame(VarCorr(m))[2,4]

ed è uguale a 0,039. Vuoi verificare se è significativamente diverso da zero.

EDIT: mi sono reso conto che il test di permutazione che descrivo di seguito non è corretto; non funzionerà come previsto se i mezzi in condizioni controllo / sperimentali non sono gli stessi (perché quindi le osservazioni non sono scambiabili con il valore null). Potrebbe essere una buona idea avviare bootstrap (o soggetti / oggetti nel caso Bonus) e ottenere l'intervallo di confidenza perdelta .

Proverò a riparare il codice qui sotto per farlo.


Suggerimento basato sulla permutazione originale (errato)

Trovo spesso che uno può salvarsi un sacco di problemi facendo un test di permutazione. In effetti, in questo caso è molto semplice da configurare. Permettiamo condizioni di controllo / sperimentali per ogni soggetto separatamente; allora qualsiasi differenza nelle variazioni dovrebbe essere eliminata. Ripetendolo più volte si otterrà la distribuzione nulla per le differenze.

(Non programma in R; tutti non esitate a riscrivere quanto segue in uno stile R migliore.)

set.seed(42)
nrep = 100
v = matrix(nrow=nrep, ncol=1)
for (i in 1:nrep)
{
   dp = d
   for (s in unique(d$participant_id)){             
     if (rbinom(1,1,.5)==1){
       dp[p$participant_id==s & d$condition=='control',]$condition = 'experimental'
       dp[p$participant_id==s & d$condition=='experimental',]$condition = 'control'
     }
   }
  m <- lmer(sim_1 ~ 0 + condition + (0 + condition | participant_id), data=dp)
  v[i,] = as.data.frame(VarCorr(m))[1,4] - as.data.frame(VarCorr(m))[2,4]
}
pvalue = sum(abs(v) >= abs(delta)) / nrep

L'esecuzione di questo produce il valore p p=0.7. Si può aumentare nrepa circa 1000.

Esattamente la stessa logica può essere applicata nel tuo caso Bonus.


Super interessante, grazie! Dovrò pensare di più al motivo per cui la tua riparameterizzazione funziona, poiché questa sembra essere la chiave di lettura di questa risposta.
Patrick S. Forscher,

Stranamente, i valori di intercettazione per gruppo nella tua risposta sembrano differire da quelli nella risposta di @MartijnWeterings.
Patrick S. Forscher,

@ PatrickS.Forscher Questo perché, credo, genera un set di dati diverso. Posso usare la sim_1 ~ 0 + condition + (0 + dummy(condition, "control") + dummy(condition, "experimental") | participant_id)formulazione e ottenere lo stesso risultato della mia risposta.
ameba dice di reintegrare Monica il

1
@ PatrickS.Forscher No, ho usato i dati generati dal tuo codice (con il tuo seme). Ho impostato il seme su 42 solo durante l'esecuzione del test di permutazione. È Martijn che ha cambiato il set di dati, non io.
ameba dice di reintegrare Monica il

1
Questa proposta è decisamente valida. Come penso che tu abbia già sperimentato, l'impostazione dei test di permutazione per i dati multilivello non è del tutto semplice. Un approccio simile che sarebbe un po 'più semplice da implementare sarebbe il bootstrap parametrico, che è piuttosto semplice da fare con lme4 usando il metodo simulate () degli oggetti lmer montati, cioè, chiama simulate (m) molte volte per costruire il bootstrap distribuzione. Solo un'idea con cui giocare.
Jake Westfall,

0

Guardando questo problema da una prospettiva leggermente diversa e partendo dalla forma "generale" del modello misto lineare, abbiamo

yiojK=μ+αj+dioj+eiojK,dio~N(0,Σ),eiojK~N(0,σ2)
dove αj è l'effetto fisso di j'condizione e dio=(dio1,...,dioJ) è un vettore casuale (alcuni lo chiamano effetto casuale con valori vettoriali, penso) per il ioil partecipante al j'condizione.
Nel tuo esempio abbiamo due condizioniyio1K e yio2K che indicherò come UN e Bin ciò che segue. Quindi la matrice di covarianza del vettore casuale bidimensionaledio è di forma generale

Σ=[σUN2σUNBσUNBσB2]

con non negativo σUN2 e σB2.

Vediamo prima come la versione parametrizzata di Σ guarda quando usiamo i contrasti di somma.

La varianza dell'intercetta, che corrisponde alla media grande, è

σ12: =Var (gran media)=Var(12(UN+B))=14(Var(UN)+Var(B)+2Cov(UN,B)).

La varianza del contrasto è

σ22: =Var (contrasto)=Var(12(UN-B))=14(Var(UN)+Var(B)-2Cov(UN,B)).

And the covariance between the intercept and the contrast is

σ12:=Cov(grand mean, contrast)=Cov(12(A+B),12(AB))=14(Var(A)Var(B)).

Thus, the re-parameterized Σ is

Σ=[σ12+σ22+2σ12σ12σ22σ12σ22σ12+σ222σ12]=[σA2σABσABσB2].

Σ can be decomposed into

Σ=[σ12σ12σ12σ12]+[σ22σ22σ22σ22]+2[σ1200σ12].

Setting the covariance parameter σ12 to zero we get

Σ=[σ12σ12σ12σ12]+[σ22σ22σ22σ22]=[σ12+σ22σ12σ22σ12σ22σ12+σ22]

which, as @Jake Westfall derived slightly differently, tests the hypothesis of equal variances when we compare a model without this covariance parameter to a model where the covariance parameter is still included/not set to zero.

Notably, introducing another crossed random grouping factor (such as stimuli) does not change the model comparison that has to be done, i.e., anova(mod1, mod2) (optionally with the argument refit = FALSE when you use REML estimation) where mod1 and mod2 are defined as @Jake Westfall did.

Taking out σ12 and the variance component for the contrast σ22 (what @Henrik suggests) results in

Σ=[σ12σ12σ12σ12]

which tests the hypothesis that the variances in the two conditions are equal and that they are equal to the (positive) covariance between the two conditions.


When we have two conditions, a model that fits a covariance matrix with two parameters in a (positive) compound symmetric structure can also be written as

# code snippet from Jake Westfall
d$contrast <- 2*(d$condition == 'experimental') - 1

# new model
mod3 <- lmer(sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id), 
             data = d, REML = FALSE) 

or (using the categorical variable/factor condition)

mod4 <- lmer(sim_1 ~ condition + (1 | participant_id) + (1 | condition:participant_id), 
             data = d, REML = FALSE)

with

Σ=[σ12+σ22σ12σ12σ12+σ22]=[σ12σ12σ12σ12]+[σ2200σ22]

where σ12 and σ22 are the variance parameters for the participant and the participant-condition-combination intercepts, respectively. Note that this Σ has a non-negative covariance parameter.

Below we see that mod1, mod3, and mod4 yield equivalent fits:

# code snippet from Jake Westfall
d$contrast <- 2*(d$condition == 'experimental') - 1

mod1 <- lmer(sim_1 ~ contrast + (contrast || participant_id),
             data = d, REML = FALSE)

mod2 <- lmer(sim_1 ~ contrast + (contrast | participant_id),
             data = d, REML = FALSE)

# new models 
mod3 <- lmer(sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id), 
             data = d, REML = FALSE) 

mod4 <- lmer(sim_1 ~ condition + (1 | participant_id) + (1 | condition:participant_id), 
             data = d, REML = FALSE)

anova(mod3, mod1)
# Data: d
# Models:
# mod3: sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id)
# mod1: sim_1 ~ contrast + ((1 | participant_id) + (0 + contrast | participant_id))
#      Df    AIC    BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
# mod3  5 2396.9 2420.3 -1193.5   2386.9                        
# mod1  5 2396.9 2420.3 -1193.5   2386.9     0      0          1

anova(mod4, mod3)
# Data: d
# Models:
# mod4: sim_1 ~ condition + (1 | participant_id) + (1 | condition:participant_id)
# mod3: sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id)
#      Df    AIC    BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
# mod4  5 2396.9 2420.3 -1193.5   2386.9                        
# mod3  5 2396.9 2420.3 -1193.5   2386.9     0      0          1

With treatment contrasts (the default in R) the re-parameterized Σ is

Σ=[σ12σ12+σ12σ12+σ12σ12+σ22+2σ12]=[σ12σ12σ12σ12]+[000σ22]+[0σ12σ122σ12]

where σ12 is the variance parameter for the intercept (condition A), σ22 the variance parameter for the contrast (AB), and σ12 the corresponding covariance parameter.

We can see that neither setting σ12 to zero nor setting σ22 to zero tests (only) the hypothesis of equal variances.

However, as shown above, we can still use mod4 to test the hypothesis as changing the contrasts has no impact on the parameterization of Σ for this model.

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.