Valor de p para o termo de interação em modelos de efeitos mistos usando lme4

10

Eu estou analisando alguns dados comportamentais usando lme4em R, principalmente após excelentes tutoriais do Bodo de Inverno , mas eu não entendo se eu estou lidando com interações corretamente. Pior, ninguém mais envolvido nesta pesquisa usa modelos mistos, então estou um pouco à deriva quando se trata de garantir que as coisas estejam certas.

Em vez de apenas pedir um pedido de ajuda, pensei em fazer o meu melhor para interpretar o problema e depois implorar suas correções coletivas. Alguns outros aspectos são:

  • Enquanto escrevia, encontrei essa pergunta , mostrando que nlmemais diretamente fornece valores p para termos de interação, mas acho que ainda é válido perguntar com relação a lme4.
  • Livius'A resposta a essa pergunta forneceu links para várias leituras adicionais, que tentarei abordar nos próximos dias; portanto, comentarei com qualquer progresso que traga.

Nos meus dados, eu tenho uma variável dependente dv, uma conditionmanipulação (0 = controle, 1 = condição experimental, que deve resultar em um valor mais alto dv) e também um pré-requisito, rotulado appropriate: ensaios codificados 1para isso devem mostrar o efeito, mas ensaios codificados 0podem não, porque falta um fator crucial.

Também incluí duas interceptações aleatórias, para subjecte para target, refletindo dvvalores correlatos dentro de cada sujeito e dentro de cada um dos 14 problemas resolvidos (cada participante resolveu uma versão experimental e de controle de cada problema).

library(lme4)
data = read.csv("data.csv")

null_model        = lmer(dv ~ (1 | subject) + (1 | target), data = data)
mainfx_model      = lmer(dv ~ condition + appropriate + (1 | subject) + (1 | target),
                         data = data)
interaction_model = lmer(dv ~ condition + appropriate + condition*appropriate +
                              (1 | subject) + (1 | target), data = data)
summary(interaction_model)

Resultado:

## Linear mixed model fit by REML ['lmerMod']
## ...excluded for brevity....
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  subject  (Intercept) 0.006594 0.0812  
##  target   (Intercept) 0.000557 0.0236  
##  Residual             0.210172 0.4584  
## Number of obs: 690, groups: subject, 38; target, 14
## 
## Fixed effects:
##                                Estimate Std. Error t value
## (Intercept)                    0.2518     0.0501    5.03
## conditioncontrol               0.0579     0.0588    0.98
## appropriate                   -0.0358     0.0595   -0.60
## conditioncontrol:appropriate  -0.1553     0.0740   -2.10
## 
## Correlation of Fixed Effects:
## ...excluded for brevity.

A ANOVA mostra então interaction_modelum ajuste significativamente melhor do que mainfx_model, do qual concluo que há uma interação significativa presente (p = 0,035).

anova(mainfx_model, interaction_model)

Resultado:

## ...excluded for brevity....
##                   Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)  
## mainfx_model       6 913 940   -450      901                          
## interaction_model  7 910 942   -448      896  4.44      1      0.035 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

A partir daí, isolei um subconjunto dos dados para os quais o appropriaterequisito foi atendido (ou seja, appropriate = 1) e, para que ele se ajuste a um modelo nulo e a um modelo que inclua conditioncomo efeito, comparo os dois modelos usando o ANOVA novamente e eis que conditioné um preditor significativo.

good_data = data[data$appropriate == 1, ]
good_null_model   = lmer(dv ~ (1 | subject) + (1 | target), data = good_data)
good_mainfx_model = lmer(dv ~ condition + (1 | subject) + (1 | target), data = good_data)

anova(good_null_model, good_mainfx_model)

Resultado:

## Data: good_data
## models:
## good_null_model: dv ~ (1 | subject) + (1 | target)
## good_mainfx_model: dv ~ condition + (1 | subject) + (1 | target)
##                   Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)  
## good_null_model    4 491 507   -241      483                          
## good_mainfx_model  5 487 507   -238      477  5.55      1      0.018 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Eoin
fonte
Verifique esta pergunta para obter mais informações sobre valores-p em lme4: stats.stackexchange.com/questions/118416/…
Tim
O uso de lmerTest :: anova () fornecerá as tabelas anova com valores-p para cada termo. Isso permitiria examinar diretamente a interação, em vez de comparar modelos gerais. Veja esta resposta para a pergunta @Tim vinculada a: stats.stackexchange.com/a/118436/35304
Sawyer

Respostas:

3

Não vejo muito o que dizer aqui. Eu acho que você fez um bom trabalho.

Existem várias maneiras pelas quais as pessoas discutiram para testar efeitos e obter valores-p para modelos complicados de efeitos mistos. Há uma boa visão geral aqui . O melhor é usar métodos computacionalmente intensivos (bootstrapping ou métodos bayesianos), mas isso é mais avançado para a maioria das pessoas. O segundo melhor (e melhor conveniente) método é usar um teste de razão de verossimilhança. É isso que anova()(tecnicamente ? Anova.merMod () ) está fazendo. É importante usar apenas um teste de razão de verossimilhança de modelos que se encaixam com a máxima verossimilhança total , em vez de verossimilhança máxima restrita(REML). Por outro lado, para o seu modelo final e para interpretação, você deseja usar o REML. Isso é confuso para muitas pessoas. Em sua saída, vemos que você encaixa seus modelos com REML (isso ocorre porque a opção está definida como TRUEpadrão em lmer(). Isso significaria que seu teste é inválido, no entanto, porque este é um erro tão comum, anova.merMod()contém um refitargumento que o padrão está definido como TRUEe você não o alterou, portanto a previsão dos desenvolvedores de pacotes o salvou lá.

Com relação à sua estratégia de descompactar a interação, o que você fez é bom. Lembre-se de que a interação usa todos os dados para seu teste. É possível ter uma interação significativa, mas nenhum dos testes estratificados é significativo, o que confunde algumas pessoas. (Parece que não aconteceu com você.)

- Reinstate Monica
fonte
0

Sou iniciante e sigo os conselhos de Zuur et al. Uso lmeo nlmepacote em vez de lme4quando preciso adicionar uma estrutura de erro hierárquica a um modelo linear. Minha resposta pode estar errada.

Dois comentários:

(1) Não sei se faz sentido testar conditionno subconjunto quando appropriate==1apenas. Se você deseja obter valores-p para os principais efeitos, pode usar Anovao pacote 'car':

require(car)
Anova(M,type="III")# type III Sum of Squares. M was fitted using method=REML

Se você quiser resolver a interação, poderá executar comparações emparelhadas diretamente (?) Ou fazer o que fez, mas nos dois subconjuntos (ou seja, também no subconjunto onde appropriate==0).

(2) Você pode selecionar sua estrutura de erro primeiro, em vez de assumir que (1 | subject) + (1 | target)é a melhor estrutura de erro. Pelo que você escreveu, entendo que esse conditioné um fator dentro do assunto, enquanto appropriateé um fator entre os assuntos ou entre os objetivos. Você pode adicionar inclinações para fatores dentro do assunto e / ou dentro do alvo, por exemplo: dv ~ condition + appropriate + (1+condition | subject) + (1 | target)adiciona uma inclinação aleatória para o fator dentro do assunto condition. Não são necessárias inclinações para fatores entre sujeitos / alvos.

Felicidades

user42174
fonte
Obrigado. Mas não Anovavamos apenas fingir que as correlações dentro do sujeito e do alvo não existem? O motivo pelo qual repito a análise apenas com dados appropriate==1é que vários materiais utilizados mostraram-se problemáticos em um pós-teste, portanto 'inapropriados'. Por fim, não usei pistas aleatórias pelo simples motivo de que o modelo se encaixa melhor sem elas.
Eoin