Eu estou analisando alguns dados comportamentais usando lme4
em 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
nlme
mais diretamente fornece valores p para termos de interação, mas acho que ainda é válido perguntar com relação alme4
. 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 condition
manipulaçã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 1
para isso devem mostrar o efeito, mas ensaios codificados 0
podem não, porque falta um fator crucial.
Também incluí duas interceptações aleatórias, para subject
e para target
, refletindo dv
valores 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_model
um 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 appropriate
requisito foi atendido (ou seja, appropriate = 1
) e, para que ele se ajuste a um modelo nulo e a um modelo que inclua condition
como 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
fonte
lme4
: stats.stackexchange.com/questions/118416/…Respostas:
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 comoTRUE
padrão emlmer()
. Isso significaria que seu teste é inválido, no entanto, porque este é um erro tão comum,anova.merMod()
contém umrefit
argumento que o padrão está definido comoTRUE
e 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ê.)
fonte
Sou iniciante e sigo os conselhos de Zuur et al. Uso
lme
onlme
pacote em vez delme4
quando 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
condition
no subconjunto quandoappropriate==1
apenas. Se você deseja obter valores-p para os principais efeitos, pode usarAnova
o pacote 'car':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 essecondition
é um fator dentro do assunto, enquantoappropriate
é 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 assuntocondition
. Não são necessárias inclinações para fatores entre sujeitos / alvos.Felicidades
fonte
Anova
vamos 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 dadosappropriate==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.