运行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,就会触发该报错。
排查步骤
- 首先计算两个
within因子的总水平组合数
先分别查看series和Before.Treatments的水平数,两者相乘即为每个被试需要的完整观测数:
# 查看因子水平数 nlevels(df$series) nlevels(df$Before.Treatments)
比如series有2个水平、Before.Treatments有3个水平,总组合数就是6,每个被试都需要有6条对应不同组合的有效数据。
- 检查被试数据的完整性
运行代码查看每个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小于总组合数,就会导致模型拟合失败。
- 检查因变量缺失情况
运行代码确认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
相关产品推荐
相关产品推荐

