Come ottenere il valore p (verifica la significatività) di un effetto in un modello misto lme4?


56

Uso lme4 in R per adattarmi al modello misto

lmer(value~status+(1|experiment)))

dove il valore è continuo, lo stato e l'esperimento sono fattori e ottengo

Linear mixed model fit by REML 
Formula: value ~ status + (1 | experiment) 
  AIC   BIC logLik deviance REMLdev
 29.1 46.98 -9.548    5.911    19.1
Random effects:
 Groups     Name        Variance Std.Dev.
 experiment (Intercept) 0.065526 0.25598 
 Residual               0.053029 0.23028 
Number of obs: 264, groups: experiment, 10

Fixed effects:
            Estimate Std. Error t value
(Intercept)  2.78004    0.08448   32.91
statusD      0.20493    0.03389    6.05
statusR      0.88690    0.03583   24.76

Correlation of Fixed Effects:
        (Intr) statsD
statusD -0.204       
statusR -0.193  0.476

Come posso sapere che l'effetto dello status è significativo? R riporta solo valori- e non valori- .tp


1
Andando dalle risposte fornite a questa domanda, ci si chiede in che cosa effettivamente OP è interessata qui: coefficienti test contro un valore nullo (vaniglia -test si fa in una regolare regressione lineare contro un null ) o test per minimizzare la varianza (il test che otteniamo dai molti tipi di ANOVA). Quei due mirano a cose diverse. Una risposta illuminante, sebbene non relativa ai modelli a effetti misti, si trova qui . H 0 : β = β null FtH0:β=βnullF
Firebug

Risposte:


61

Ci sono molte informazioni su questo argomento nelle FAQ GLMM . Tuttavia, nel tuo caso particolare, suggerirei di utilizzare

library(nlme)
m1 <- lme(value~status,random=~1|experiment,data=mydata)
anova(m1)

perché non hai bisogno di nessuna delle cose che lmeroffre (maggiore velocità, gestione degli effetti casuali incrociati, GLMM ...). lmedovrebbe darvi esattamente le stesse stime dei coefficienti e la varianza, ma anche df calcolo e p-value per voi (che fanno senso in un "classico" progettare come voi sembrano avere). Puoi anche prendere in considerazione il termine casuale ~status|experiment(consentendo la variazione degli effetti di stato tra i blocchi o includendo equivalentemente un'interazione stato per esperimento). I poster sopra riportati sono anche corretti sul fatto che le tue tstatistiche sono così grandi che il tuo valore p sarà sicuramente <0,05, ma posso immaginare che vorresti valori p "reali".


3
Non conosco questa risposta. lmerpotrebbe riportare altrettanto facilmente gli stessi tipi di valori p ma non per validi motivi. Immagino sia il commento che qui ci sono valori "reali" che mi danno fastidio. Si potrebbe sostenere che è possibile trovare un possibile limite e che viene superato qualsiasi limite ragionevole. Ma non puoi obiettare che esiste un vero valore p.
Giovanni,

11
Per un design classico (bilanciato, nidificato, ecc.) Penso di poter effettivamente sostenere che esiste un vero valore p, vale a dire una probabilità di ottenere una stima di beta di una grandezza osservata o maggiore se l'ipotesi nulla (beta = 0) erano falsi ... lme4 non fornisce questi denominatori df, credo, perché è più difficile rilevare in generale da una struttura del modello lme4 quando il modello specificato è uno in cui funzionerebbe qualche euristica per calcolare un denominatore classico df ...
Ben Bolker,

prova summary(m1)invece (lo uso con il pacchetto nlme)
jena,

36

È possibile utilizzare il pacchetto lmerTest . Basta installarlo / caricarlo e i modelli lmer si estendono. Quindi ad es

library(lmerTest)
lmm <- lmer(value~status+(1|experiment)))
summary(lmm)
anova(lmm)

ti darebbe risultati con valori p. Se i valori p sono la giusta indicazione è un po 'contestata, ma se vuoi averli, questo è il modo per ottenerli.


28

Se riesci a gestire l'abbandono dei valori p ( e dovresti ), puoi calcolare un rapporto di probabilità che rappresenterebbe il peso delle prove per l'effetto dello stato tramite:

#compute a model where the effect of status is estimated
unrestricted_fit = lmer(
    formula = value ~ (1|experiment) + status
    , REML = F #because we want to compare models on likelihood
)
#next, compute a model where the effect of status is not estimated
restricted_fit = lmer(
    formula = value ~ (1|experiment)
    , REML = F #because we want to compare models on likelihood
)
#compute the AIC-corrected log-base-2 likelihood ratio (a.k.a. "bits" of evidence)
(AIC(restricted_fit)-AIC(unrestricted_fit))*log2(exp(1))

16
Si noti che i rapporti di probabilità sono asintotici, cioè non tengono conto dell'incertezza nella stima della varianza residua ...
Ben Bolker,

5
Sono interessato alla tua ultima riga. Qual è l'interpretazione del risultato? Ci sono fonti a cui posso dare un'occhiata?
mguzmann,

13

Il problema è che il calcolo dei valori di p per questi modelli non è banale, vedi dicussion qui quindi gli autori del lme4pacchetto hanno volutamente scelto di non includere i valori di p nell'output. Potresti trovare un metodo per calcolarli, ma non saranno necessariamente corretti.


9

Considera cosa stai chiedendo. Se vuoi solo sapere se il valore p complessivo per l'effetto dello stato passa una sorta di valore di interruzione arbitrario, come 0,05, allora è facile. Innanzitutto, vuoi scoprire l'effetto complessivo. Potresti ottenerlo da anova.

m <- lmer(...) #just run your lmer command but save the model
anova(m)

Ora hai un valore F. Puoi prenderlo e cercarlo in alcune tabelle F. Basta scegliere il denom più basso possibile. gradi di libertà. Il limite ci sarà intorno a 20. La tua F potrebbe essere più grande di così, ma potrei sbagliarmi. Anche se non lo è, guarda qui il numero di gradi di libertà rispetto a un calcolo ANOVA convenzionale usando il numero di esperimenti che hai. Attaccando quel valore in sei fino a circa 5 per un taglio. Ora lo passi facilmente nel tuo studio. Il "vero" df per il tuo modello sarà qualcosa di più alto di quello perché stai modellando ogni punto di dati invece di valori aggregati che un ANOVA modellerebbe.

Se in realtà si desidera un valore p esatto non esiste una cosa del genere a meno che non si sia disposti a fare una dichiarazione teorica al riguardo. Se leggi Pinheiro & Bates (2001, e forse qualche altro libro sull'argomento ... vedi altri link in queste risposte) e vieni fuori con un argomento per un df specifico, allora potresti usarlo. Ma in realtà non stai cercando un valore p esatto. Ne parlo perché non dovresti quindi segnalare un valore p esatto, ma solo che il tuo cutoff è passato.

Dovresti davvero prendere in considerazione la risposta di Mike Lawrence perché l'intera idea di limitarsi a un punto di passaggio per i valori p come le informazioni finali e più importanti da estrarre dai tuoi dati è generalmente sbagliata (ma potrebbe non essere nel tuo caso poiché non non ho davvero abbastanza informazioni per sapere). Mike sta usando una versione per animali del calcolo di LR che è interessante, ma potrebbe essere difficile trovare molta documentazione su di esso. Se si esamina la selezione e l'interpretazione del modello utilizzando AIC, potrebbe piacerti.


9

Modifica: questo metodo non è più supportato nelle versioni più recenti di lme4. Utilizzare il pacchetto lmerTest come suggerito in questa risposta da pbx101 .

C'è un post nella lista R dell'autore di lme4 sul perché i valori p non vengono visualizzati. Suggerisce invece di usare campioni MCMC, che si fa usando pvals.fnc dal pacchetto languageR:

library("lme4")
library("languageR")
model=lmer(...)
pvals.fnc(model)

Vedi http://www2.hawaii.edu/~kdrager/MixedEffectsModels.pdf per un esempio e dettagli.


3
lme4 non lo supporta più. Questo post potrebbe essere aggiornato per risparmiare alle persone che devono scoprirlo come ho appena fatto.
timothy.s.lau

5

Sei interessato a sapere se l'effetto combinato di statusha un effetto significativo su value? In tal caso, è possibile utilizzare la Anovafunzione nel carpacchetto (da non confondere con la anovafunzione nella base R).

dat <- data.frame(
  experiment = sample(c("A","B","C","D"), 264, replace=TRUE), 
  status = sample(c("D","R","A"), 264, replace=TRUE), 
  value = runif(264)   
)
require(lme4)
(fm <- lmer(value~status+(1|experiment), data=dat))

require(car)
Anova(fm)

Dai un'occhiata ?Anovadopo aver caricato il carpacchetto.


Qualche idea su come car::Anova()evitare le problematiche appiccicose relative al calcolo dei valori p che Michelle collega?
Mike Lawrence,

Non lo so, ma la mia ipotesi è che eviti i problemi appiccicosi ignorandoli! Avendo riletto il post originale, sento che avrei potuto fraintendere la domanda. Se l'OP vuole valori p esatti per i parametri degli effetti fissi, è nei guai. Ma se l'OP vuole solo sapere se sono significativi, penso che i valori t siano maggiori di qualsiasi incertezza nel modo in cui verrà calcolato il valore p esatto. (In altre parole, sono significativi.)
smillig

1
Penso che sia stata sicuramente una buona idea reindirizzare a un calcolo ANOVA per scoprire l'effetto complessivo delle statistiche, ma non sono sicuro che la fine dei valori p sia buona. Il anovacomando regolare ti darà F.
Giovanni,

Penso che questo sia un po 'più appiccicoso che apparente. L'esecuzione di ANOVA è valida quando si desidera ridurre al minimo la varianza, ma dalla formulazione della domanda penso che OP voglia stabilire l'effetto marginale delle variabili, ovvero testare i coefficienti contro un valore nullo.
Firebug

0

La funzione pvals.fncnon è più supportata da lme4. Utilizzando il pacchetto lmerTest, è possibile utilizzare un altro metodo per calcolare il valore p, come le approssimazioni di Kenward-Roger

model=lmer(value~status+1|experiment)
anova(model, ddf="Kenward-Roger")

0

Il semplice caricamento del pacchetto afex stamperà i valori p nell'output della funzione lmer dal pacchetto lme4 (non è necessario utilizzare afex; basta caricarlo):

library(lme4)  #for mixed model
library(afex)  #for p-values

Ciò aggiungerà automaticamente una colonna di valore p all'output di lmer (il tuo modello) per gli effetti fissi.

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.