You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:42:44