Considere os dados do estudo do sono, incluídos no lme4. Bates discute isso em seu livro on-line sobre lme4. No capítulo 3, ele considera dois modelos para os dados.
M0 : Reação ∼ 1 + Dias + ( 1 | Assunto ) + ( 0 + Dias | Assunto )
e
MA : Reação ∼ 1 + Dias + ( Dias | Assunto )
O estudo envolveu 18 indivíduos, estudados por um período de 10 dias privados de sono. Os tempos de reação foram calculados na linha de base e nos dias subsequentes. Há um efeito claro entre o tempo de reação e a duração da privação do sono. Também existem diferenças significativas entre os sujeitos. O modelo A permite a possibilidade de uma interação entre os efeitos de interceptação aleatória e inclinação: imagine, digamos, que pessoas com tempos de reação ruins sofram mais agudamente dos efeitos da privação do sono. Isso implicaria uma correlação positiva nos efeitos aleatórios.
No exemplo de Bates, não houve correlação aparente do gráfico Lattice e nenhuma diferença significativa entre os modelos. No entanto, para investigar a questão colocada acima, decidi pegar os valores ajustados do estudo do sono, aumentar a correlação e analisar o desempenho dos dois modelos.
Como você pode ver na imagem, longos tempos de reação estão associados a uma maior perda de desempenho. A correlação utilizada para a simulação foi de 0,58
Simulei 1000 amostras, usando o método simule no lme4, com base nos valores ajustados dos meus dados artificiais. Encaixei M0 e Ma em cada uma e observei os resultados. O conjunto de dados original teve 180 observações (10 para cada um dos 18 indivíduos) e os dados simulados têm a mesma estrutura.
A linha inferior é que há muito pouca diferença.
- Os parâmetros fixos têm exatamente os mesmos valores nos dois modelos.
- Os efeitos aleatórios são ligeiramente diferentes. Existem 18 efeitos aleatórios de interceptação e 18 de inclinação para cada amostra simulada. Para cada amostra, esses efeitos são forçados a adicionar a 0, o que significa que a diferença média entre os dois modelos é (artificialmente) 0. Mas as variações e covariâncias diferem. A covariância mediana em MA foi de 104, contra 84 em M0 (valor real, 112). As variações de declives e interceptações foram maiores sob M0 que MA, presumivelmente para obter espaço extra de manobra necessário na ausência de um parâmetro de covariância livre.
- O método ANOVA para lmer fornece uma estatística F para comparar o modelo Slope com um modelo com apenas uma interceptação aleatória (nenhum efeito devido à privação do sono). Claramente, esse valor era muito grande nos dois modelos, mas era tipicamente (mas nem sempre) maior no MA (média 62 vs média de 55).
- A covariância e variância dos efeitos fixos são diferentes.
- Cerca da metade do tempo, sabe que o MA está correto. O valor p mediano para comparar M0 a MA é 0,0442. Apesar da presença de uma correlação significativa e 180 observações equilibradas, o modelo correto seria escolhido apenas cerca da metade do tempo.
- Os valores previstos diferem nos dois modelos, mas muito ligeiramente. A diferença média entre as previsões é 0, com dp de 2,7. O sd dos valores previstos é 60,9
Então porque isso acontece? @gung imaginou, razoavelmente, que a falha em incluir a possibilidade de uma correlação força os efeitos aleatórios a não serem correlacionados. Talvez deva; mas nessa implementação, os efeitos aleatórios podem ser correlacionados, o que significa que os dados são capazes de puxar os parâmetros na direção certa, independentemente do modelo. O erro do modelo errado aparece na probabilidade, razão pela qual você pode (às vezes) distinguir os dois modelos nesse nível. O modelo de efeitos mistos está basicamente ajustando regressões lineares para cada sujeito, influenciado pelo que o modelo pensa que deveria ser. O modelo errado força o ajuste de valores menos plausíveis do que o modelo correto. Mas os parâmetros, no final do dia, são governados pelo ajuste aos dados reais.
Aqui está o meu código um pouco desajeitado. A idéia era ajustar os dados do estudo do sono e, em seguida, construir um conjunto de dados simulados com os mesmos parâmetros, mas uma correlação maior para os efeitos aleatórios. Esse conjunto de dados foi alimentado para simular.lmer () para simular 1000 amostras, cada uma das quais se encaixava nos dois sentidos. Depois de emparelhar os objetos ajustados, eu poderia extrair diferentes recursos do ajuste e compará-los, usando testes t ou qualquer outra coisa.
# Fit a model to the sleep study data, allowing non-zero correlation
fm01 <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=sleepstudy, REML=FALSE)
# Now use this to build a similar data set with a correlation = 0.9
# Here is the covariance function for the random effects
# The variances come from the sleep study. The covariance is chosen to give a larger correlation
sigma.Subjects <- matrix(c(565.5,122,122,32.68),2,2)
# Simulate 18 pairs of random effects
ranef.sim <- mvrnorm(18,mu=c(0,0),Sigma=sigma.Subjects)
# Pull out the pattern of days and subjects.
XXM <- model.frame(fm01)
n <- nrow(XXM) # Sample size
# Add an intercept to the model matrix.
XX.f <- cbind(rep(1,n),XXM[,2])
# Calculate the fixed effects, using the parameters from the sleep study.
yhat <- XX.f %*% fixef(fm01 )
# Simulate a random intercept for each subject
intercept.r <- rep(ranef.sim[,1], each=10)
# Now build the random slopes
slope.r <- XXM[,2]*rep(ranef.sim[,2],each=10)
# Add the slopes to the random intercepts and fixed effects
yhat2 <- yhat+intercept.r+slope.r
# And finally, add some noise, using the variance from the sleep study
y <- yhat2 + rnorm(n,mean=0,sd=sigma(fm01))
# Here is new "sleep study" data, with a stronger correlation.
new.data <- data.frame(Reaction=y,Days=XXM$Days,Subject=XXM$Subject)
# Fit the new data with its correct model
fm.sim <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=new.data, REML=FALSE)
# Have a look at it
xyplot(Reaction ~ Days | Subject, data=new.data, layout=c(6,3), type=c("p","r"))
# Now simulate 1000 new data sets like new.data and fit each one
# using the right model and zero correlation model.
# For each simulation, output a list containing the fit from each and
# the ANOVA comparing them.
n.sim <- 1000
sim.data <- vector(mode="list",)
tempReaction <- simulate(fm.sim, nsim=n.sim)
tempdata <- model.frame(fm.sim)
for (i in 1:n.sim){
tempdata$Reaction <- tempReaction[,i]
output0 <- lmer(Reaction ~ 1 + Days +(1|Subject)+(0+Days|Subject), data = tempdata, REML=FALSE)
output1 <- lmer(Reaction ~ 1 + Days +(Days|Subject), data=tempdata, REML=FALSE)
temp <- anova(output0,output1)
pval <- temp$`Pr(>Chisq)`[2]
sim.data[[i]] <- list(model0=output0,modelA=output1, pvalue=pval)
}