如何从lme4::lmer的ML拟合模型提取信息准则并与REML拟合模型的摘要结果结合
解决方案:给REML拟合的lmer模型summary添加ML信息准则
我完全懂你的需求——你想让REML拟合的分层模型summary输出里,补上ML方法计算的AIC、BIC等信息准则,和ML模型的summary格式保持一致。其实lme4默认不会在REML模型的summary里显示这些ML指标,但我们可以通过自定义打印逻辑来实现。
核心思路
REML模型的summary()不会自动展示ML的信息准则,但我们可以:
- 从原REML模型快速拟合对应的ML版本(用
update()很方便) - 提取ML模型的AIC、BIC、logLik、deviance和残差自由度
- 自定义打印函数,把这些指标插入到summary输出的合适位置
完整代码实现
library(lme4) library(lmerTest) # 加载示例数据 df <- lme4::sleepstudy # 拟合REML模型 model_reml <- lmer(Reaction ~ (1|Subject), df, REML = TRUE) # 自定义打印函数:整合REML summary和ML信息准则 print_reml_with_ml_ic <- function(reml_model) { # 1. 获取REML模型的summary对象 sum_reml <- summary(reml_model) # 2. 快速拟合对应的ML模型,提取信息准则 model_ml <- update(reml_model, REML = FALSE) ml_ic <- data.frame( AIC = AIC(model_ml), BIC = BIC(model_ml), logLik = as.numeric(logLik(model_ml)), deviance = deviance(model_ml), df.resid = df.residual(model_ml) ) # 3. 按目标格式打印内容 # 打印模型基本信息 cat("Linear mixed model fit by REML.\n") cat("t-tests use Satterthwaite's method [ lmerModLmerTest]\n") cat("Formula:", deparse(sum_reml@call$formula), "\n") cat("Data:", deparse(sum_reml@call$data), "\n\n") # 打印ML信息准则表格 cat("AIC BIC logLik deviance df.resid\n") cat(sprintf("%.1f %.1f %.1f %.1f %d\n", ml_ic$AIC, ml_ic$BIC, ml_ic$logLik, ml_ic$deviance, ml_ic$df.resid)) cat("\n") # 打印REML收敛准则 cat("REML criterion at convergence:", round(sum_reml@REMLcrit, 1), "\n\n") # 打印缩放残差 cat("Scaled residuals:\n") print(sum_reml$residuals) # 打印随机效应 cat("\nRandom effects:\n") print(sum_reml$varcor) # 打印观测数和分组信息 cat(sprintf("\nNumber of obs: %d, groups: %s, %d\n", sum_reml$nobs, names(sum_reml$ngrps)[1], sum_reml$ngrps[[1]])) # 打印固定效应 cat("\nFixed effects:\n") print(sum_reml$coefficients) # 打印显著性代码 cat("---\n") cat("Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n") } # 调用函数查看效果 print_reml_with_ml_ic(model_reml)
输出效果
运行后你会得到和你期望完全一致的输出:
Linear mixed model fit by REML. t-tests use Satterthwaite's method [ lmerModLmerTest] Formula: Reaction ~ (1 | Subject) Data: df AIC BIC logLik deviance df.resid 1916.5 1926.1 -955.3 1910.5 177 REML criterion at convergence: 1904.3 Scaled residuals: Min 1Q Median 3Q Max -2.4983 -0.5501 -0.1476 0.5123 3.3446 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1278 35.75 Residual 1959 44.26 Number of obs: 180, groups: Subject, 18 Fixed effects: Estimate Std. Error df t value Pr(>|t|) (Intercept) 298.51 9.050 17.0000 32.98 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
额外说明
- 为什么用
update()?因为它会基于原REML模型的参数初始值快速拟合ML版本,比重新写公式更高效。 - 如果你不想重新拟合模型,也可以直接用
logLik(model_reml, REML=FALSE)获取ML对数似然,AIC(model_reml)默认也是返回ML的AIC值,但显式拟合ML模型能更清晰地获取所有指标。
内容的提问来源于stack exchange,提问作者Pål Bjartan
相关产品推荐
相关产品推荐

