Como obter o valor p (verificar a significância) de um efeito em um modelo misto lme4?

56

Eu uso lme4 em R para ajustar o modelo misto

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

onde o valor é contínuo, status e experimento são fatores, e eu entendo

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

Como posso saber que o efeito do status é significativo? R relata apenas valores e não valores p .tp

ECII
fonte
11
tH0:β=βnullF

Respostas:

61

Há muitas informações sobre esse tópico nas Perguntas frequentes do GLMM . No entanto, no seu caso particular, sugiro usar

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

porque você não precisa de nada do que lmeroferece (maior velocidade, manipulação de efeitos aleatórios cruzados, GLMMs ...). lmedeve dar-lhe exatamente as mesmas estimativas dos coeficientes e variância, mas também df computação e p-valores para você (que fazer faz sentido em um "clássico" de design, como você parece ter). Você também pode considerar o termo aleatório ~status|experiment(permitindo a variação dos efeitos de status entre os blocos ou incluindo equivalentemente uma interação status-por-experimento). Os pôsteres acima também estão corretos, pois suas testatísticas são tão grandes que seu valor-p será definitivamente <0,05, mas posso imaginar que você gostaria de valores-p "reais".

Ben Bolker
fonte
3
Eu não sei sobre esta resposta. lmerpoderia facilmente reportar os mesmos tipos de valores-p, mas não por razões válidas. Eu acho que é o comentário de que existem valores p "reais" aqui que me incomodam. Você pode argumentar que pode encontrar um possível corte e que qualquer corte razoável seja passado. Mas você não pode argumentar que existe um valor p real.
John
11
Para um design clássico (balanceado, aninhado etc.), acho que posso de fato argumentar que existe um p-vaue real, ou seja, uma probabilidade de obter uma estimativa de beta de magnitude observada ou maior se a hipótese nula (beta = 0) eram falsos ... o lme4 não fornece esses denominadores df, acredito, porque é mais difícil de detectar em geral a partir de uma estrutura de modelo lme4 quando o modelo especificado é aquele em que alguma heurística para calcular um denominador clássico df funcionaria ...
Ben Bolker
tente summary(m1)vez (eu uso isso com nlme pacote)
Jena
36

Você pode usar o pacote lmerTest . Você apenas instala / carrega e os modelos lmer são estendidos. Então por exemplo

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

daria resultados com valores-p. Se os valores de p são a indicação correta, é um pouco contestado, mas se você quiser tê-los, é esse o caminho para obtê-los.

pbx101
fonte
28

Se você conseguir lidar com o abandono de valores-p ( e deve ), poderá calcular uma taxa de probabilidade que represente o peso da evidência para o efeito do status via:

#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))
Mike Lawrence
fonte
16
Note-se que a razão de verossimilhança são assintótica, ou seja, não levam em conta a incerteza na estimativa da variância residual ...
Ben Bolker
5
Estou interessado na sua última linha. Qual é a interpretação do resultado? Existem fontes que eu possa dar uma olhada nisso?
Mguzmann 10/07
13

A questão é que o cálculo dos valores de p para esses modelos não é trivial; veja a discussão aqui para que os autores do lme4pacote tenham escolhido intencionalmente não incluir valores de p na saída. Você pode encontrar um método para calcular isso, mas eles não estarão necessariamente corretos.

Michelle
fonte
9

Considere o que você está perguntando. Se você quer apenas saber se o valor p geral para o efeito do status passa algum tipo de valor de corte arbitrário, como 0,05, é fácil. Primeiro, você deseja descobrir o efeito geral. Você poderia conseguir isso anova.

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

Agora você tem um valor F. Você pode pegar isso e procurar em algumas tabelas F. Basta escolher o menor valor possível. graus de liberdade. O ponto de corte será em torno de 20. Seu F pode ser maior que isso, mas eu posso estar errado. Mesmo que não seja, observe o número de graus de liberdade de um cálculo ANOVA convencional aqui usando o número de experimentos que você tem. Aderindo esse valor, você reduz para cerca de 5 por um ponto de corte. Agora você passa isso facilmente em seu estudo. O df 'true' para o seu modelo será algo mais alto do que isso, porque você está modelando todos os pontos de dados em oposição aos valores agregados que uma ANOVA modelaria.

Se você realmente deseja um valor p exato, não existe, a menos que esteja disposto a fazer uma afirmação teórica sobre isso. Se você ler Pinheiro & Bates (2001, e talvez mais alguns livros sobre o assunto ... veja outros links nessas respostas) e sair com um argumento para um df específico, poderá usá-lo. Mas na verdade você não está procurando um valor p exato. Menciono isso porque, portanto, você não deve relatar um valor p exato, apenas que seu ponto de corte é passado.

Você realmente deve considerar a resposta de Mike Lawrence, porque toda a ideia de apenas seguir um ponto de passagem para valores-p como a informação final e mais importante a ser extraída dos seus dados geralmente é equivocada (mas pode não estar no seu caso, pois não realmente tem informações suficientes para saber). Mike está usando uma versão de estimação do cálculo da LR que é interessante, mas pode ser difícil encontrar muita documentação. Se você observar a seleção e interpretação de modelos usando o AIC, poderá gostar.

John
fonte
9

Editar: este método não é mais suportado nas versões mais recentes do lme4. Use o pacote lmerTest conforme sugerido nesta resposta por pbx101 .

Há um post na lista R do autor do lme4, explicando por que os valores p não são exibidos. Ele sugere o uso de amostras do MCMC, que você usa usando o pvals.fnc do pacote languageR:

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

Consulte http://www2.hawaii.edu/~kdrager/MixedEffectsModels.pdf para obter um exemplo e detalhes.

Jeff
fonte
3
O lme4 não suporta mais isso. Este post pode ser atualizado para poupar as pessoas que precisam descobrir isso como eu fiz.
timothy.s.lau
5

Você está interessado em saber se o efeito combinado de statustem um efeito significativo value? Nesse caso, você pode usar a Anovafunção no carpacote (para não confundir com a anovafunção na 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)

Dê uma olhada ?Anovadepois de carregar o carpacote.

smillig
fonte
Alguma idéia de como car::Anova()evitar os problemas complicados que envolvem o cálculo de valores-p que Michelle vincula?
Mike Lawrence
Não, mas meu palpite é que evita os problemas complicados ao ignorá-los! Depois de reler o post original, sinto que posso ter entendido mal a pergunta. Se o OP deseja valores p exatos para os parâmetros de efeitos fixos, ele está com problemas. Mas se o OP quer apenas saber se eles são significativos, acho que os valores t são maiores do que qualquer incerteza sobre como o valor p exato seria calculado. (Por outras palavras, eles são significativos.)
smillig
11
Definitivamente, acho que foi uma boa ideia redirecionar para um cálculo ANOVA para descobrir o efeito geral das estatísticas, mas não tenho certeza se é bom analisar os valores-p. O anovacomando regular fornecerá F's.
John
Eu acho que isso é um pouco mais difícil do que aparente. A execução de ANOVAs é válida quando você deseja minimizar a variação, mas, a partir da pergunta, acho que o OP quer estabelecer o efeito marginal das variáveis, ou seja , testar os coeficientes contra um nulo.
Firebug 25/03
0

A função pvals.fncnão é mais suportada pelo lme4. Usando o pacote lmerTest, é possível usar outro método para calcular o valor-p, como as aproximações de Kenward-Roger

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

Simplesmente carregar o pacote afex imprimirá os valores-p na saída da função lmer do pacote lme4 (você não precisa usar o afex; basta carregá-lo):

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

Isso adicionará automaticamente uma coluna de valor p à saída do lmer (yourmodel) para os efeitos fixos.

Maryam Nasseri
fonte