Normalidade violada da suposição de resíduos em modelo misto linear

8

Eu tenho uma pergunta sobre o quão preocupado eu deveria estar em relação a uma potencial violação da normalidade da suposição de resíduos em um modelo misto linear. Eu tenho um conjunto de dados relativamente pequeno e, após ajustar o modelo (usando 'lmer' em R), um teste de Shapiro-Wilks revela um desvio significativo dos resíduos de uma distribuição normal. As transformações de log de minhas variáveis ​​não lidam com isso satisfatoriamente.

Na minha busca por uma resposta sobre como lidar com isso, encontrei conselhos de que testes de normalidade não deveriam ser realizados (consulte a resposta para uma pergunta semelhante aqui) . Em vez disso, sugerimos gráficos QQ de dados normais aleatórios com o mesmo N que meus resíduos devem ser conduzidos para verificar se o gráfico QQ dos meus resíduos é marcadamente diferente. Outros conselhos que encontrei parecem sugerir que a inferência parece ser robusta a várias violações das suposições do LMM (consulte a publicação no blog aqui) .

Minhas perguntas

1) Se esses eram seus dados, você ficaria preocupado com a falta de normalidade nos resíduos de LMM (veja dados e resultados abaixo)?

2) Se você está preocupado, ainda está preocupado após a transformação do log (novamente, consulte dados e saída abaixo)?

3) Se a resposta for "Sim" para os dois acima, como eu poderia lidar com a não normalidade dos meus resíduos?

Análise de Dados e Não Transformada

# load relevant library
library(lme4)

#--- declare the data
study <- c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6,
           7, 7, 8, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 
           13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16, 16, 16, 17, 17)

condition <- c(1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 
               1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 
               2, 2, 1, 1, 2, 2, 3, 3, 1, 1, 1, 1, 2, 2, 1, 1)

age <- rep(c(1, 2), times = length(study) / 2)

congruent <- c(937, 611, 1067, 611, 1053, 943, 1097, 1015, 1155, 974, 860, 594,
               910, 605, 912, 632, 998, 660, 1989, 1176, 1337, 936, 2657, 1234, 
               1195, 999, 1010, 634, 1205, 620, 1154, 909, 1425, 1172, 1388, 
               1084, 641, 407, 1429, 810, 909, 510, 1358, 802, 1132, 639, 
               1501, 703, 1471, 955, 1342, 631, 1178, 676, 1033, 723)

incongruent <- c(1025, 705, 1204, 705, 1119, 1008, 1184, 1046, 1225, 1013, 1308, 
                 895, 1234, 901, 1204, 854, 1177, 828, 2085, 1269, 1350, 929, 
                 2697, 1231, 1233, 1032, 1062, 679, 1263, 674, 1183, 914, 1458, 
                 1184, 1382, 1086, 632, 424, 1510, 871, 978, 568, 1670, 881, 
                 1395, 747, 1694, 795, 1504, 999, 2112, 948, 1494, 992, 1039, 
                 781)

data <- data.frame(as.factor(study), as.factor(condition), age, congruent, 
                   incongruent)

#--- LMM analysis

# center age
data$age <- scale(data$age, center = TRUE, scale = FALSE)

# fit
fit <- lmer(incongruent ~ congruent + (1|study) + (1|condition), 
            data = data, REML = FALSE)

# plot & test the residual
qqnorm(resid(fit))
qqline(resid(fit))
shapiro.test(resid(fit))

Shapiro-Wilk normality test

data:  resid(fit)
W = 0.74417, p-value = 1.575e-08

Gráfico QQ não transformado

Dados transformados por log

# do the log transform 
data$congruent <- log(data$congruent)
data$incongruent <- log(data$incongruent)

# fit again
log_fit <- lmer(incongruent ~ congruent + (1|study) + (1|condition), 
                data = data, REML = FALSE)

# plot & test the residual
qqnorm(resid(log_fit))
qqline(resid(log_fit))
shapiro.test(resid(log_fit))

Shapiro-Wilk normality test

data:  resid(log_fit)
W = 0.93241, p-value = 0.003732

Gráfico QQ transformado por log

QQ-Plots de distribuição normal simulada

Ao executar esta simulação recomendada, meus gráficos QQ transformados por log não parecem muito diferentes dos gerados a partir de uma verdadeira distribuição normal com o mesmo tamanho de amostra que meus dados (N = 52):

set.seed(42)
par(mfrow = c(3, 3))
for(i in 1:9){
  x = rnorm(52)
  qqnorm(x)
  qqline(x)
}

Figura resultante

JimGrange
fonte
11
Qual é o objetivo do modelo? Se é a melhor previsão do que a normalidade, não importa. Somente os outliers fazem. Existe um teorema de que lm não precisa de normalidade para bons estimadores. Se for para um artigo científico, eu usaria o bootstrap para probabilidades nulas.
precisa saber é o seguinte
@ keiv.fly Sim, é para um jornal. Em uma próxima etapa, quero ver se a variável "idade" é necessária (para adicionar mais ajustes ao modelo e testar via anova).
precisa saber é o seguinte
@ keiv.fly, bootstrapping (não paramétrico) é uma boa idéia, mas deve ser feita de uma maneira que respeite a estrutura dos dados. Fazendo conditionum efeito fixo iria ajudar, então você poderia fazer bootstrapping hierárquica (ie resample estudos com a substituição, então os valores resample dentro estudos com substituição)
Ben Bolker

Respostas:

10

Minha resposta para suas perguntas seria (1) "sim" (eu me preocuparia um pouco com o grau inicial de não normalidade), (2) "não" (a transformação de log parece ter melhorado a situação), (3) N / A (já que não estou preocupado), mas mais algumas coisas a tentar se você estiver preocupado seria:

  • use robustlmm::rlmer()para fazer um ajuste robusto do LMM;
  • tente o ajuste sem os pontos que fornecem os resíduos mais extremos (tente lattice::qqmath(log_fit,id=0.1,idLabels=~.obs)identificá-los pelo número de observação) e veja se isso faz muita diferença
  • tente outra transformação para se aproximar da Normalidade (embora eu tenha brincado um pouco com isso e isso não pareça ajudar)

Estou um pouco surpreso com a aparente incompatibilidade entre seus sims (esses exemplos parecem mais distantes da Normalidade a olho nu) e os resultados do teste Shapiro (evidência bastante forte contra a hipótese nula de Normalidade).

Ben Bolker
fonte
Obrigado - sua resposta ao Q2 corresponde ao meu instinto, o que é tranquilizador.
precisa saber é o seguinte