混合建模 - lme和lmer函数结果不同

3

我目前正在阅读Andy Field的书《Discovering Statistics Using R》。第14章是关于混合建模,他使用了nlme软件包中的lme函数。

他使用速配数据创建的模型如下:

speedDateModel <- lme(dateRating ~ looks + personality +
                 gender + looks:gender + personality:gender + 
                 looks:personality,
    random = ~1|participant/looks/personality)

我尝试使用lme4软件包中的lmer函数重新创建类似的模型; 然而,我的结果不同。 我认为我有正确的语法,但也许不是?

speedDateModel.2 <- lmer(dateRating ~ looks + personality + gender + 
              looks:gender + personality:gender + 
              (1|participant) + (1|looks) + (1|personality), 
              data = speedData, REML = FALSE)

此外,当我运行这些模型的系数时,我发现它只为每个参与者生成随机截距。然后我尝试创建一个既产生随机截距又产生斜率的模型。但是无论对于哪个函数,我似乎都无法得到正确的语法。任何帮助将不胜感激。

1个回答

5

lme和相应的lmer公式之间唯一的区别应该是随机和固定组件被聚合成一个单一的公式:

dateRating ~ looks + personality +
             gender + looks:gender + personality:gender + 
             looks:personality+ (1|participant/looks/personality)

使用(1|participant) + (1|looks) + (1|personality)仅在每个嵌套级别上lookspersonality具有唯一值时才是等效的。

不清楚您想要定义斜率的连续变量是什么:如果您有一个连续变量x和组g,那么(x|g)或等效地(1+x|g)将给您一个随机斜率模型(x也应包含在模型的固定效应部分中,即完整公式应为y~x+(x|g)...)

更新:我从这里获得了数据,或者说是允许重构数据的脚本文件。Field在他的书中犯了一个常见错误,我过去也犯过几次:由于数据集中每个参与者/外貌/个性组合只有一个观察值,所以三路交互每个级别都有一个观察值。在线性混合模型中,这意味着在嵌套的最低级别上的方差将与残差方差混淆。

您可以从以下两个方面看到这一点:

  • lme 似乎很好地拟合了模型,但是如果您尝试通过intervals()计算置信区间,则会得到
 intervals(speedDateModel)
 ## Error in intervals.lme(speedDateModel) : 
 ##   cannot get confidence intervals on var-cov components: 
 ##   Non-positive definite approximate variance-covariance
  • 如果您使用 lmer 来尝试这个,您会得到:
## Error: number of levels of each grouping factor
##   must be < number of observations

在这两种情况下,这都是有问题的信号。(如果你真的想,你可以在 lmer 中克服这个问题:请参阅 ?lmerControl。)
如果我们省略最低分组级别,一切都可以正常工作:
sd2 <- lmer(dateRating ~ looks + personality +
                 gender + looks:gender + personality:gender + 
                 looks:personality+
                     (1|participant/looks),
            data=speedData)

比较lmerlme固定效应:

all.equal(fixef(sd2),fixef(speedDateModel)) ## TRUE

这里的典型例子(点击此处)提供了另一个实例并进一步解释了这个问题。


谢谢你,Ben。在我的第一个模型示例中,使用lme()函数产生了正确的结果。你能帮我理解如何使用lmer()函数重新编写这个例子吗?因为我似乎无法理解如何使它正常工作而不会出现一堆错误。 - user3585829
如果我要帮你更多,我需要一个可重现的例子。我在 Google Books 上翻了一下这本书,但是我找不到 speedData 数据集来自哪里(另外,你应该始终使用 data= 参数来明确指定分析的数据框...) - Ben Bolker
你好,Ben,很抱歉还没有回复你。事情变得非常忙碌。如果可能的话,我会尽量在本周晚些时候更新更多信息。感谢你的理解。 - user3585829

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接