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

R lme4调用anova比较模型报数据集大小不匹配问题

lme4包anova比较线性混合模型报数据集大小不一致错误排查

问题场景

在RStudio中使用lme4包运行线性混合模型,调用anova函数比较嵌套模型时反复出现固定报错,本次分析使用的数据集结构如下:

structure(list(sub = c("59917f16e339120001fb8c21_fvHlk:5fbd11ca7025930168297956", 
"59917f16e339120001fb8c21_uK9Bt:5fbd11ca7025930168297956", "59917f16e339120001fb8c21_fvHlk:5fbd11ca7025930168297956", 
"59917f16e339120001fb8c21_uK9Bt:5fbd11ca7025930168297956", "59917f16e339120001fb8c21_fvHlk:5fbd11ca7025930168297956", 
"59917f16e339120001fb8c21_uK9Bt:5fbd11ca7025930168297956"), subject = c("59917f16e339120001fb8c21", 
"59917f16e339120001fb8c21", "59917f16e339120001fb8c21", "59917f16e339120001fb8c21", 
"59917f16e339120001fb8c21", "59917f16e339120001fb8c21"), event = c(68L, 
56L, 72L, 37L, 71L, 48L), timestamp = c("24-Nov-2020 14:27:09", 
"24-Nov-2020 14:11:17", "24-Nov-2020 14:27:37", "24-Nov-2020 14:09:01", 
"24-Nov-2020 14:27:29", "24-Nov-2020 14:10:16"), profile = c("mean", 
"odd", "mean", "odd", "mean", "odd"), rating = c(4, 3, 4, 3, 
4, 5), rt_ms = c(2053, 2370, 3044, 1568, 1112, 1732), image = c("accordion_1", 
"accordion_3", "apple_01", "apple_03", "asian_01", "asian_02"
), trial = c(7L, 55L, 11L, 36L, 10L, 47L), onset_s = c(542.394, 
418.52, 570.127, 283.328, 563.481, 358.924), profile_rating = c(3L, 
3L, 3L, 3L, 4L, 5L), block = c(2L, 1L, 2L, 1L, 2L, 1L), sub_num = c(179L, 
154L, 179L, 154L, 179L, 154L), session = c(1L, 2L, 1L, 2L, 1L, 
2L), own_pref = c(4, 3, 4, 4, 4, 5), cat1 = c(1L, 1L, 3L, 3L, 
3L, 3L), cat2 = c(2L, 2L, 10L, 10L, 11L, 11L), item_num = 1:6, 
    own_pref_nan = c(4, 3, 4, 4, 4, 5), profile_rating_new = c(2L, 
    2L, 2L, 2L, 3L, 3L), PE = c(2, 1, 2, 1, 1, 2), PE_si = c(2, 
    1, 2, 1, 1, 2), se_PE = c(0, 0, 0, 1, 0, 0), pro_PE = c(2, 
    1, 2, 2, 1, 2), mean_p = c(3.25957446808511, 2.98297872340426, 
    4.42127659574468, 4.45531914893617, 4.41276595744681, 4.08510638297872
    ), med_p = c(3L, 3L, 4L, 4L, 5L, 4L)), row.names = c(NA, 
6L), class = "data.frame")

首先拟合两个无运行错误的分层线性混合模型,代码如下:

pref1_feedback <- lmer(rating ~ profile_rating_new + (1|subject), data=subj_rating_new)
summary(pref1_feedback)
pref1_fb_own <- lmer(rating ~ profile_rating_new * own_pref + (1|subject), data=subj_rating_new)
summary(pref1_fb_own)

运行模型比较代码anova(pref1_feedback, pref1_fb_own)时,收到如下报错:

Error in anova.merMod(pref1_feedback, pref1_fb_own) : 
  models were not all fitted to the same size of dataset

已完成排查:所有预测变量均无缺失值、已移除全部NA,此前在结构高度相似的数据集上使用anova函数比较同类模型从未出现问题。

报错核心原因

anova.merMod执行模型比较前会强制校验所有传入模型的有效拟合样本量、观测维度是否完全匹配,不匹配就直接抛出该错误,和模型固定效应、随机效应的设定本身无关,常见触发场景包括:

  • 两次模型拟合的间隔中,全局环境里的subj_rating_new数据集被修改,包括但不限于行筛选、行删除、变量重编码、因子水平调整,哪怕建模用到的几个变量都没有NA,只要数据集行数、有效观测数发生变化,就会触发报错。
  • 拟合模型时如果设置了subset参数,两个模型的样本筛选规则不一致,导致入模样本量不同。
  • 建模用到的因子型变量存在未使用的空水平,导致两个模型内部存储的随机效应分组维度不匹配。
  • 环境中同时加载了多个改写lmer模型方法的包(如不同版本的lmerTest、afex),方法冲突导致样本量校验逻辑异常。

解决方案

按以下顺序排查即可解决问题:

  1. 先确认两个模型的实际有效样本量,运行以下代码查看返回值是否一致:
nobs(pref1_feedback)
nobs(pref1_fb_own)

如果返回值不同,说明入模样本确实存在差异,不要凭主观记忆判定数据集未被修改。
2. 重启R会话清空全局环境,从数据读入、数据清洗步骤开始从头运行完整代码,不要在中途手动修改数据集对象。如果使用R Markdown运行,清空缓存后从头渲染所有代码块,保证两个模型拟合时调用的是完全相同的未被修改的数据集。
3. 如果从头运行后样本量仍不一致,在拟合模型前对数据集做标准化预处理,剔除无关变量和空因子水平:

# 只保留建模需要的变量,剔除缺失值,删除空因子水平
subj_rating_new <- droplevels(na.omit(subj_rating_new[, c("rating", "profile_rating_new", "own_pref", "subject")]))

处理完成后再重新拟合两个模型做比较。
4. 排查包冲突问题,先卸载所有会改写lme4模型方法的第三方包,再重新加载lme4拟合模型:

detach("package:lmerTest", unload = TRUE)
detach("package:afex", unload = TRUE)
library(lme4)

内容的提问来源于stack exchange,提问作者Shannon Cahalan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:54:33