Quanto sono affidabili gli intervalli di confidenza per gli oggetti lmer attraverso il pacchetto effetti?


36

EffectsIl pacchetto fornisce un modo molto veloce e conveniente per tracciare risultati di modelli a effetto misto lineare ottenuti attraverso il lme4pacchetto . La effectfunzione calcola gli intervalli di confidenza (IC) molto rapidamente, ma quanto sono affidabili questi intervalli di confidenza?

Per esempio:

library(lme4)
library(effects)
library(ggplot)

data(Pastes)

fm1  <- lmer(strength ~ batch + (1 | cask), Pastes)
effs <- as.data.frame(effect(c("batch"), fm1))
ggplot(effs, aes(x = batch, y = fit, ymin = lower, ymax = upper)) + 
  geom_rect(xmax = Inf, xmin = -Inf, ymin = effs[effs$batch == "A", "lower"],
        ymax = effs[effs$batch == "A", "upper"], alpha = 0.5, fill = "grey") +
  geom_errorbar(width = 0.2) + geom_point() + theme_bw()

inserisci qui la descrizione dell'immagine

Secondo gli elementi della configurazione calcolati utilizzando il effectspacchetto, il batch "E" non si sovrappone al batch "A".

Se provo lo stesso usando la confint.merModfunzione e il metodo predefinito:

a <- fixef(fm1)
b <- confint(fm1)
# Computing profile confidence intervals ...
# There were 26 warnings (use warnings() to see them)

b <- data.frame(b)
b <- b[-1:-2,]

b1 <- b[[1]]
b2 <- b[[2]]

dt <- data.frame(fit   = c(a[1],  a[1] + a[2:length(a)]), 
                 lower = c(b1[1],  b1[1] + b1[2:length(b1)]), 
                 upper = c(b2[1],  b2[1] + b2[2:length(b2)]) )
dt$batch <- LETTERS[1:nrow(dt)]

ggplot(dt, aes(x = batch, y = fit, ymin = lower, ymax = upper)) +
  geom_rect(xmax = Inf, xmin = -Inf, ymin = dt[dt$batch == "A", "lower"], 
        ymax = dt[dt$batch == "A", "upper"], alpha = 0.5, fill = "grey") + 
  geom_errorbar(width = 0.2) + geom_point() + theme_bw()

inserisci qui la descrizione dell'immagine

Vedo che tutti gli elementi della configurazione si sovrappongono. Ricevo anche avvisi che indicano che la funzione non è riuscita a calcolare elementi della configurazione attendibili. Questo esempio, e il mio set di dati effettivo, mi fa sospettare che il effectspacchetto abbia scorciatoie nel calcolo dell'IC che potrebbero non essere completamente approvate dagli statistici. Quanto sono affidabili gli elementi della configurazione restituiti dalla effectfunzione dal effectspacchetto per gli lmeroggetti?

Cosa ho provato: esaminando il codice sorgente, ho notato che la effectfunzione si basa sulla Effect.merModfunzione, che a sua volta si dirige verso la Effect.merfunzione, che assomiglia a questo:

effects:::Effect.mer
function (focal.predictors, mod, ...) 
{
    result <- Effect(focal.predictors, mer.to.glm(mod), ...)
    result$formula <- as.formula(formula(mod))
    result
}
<environment: namespace:effects>

mer.to.glmla funzione sembra calcolare la matrice varianza-covariata lmerdall'oggetto:

effects:::mer.to.glm

function (mod) 
{
...
mod2$vcov <- as.matrix(vcov(mod))
...
mod2
}

Questo, a sua volta, è probabilmente utilizzato nella Effect.defaultfunzione per calcolare gli elementi della configurazione (potrei aver frainteso questa parte):

effects:::Effect.default
...
     z <- qnorm(1 - (1 - confidence.level)/2)
        V <- vcov.(mod)
        eff.vcov <- mod.matrix %*% V %*% t(mod.matrix)
        rownames(eff.vcov) <- colnames(eff.vcov) <- NULL
        var <- diag(eff.vcov)
        result$vcov <- eff.vcov
        result$se <- sqrt(var)
        result$lower <- effect - z * result$se
        result$upper <- effect + z * result$se
...

Non conosco abbastanza gli LMM per giudicare se si tratta di un approccio corretto, ma considerando la discussione sul calcolo dell'intervallo di confidenza per gli LMM, questo approccio appare sospettosamente semplice.


1
Quando hai lunghe righe di codice, lo apprezzerei molto se le dividi in più righe, quindi non dobbiamo scorrere per vedere tutto.
rvl

1
@rvl Il codice dovrebbe essere più leggibile ora.
Mikko,

Risposte:


52

Tutti i risultati sono essenzialmente gli stessi ( per questo esempio particolare ). Alcune differenze teoriche sono:

  • come sottolinea @rvl, la tua ricostruzione di EC senza tener conto della covarianza tra i parametri è semplicemente sbagliata (scusa)
  • intervalli di confidenza per parametri possono essere basati su intervalli di confidenza Wald (ipotizzando una superficie verosimiglianza quadratica): lsmeans, effects, confint(.,method="Wald"); fatta eccezione per lsmeans, questi metodi ignorano gli effetti di dimensioni finite ("gradi di libertà"), ma in questo caso fa appena alcuna differenza ( df=40è praticamente indistinguibile dall'infinito df)
  • ... o su intervalli di confidenza del profilo (il metodo predefinito; ignora gli effetti di dimensioni finite ma consente superfici non quadratiche)
  • ... o sul bootstrap parametrico (il gold standard - presuppone che il modello sia corretto [le risposte sono normali, gli effetti casuali sono distribuiti normalmente, i dati sono condizionatamente indipendenti, ecc.], ma per il resto fanno poche ipotesi)

Penso che tutti questi approcci siano ragionevoli (alcuni sono più approssimativi di altri), ma in questo caso a malapena fa alcuna differenza quale si utilizza. Se sei preoccupato, prova diversi metodi contrastanti sui tuoi dati o su dati simulati che assomigliano ai tuoi, e vedi cosa succede ...

(PS: Non darei troppo peso al fatto che gli intervalli di confidenza di Ae Enon si sovrappongano. Dovresti fare una corretta procedura di confronto a coppie per fare inferenze affidabili sulle differenze tra questa particolare coppia di stime. ..)

IC al 95%:

inserisci qui la descrizione dell'immagine

Codice di confronto:

library(lme4)
fm2 <- lmer(strength ~ batch - 1 + (1 | cask), Pastes)
c0 <- confint(fm2,method="Wald")
c1 <- confint(fm2)
c2 <- confint(fm2,method="boot")
library(effects)
library(lsmeans)
c3 <- with(effect("batch",fm2),cbind(lower,upper))
c4 <- with(summary(lsmeans(fm2,spec="batch")),cbind(lower.CL,upper.CL))
tmpf <- function(method,val) {
    data.frame(method=method,
               v=LETTERS[1:10],
               setNames(as.data.frame(tail(val,10)),
                        c("lwr","upr")))
}
library(ggplot2); theme_set(theme_bw())
allCI <- rbind(tmpf("lme4_wald",c0),
      tmpf("lme4_prof",c1),
      tmpf("lme4_boot",c2),
      tmpf("effects",c3),
               tmpf("lsmeans",c4))
ggplot(allCI,aes(v,ymin=lwr,ymax=upr,colour=method))+
    geom_linerange(position=position_dodge(width=0.8))

ggsave("pastes_confint.png",width=10)

2
Accetto questa risposta in quanto è giusto al punto e offre un bel confronto tra diversi metodi. Tuttavia, controlla l'eccellente risposta di rlv per ulteriori informazioni.
Mikko,

Grazie per la risposta eccellente e molto utile. Comprendo correttamente che non è possibile utilizzare gli elementi della configurazione per confrontare gruppi / batch, ma è possibile confrontare gli effetti. Diciamo che ho avuto due trattamenti, diversi individui e diverse misurazioni all'interno degli individui. Vorrei usare gli individui come effetto casuale poiché ognuno di essi conterrebbe x misurazioni. Quindi volevo sapere se questi due trattamenti hanno prodotto una risposta diversa. effectsIn questo caso è possibile utilizzare la sovrapposizione di pacchetto e CI?
Mikko,

5
Questa è una domanda più generale che è rilevante per qualsiasi approccio basato su modelli standard. Potrebbe valere una domanda separata. (1) In generale, il modo in cui si rispondono alle domande sulle differenze tra i trattamenti consiste nell'impostare il modello in modo che la differenza tra i trattamenti focali sia un contrasto (cioè un parametro stimato) nel modello e quindi per calcolare un valore p oppure verifica se gli intervalli di confidenza a un determinato livello alfa includono zero. (continua)
Ben Bolker,

4
(2) I CI sovrapposti sono nella migliore delle ipotesi un criterio conservativo e approssimativo per le differenze tra i parametri (ci sono diversi articoli pubblicati su questo argomento). (3) Esiste un problema separato / ortogonale con confronti a coppie, ovvero che si deve controllare appropriatamente la molteplicità e la non indipendenza dei confronti (questo può essere fatto, ad esempio, con i metodi nel multcomppacchetto, ma richiede almeno un un po 'di attenzione)
Ben Bolker,

1
Per cosa? Potresti voler fare una nuova domanda.
Ben Bolker,

20

Sembra che ciò che hai fatto nel secondo metodo sia calcolare gli intervalli di confidenza per i coefficienti di regressione, quindi trasformarli per ottenere elementi della configurazione per le previsioni. Ciò ignora le covarianze tra i coefficienti di regressione.

Prova ad adattare il modello senza un'intercettazione, in modo che gli batcheffetti siano effettivamente le previsioni e confintrestituiscano gli intervalli necessari.

Addendum 1

Ho fatto esattamente quello che ho suggerito sopra:

> fm2 <- lmer(strength ~ batch - 1 + (1 | cask), Pastes)
> confint(fm2)
Computing profile confidence intervals ...
           2.5 %    97.5 %
.sig01  0.000000  1.637468
.sigma  2.086385  3.007380
batchA 60.234772 64.298581
batchB 57.268105 61.331915
batchC 60.018105 64.081915
batchD 57.668105 61.731915
batchE 53.868105 57.931915
batchF 59.001439 63.065248
batchG 57.868105 61.931915
batchH 61.084772 65.148581
batchI 56.651439 60.715248
batchJ 56.551439 60.615248

Questi intervalli sembrano confondere con i risultati di effects.

Addendum 2

Un'altra alternativa è il pacchetto lsmeans . Ottiene gradi di libertà e una matrice di covarianza adattata dal pacchetto pbkrtest .

> library("lsmeans")
> lsmeans(fm1, "batch")
Loading required namespace: pbkrtest
 batch   lsmean       SE    df lower.CL upper.CL
 A     62.26667 1.125709 40.45 59.99232 64.54101
 B     59.30000 1.125709 40.45 57.02565 61.57435
 C     62.05000 1.125709 40.45 59.77565 64.32435
 D     59.70000 1.125709 40.45 57.42565 61.97435
 E     55.90000 1.125709 40.45 53.62565 58.17435
 F     61.03333 1.125709 40.45 58.75899 63.30768
 G     59.90000 1.125709 40.45 57.62565 62.17435
 H     63.11667 1.125709 40.45 60.84232 65.39101
 I     58.68333 1.125709 40.45 56.40899 60.95768
 J     58.58333 1.125709 40.45 56.30899 60.85768

Confidence level used: 0.95 

effecteffectconfint±1.96×SE non molto affidabili.

I risultati da effecte lsmeanssono simili, ma con una situazione multi-fattore sbilanciata, lsmeansper impostazione predefinita media su fattori non utilizzati con pesi uguali, mentre effectpesi per le frequenze osservate (disponibile come opzione in lsmeans).


Grazie per questa soluzione Gli intervalli sono ora più simili, sebbene non esattamente gli stessi. La tua risposta non risponde ancora alla domanda se gli elementi della configurazione dal effectspacchetto possono essere considerati affidabili per gli lmeroggetti. Sto pensando di utilizzare i risultati in una pubblicazione e voglio essere sicuro che gli EC siano calcolati utilizzando un metodo approvato per gli LMM.
Mikko,

Vorresti dire: nel tuo Addendum 1 i primi due parametri .sig01e .sigmaproduce da confint, sono questi intervalli di confidenza per la varianza ? o intervallo di confidenza della deviazione standard ?
ABC

Sono elementi della configurazione per qualunque parametro sia etichettato in quel modo nel modello. Dovresti consultare la documentazione lmerper una risposta definitiva. Tuttavia, le persone di solito usano notazioni come sigmafare riferimento a deviazioni standard e sigma.squareo sigma^2fare riferimento a variazioni.
rvl

È meglio usare lmertest, lsmeans o mertools?
skan
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.