为何用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
相关产品推荐
相关产品推荐

