sommer包mmer拟合混合模型与nlme的lme模型结果不一致问题
问题描述
我从文献中了解到,sommer包在混合模型参数推断上比nlme、lme4等经典包有更多可能性,因此尝试用sommer包的mmer()函数复现之前用nlme包lme()拟合的三个混合模型:
- m1:
lme(distance ~ Sex * age, data = Orthodont, random = ~1|Subject, method = "REML"),对应的sommer模型m11结果符合预期; - m2:
lme(distance ~ Sex * age, data = Orthodont, random = list(Subject = pdDiag(~age)), method = "REML"),对应的sommer模型m22的系数(尤其是随机效应)与原模型差异显著; - m3:
lme(distance ~ Sex * age, data = Orthodont, random = ~age|Subject, method = "REML"),对应的sommer模型m33固定效应结果符合预期,但随机效应仍有差异。
使用的sommer包版本为4.3.1,无法确定m2与m22结果不一致的原因,特此求助。
可能原因与解决方法
1. 随机效应结构定义不匹配
nlme中pdDiag(~age)实际是为Subject分组下的截距+age斜率设置独立的随机效应(~age会自动扩展为~1 + age,pdDiag指定两者方差无协方差)。而sommer的mmer()不会默认处理这种扩展,需要显式指定对角协方差结构:
m22 <- mmer( distance ~ Sex * age, random = ~ vsr(diag(Subject, ~ 1 + age)), data = Orthodont, method = "REML" )
vsr(diag(...))是sommer中对应pdDiag的语法,明确指定截距和age的随机效应为独立的对角结构。
2. 优化算法默认设置差异
nlme的lme()默认用L-BFGS-B优化器,而sommer的mmer()默认优化器可能不同(如AI-REML),这会导致方差组分估计差异。可以强制对齐优化方法:
m22 <- mmer( distance ~ Sex * age, random = ~ vsr(diag(Subject, ~ 1 + age)), data = Orthodont, method = "REML", optimizer = "L-BFGS-B" )
3. 截距的隐含处理差异
nlme中~age作为随机效应时自动包含截距,但sommer可能不会。必须在随机效应公式中明确写出1 + age,避免歧义:
# 显式包含截距,与nlme的~age展开逻辑一致 m22 <- mmer( distance ~ Sex * age, random = ~ vsr(diag(Subject, ~ 1 + age)), data = Orthodont, method = "REML" )
4. 收敛性与细节检查
- 对比
summary(m2)和summary(m22)的输出,重点看随机效应方差组分、固定效应标准误,定位差异来源; - 用
convergence(m22)检查sommer模型的收敛状态,若未收敛,尝试增加迭代次数:
m22 <- mmer( distance ~ Sex * age, random = ~ vsr(diag(Subject, ~ 1 + age)), data = Orthodont, method = "REML", control = list(maxit = 1000) )
内容的提问来源于stack exchange,提问作者user55546
相关产品推荐
相关产品推荐

