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

运行R语言anova_test做ANOVA时出现lm.fit 0 (non-NA) cases错误怎么办

报错原因分析

该报错Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 0 (non-NA) cases的本质是anova_test在拟合重复测量ANOVA模型时,筛选后符合模型要求的有效样本量为0。
你使用的是双因素重复测量ANOVA,要求每个wid(被试标识)必须在所有within因子的水平组合下都有非缺失的观测值,只要存在任意被试缺少某一个组合的观测、或对应value为NA,就会触发该报错。

排查步骤
  1. 首先计算两个within因子的总水平组合数
    先分别查看series和Before.Treatments的水平数,两者相乘即为每个被试需要的完整观测数:
# 查看因子水平数
nlevels(df$series)
nlevels(df$Before.Treatments)

比如series有2个水平、Before.Treatments有3个水平,总组合数就是6,每个被试都需要有6条对应不同组合的有效数据。

  1. 检查被试数据的完整性
    运行代码查看每个Before.ID对应的有效组合数:
library(dplyr)
df %>% 
  filter(!is.na(value)) %>% 
  count(Before.ID, series, Before.Treatments) %>% 
  count(Before.ID, name = "valid_comb_num")

只要存在任意Before.ID的valid_comb_num小于总组合数,就会导致模型拟合失败。

  1. 检查因变量缺失情况
    运行代码确认value列的缺失比例:
sum(is.na(df$value))

如果value全为NA也会触发相同报错。

解决方法

方法1:保留完整观测被试,继续使用重复测量ANOVA

筛选出所有符合完整观测要求的被试后再建模:

# 替换下方的<总组合数>为你第一步计算的实际数值,比如6
valid_id <- df %>% 
  filter(!is.na(value)) %>% 
  count(Before.ID, series, Before.Treatments) %>% 
  count(Before.ID) %>% 
  filter(n == <总组合数>) %>% 
  pull(Before.ID)

df_clean <- df %>% filter(Before.ID %in% valid_id)

# 重新运行ANOVA
res.aov <- anova_test(
  data = df_clean, dv = value, wid = Before.ID,
  within = c(series, Before.Treatments)
)
get_anova_table(res.aov)

方法2:更换为线性混合效应模型

如果缺失数据较多,删除被试会导致样本量损失过大,可以选择不要求完整观测的线性混合效应模型替代重复测量ANOVA:

library(lme4)
library(lmerTest)

# 构建混合效应模型,将被试作为随机效应
mix_model <- lmer(value ~ series * Before.Treatments + (1|Before.ID), data = df)
anova(mix_model)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:00