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
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
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)
}
fonte
condition
um 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)Respostas:
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:
robustlmm::rlmer()
para fazer um ajuste robusto do LMM;lattice::qqmath(log_fit,id=0.1,idLabels=~.obs)
identificá-los pelo número de observação) e veja se isso faz muita diferençaEstou 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).
fonte