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

为何用lme4与glmmTMB拟合同一模型得到的AIC不同?

为什么lme4和glmmTMB拟合同一随机截距模型的AIC值存在差异?

我使用lmer()(来自lme4包)和glmmTMB()(来自glmmTMB包)对同一数据拟合了相同的随机截距模型,但两个函数输出的AIC值存在细微差异,想了解其中原因。

数据生成代码

rm(list=ls())
library(lme4)
library(glmmTMB)
library(ggplot2)

# 含8组随机截距的回归模拟数据
set.seed(1)
ii=8 # 组数
reps <- sample(x=8:12, size=ii, replace=T)
slope <- 3
intercept <- runif(ii, min = 70, max = 140)
group.sd <- runif(ii, min = 5, max = 15)
group.ID <- LETTERS[1:ii]

xx <- 1:15

out.list <- list() # 存储模拟数据的空列表

for (i in 1:ii){
        df00 <- data.frame(Group=rep(group.ID[i], reps[i]*length(xx)),
                                    x=rep(xx, reps[i]))
        df00$y = intercept[i] + df00$x * slope + rnorm(length(df00[,1]), 0, group.sd[i])
        out.list[[i]] = df00
        }

# 合并为数据框
df <- do.call(rbind.data.frame, out.list)

# 数据可视化
gg20 <- ggplot(df, aes(x = x, y = y, colour = Group)) 
gg20 + geom_point() + geom_smooth(method="lm") + theme_classic()

数据可视化结果

数据可视化图

模型拟合与AIC输出

glm4_ri <- lmer(y~x + (1|Group), data=df)
glmmTMB_ri <- glmmTMB(y~x + (1|Group), data=df)

AIC(glm4_ri, glmmTMB_ri)
           df      AIC
glm4_ri     4 8588.399
glmmTMB_ri  4 8590.300

差异原因解析

造成AIC细微差异的核心是两个包在对数似然值计算上的细节不同,而AIC的计算公式为AIC = -2*logLik + 2*k(k为参数数量),因此对数似然的微小偏差会直接反映到AIC结果中,具体来源包括:

  • 优化算法与收敛精度:lme4默认采用Nelder-Mead优化器配合Laplace近似,glmmTMB默认使用nlminb优化器。不同优化器的迭代策略、收敛阈值设置不同,可能得到略有差异的参数估计值,进而影响对数似然计算。
  • 似然计算的数值实现:两个包在混合模型似然的数值近似(如Laplace近似的具体实现、矩阵运算的精度处理)上存在细微差别,即使模型结构完全一致,也会导致对数似然结果出现微小偏差。
  • 内部参数化方式:虽然模型的解释性参数(固定截距、斜率、随机截距方差、残差方差)含义一致,但两个包内部对参数的参数化方式可能不同(比如是否对方差做对数变换后再优化),这也会在数值计算中引入细微差异。

这种差异通常非常小,不会改变模型选择的结论,属于数值计算层面的正常现象,而非模型理论或结构上的差异。

内容的提问来源于stack exchange,提问作者Marco Plebani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:37:52