lme4에 포함 된 sleepstudy 데이터를 고려하십시오. 베이츠는 lme4에 대한 그의 온라인 책 에서 이것을 논의합니다 . 3 장에서는 데이터에 대한 두 가지 모델을 고려합니다.
엠0 : 반응 ~ 1 + 일 + ( 1 | 주제 ) + ( 0 + 일 | 주제 )
과
엠A : 반응 ~ 1 + 일 + ( 일 | 주제 )
이 연구는 18 명의 피험자들을 대상으로했으며 수면 박탈 10 일 동안 연구했습니다. 반응 시간은 기준 시점 및 그 다음날에 계산되었다. 반응 시간과 수면 박탈 기간 사이에는 분명한 효과가 있습니다. 과목들 사이에도 상당한 차이가 있습니다. 모델 A는 무작위 절편과 기울기 효과 사이의 상호 작용 가능성을 허용합니다. 예를 들어 반응 시간이 좋지 않은 사람들은 수면 부족 효과로 인해 더 심각하게 고통 받게됩니다. 이는 임의 효과에서 긍정적 인 상관 관계를 의미합니다.
베이츠의 예에서, 격자 플롯과 명백한 상관 관계는 없었으며 모델들 사이에는 큰 차이가 없었습니다. 그러나 위에서 제기 한 문제를 조사하기 위해 수면 연구의 적합치를 취하고 상관 관계를 파악하고 두 모델의 성능을 살펴보기로 결정했습니다.
이미지에서 볼 수 있듯이 반응 시간이 길면 성능 손실이 커집니다. 시뮬레이션에 사용 된 상관 관계는 0.58입니다.
인공 데이터의 적합치에 따라 lme4의 시뮬레이션 방법을 사용하여 1000 개의 샘플을 시뮬레이션했습니다. 나는 M0과 Ma를 각각 맞추고 결과를 보았습니다. 원래 데이터 세트에는 180 개의 관측치 (18 명의 피험자 각각에 대해 10 개)가 있었고 시뮬레이션 된 데이터의 구조는 동일합니다.
결론은 차이가 거의 없다는 것입니다.
- 고정 매개 변수는 두 모델에서 정확히 동일한 값을 갖습니다.
- 무작위 효과는 약간 다릅니다. 각 시뮬레이션 된 샘플에 대해 18 개의 가로 채기 및 18 개의 경사 랜덤 효과가 있습니다. 각 표본에 대해 이러한 효과는 0에 더해 지므로 두 모형 간의 평균 차이는 (인공적으로) 0입니다. 그러나 분산과 공분산은 다릅니다. MA 하에서 평균 공분산은 104 였고, M0 하에서 84에 대하여 (실제 값, 112). 슬로프와 인터셉트의 분산은 MA보다 M0에서 더 높았으며, 이는 아마도 자유 공분산 매개 변수가없는 경우 필요한 추가 흔들림 공간을 얻는 것으로 추정됩니다.
- lmer의 ANOVA 방법은 Slope 모델을 임의 절편 만있는 모델과 비교하기위한 F 통계량을 제공합니다 (수면 박탈로 인한 영향 없음). 분명히이 값은 두 모델 모두에서 매우 크지 만 MA (평균 62 대 평균 55)에서는 일반적으로 (항상 그런 것은 아님) 더 컸습니다.
- 고정 효과의 공분산과 분산이 다릅니다.
- 약 절반의 시간은 MA가 정확하다는 것을 알고 있습니다. M0과 MA를 비교하기위한 중앙값 p- 값은 0.0442입니다. 의미있는 상관 관계와 180 개의 균형 관측 값이 있음에도 불구하고 올바른 모델은 약 절반 만 선택됩니다.
- 예측 된 값은 두 모델마다 다르지만 매우 약간 다릅니다. 예측 간의 평균 차이는 0이며 sd는 2.7입니다. 예측 값 자체의 SD는 60.9입니다.
왜 이런 일이 발생합니까? @gung은 합리적 가능성을 포함하지 않으면 랜덤 효과가 상관되지 않는다고 추측했다. 아마도 그럴 것입니다. 그러나이 구현에서 랜덤 효과는 상관 될 수 있습니다. 즉, 모델에 관계없이 데이터가 올바른 방향으로 매개 변수를 가져올 수 있습니다. 잘못된 모델의 잘못된 점이 가능성에 나타나기 때문에 해당 레벨에서 두 모델을 구별 할 수 있습니다 (때로는). 혼합 효과 모델은 기본적으로 각 주제에 선형 회귀 분석을 적용하며, 모델이 생각하는 바에 따라 영향을받습니다. 잘못된 모델은 올바른 모델에서 얻는 것보다 덜 적절한 값의 적합을 강제합니다. 그러나 하루가 끝날 때 매개 변수는 실제 데이터에 대한 적합성에 의해 결정됩니다.
여기 약간 어색한 코드가 있습니다. 아이디어는 수면 연구 데이터를 맞추고 동일한 매개 변수를 사용하지만 무작위 효과에 대해 더 큰 상관 관계를 갖는 시뮬레이션 된 데이터 세트를 구축하는 것이 었습니다. 이 데이터 세트는 1000 샘플을 시뮬레이션하기 위해 simulate.lmer ()에 공급되었으며, 각 샘플은 두 가지 방식에 모두 적합했습니다. 일단 적합 물체를 짝지 으면, t- 검정 등을 사용하여 적합의 다른 특징을 끌어와 비교할 수 있습니다.
# 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)
}