考虑lme4中包含的sleepstudy数据。贝茨在他的有关lme4的在线书中对此进行了讨论。在第三章中,他考虑了两种数据模型。
中号0 :反应〜1 + 天 + (1 | 主题)+ (0 + 天| 主题)
和
中号一:反应〜1 + 日 + (天| 主题)
该研究涉及18位受试者,研究了10天的睡眠不足。在基线和随后的几天计算反应时间。在反应时间和睡眠不足的持续时间之间有明显的影响。主题之间也存在显着差异。模型A允许随机截距和斜率效应之间相互作用的可能性:例如,假设反应时间较差的人遭受睡眠剥夺的影响更为严重。这将暗示随机效应呈正相关。
在贝茨(Bates)的示例中,莱迪思图没有明显的相关性,模型之间也没有显着差异。但是,为了调查上面提出的问题,我决定采用睡眠研究的拟合值,提高相关性,并研究两个模型的性能。
从图像中可以看出,较长的反应时间会带来更大的性能损失。用于仿真的相关系数为0.58
根据我的人工数据的拟合值,我使用lme4中的模拟方法模拟了1000个样本。我将M0和Ma分别拟合,然后查看结果。原始数据集具有180个观察值(18个对象中的每个对象有10个),并且模拟数据具有相同的结构。
底线是几乎没有差异。
- 在两个模型下,固定参数的值完全相同。
- 随机效果略有不同。每个模拟样本有18种截距和18种斜率随机效应。对于每个样本,这些效应被强制加为0,这意味着两个模型之间的平均差(人为地)为0。但是方差和协方差不同。MA下的协方差中位数是104,而M0下的中位数协方差是84(实际值112)。在M0下,斜率和截距的方差比MA大,大概是为了在没有自由协方差参数的情况下获得所需的额外摆动空间。
- 用于lmer的ANOVA方法提供了F统计量,用于将Slope模型与仅具有随机截距的模型进行比较(由于睡眠剥夺而没有影响)。显然,在两个模型中,该值都非常大,但在MA下通常(但并非总是)更大(平均值为62,平均值为55)。
- 固定效应的协方差和方差是不同的。
- 大约有一半的时间,它知道MA是正确的。用于将M0与MA进行比较的中值p值为0.0442。尽管存在有意义的相关性和180个平衡的观察结果,但只有大约一半的时间会选择正确的模型。
- 两种模型下的预测值有所不同,但差异很小。预测之间的平均差为0,标准差为2.7。预测值本身的sd为60.9
那么为什么会这样呢?@gung合理地猜测,不包括相关性的可能性将迫使随机效应不相关。也许应该;但是在此实现中,允许随机效应相关联,这意味着无论模型如何,数据都能够沿正确的方向提取参数。错误模型的错误性出现在可能性中,这就是为什么您可以(有时)在该级别上区分这两个模型的原因。混合效应模型基本上是线性回归适用于每个主题,受模型认为应该是线性回归的影响。错误的模型会迫使拟合的值比正确模型下的可信度要小。但是,这些参数最终还是要取决于对实际数据的拟合程度。
这是我有些笨拙的代码。想法是拟合睡眠研究数据,然后构建具有相同参数但对随机效应具有更大相关性的模拟数据集。该数据集被提供给simulate.lmer()以模拟1000个样本,每种样本都可以同时拟合。配对合适的对象后,可以使用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)
}