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

如何从lme4::lmer的ML拟合模型提取信息准则并与REML拟合模型的摘要结果结合

解决方案:给REML拟合的lmer模型summary添加ML信息准则

我完全懂你的需求——你想让REML拟合的分层模型summary输出里,补上ML方法计算的AIC、BIC等信息准则,和ML模型的summary格式保持一致。其实lme4默认不会在REML模型的summary里显示这些ML指标,但我们可以通过自定义打印逻辑来实现。

核心思路

REML模型的summary()不会自动展示ML的信息准则,但我们可以:

  1. 从原REML模型快速拟合对应的ML版本(用update()很方便)
  2. 提取ML模型的AIC、BIC、logLik、deviance和残差自由度
  3. 自定义打印函数,把这些指标插入到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:52:29