ANOVA、GLM摘要及成对差异中意外NA值的问题求助
问题:GLM全模型分析出现NA值及ANOVA报错问题
模型构建
我运行了以下GLM模型:
MM11<-glm(CR ~ Species + Season + Habitat, data=ds1) MM12<-glm(CR ~ Species * Season + Habitat, data=ds1) MM13<-glm(CR ~ Species + Season * Habitat, data=ds1) MM14<-glm(CR ~ Species * Habitat + Season, data=ds1) MM15<-glm(CR ~ Species * Habitat * Season, data=ds1)
模型筛选与异常结果
尝试用ANOVA筛选最优模型时出现报错:
anova(MM11, MM12, MM13, MM14, MM15, test="Chisq")
报错信息:
Error in if (dispersion == 1) Inf else min(resdf) : missing value where TRUE/FALSE needed
改用AIC筛选:
AIC(MM11, MM12, MM13, MM14, MM15)
结果显示MM15的AIC值最低,但对MM15单独运行Anova()时,结果全为NA,summary(MM15)也存在大量NA,计算边际均值时同样如此,其他模型无此问题。
得到的异常Anova结果:
Analysis of Deviance Table (Type II tests) Response: CR LR Chisq Df Pr(>Chisq) Species NaN 3 NaN Habitat NaN 2 NaN Season NaN 1 NaN Species:Habitat NaN 4 NaN Species:Season NaN 3 NaN Habitat:Season NaN 1 NaN Species:Habitat:Season NaN 1 NaN
期望结果
期望得到类似如下的有效结果:
Analysis of Deviance Table (Type II tests) Response: CR LR Chisq Df Pr(>Chisq) Species 45.423 3 7.522e-10 *** Habitat 6.434 2 0.04007 * Season 2.275 1 0.13145 Species:Habitat 26.451 5 7.294e-05 *** Species:Season 2.5307 3 0.469771 Habitat:Season 11.0975 2 0.003892 ** Species:Habitat:Season 1.4956 1 0.23845
数据集
数据集ds1的dput输出:
structure(list(Season = c("Southwest monsoon", "Southwest monsoon", "Southwest monsoon", "Southwest monsoon", "Southwest monsoon", "Southwest monsoon", "Southwest monsoon", "Southwest monsoon", "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", "Winter", "Winter"), Habitat = c("Farmland", "Farmland", "Savannah", "Savannah", "Savannah", "Savannah", "Scrubland", "Scrubland", "Farmland", "Savannah", "Savannah", "Savannah", "Savannah", "Scrubland", "Scrubland", "Scrubland", "Scrubland"), Species = structure(c(2L, 4L, 1L, 2L, 3L, 4L, 2L, 3L, 1L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L ), levels = c("1", "2", "3", "5"), class = "factor"), Capture = c(3, 1, 4, 15, 3, 1, 12, 7, 8, 1, 22, 3, 1, 1, 19, 9, 2), Trap = c(590L, 590L, 1761L, 1761L, 1761L, 1761L, 1197L, 1197L, 598L, 1703L, 1703L, 1703L, 1703L, 1134L, 1134L, 1134L, 1134L), CR = c(0.00508474576271186, 0.00169491525423729, 0.00227143668370244, 0.00851788756388416, 0.00170357751277683, 0.00056785917092561, 0.0100250626566416, 0.00584795321637427, 0.0133779264214047, 0.000587199060481503, 0.0129183793305931, 0.00176159718144451, 0.000587199060481503, 0.000881834215167548, 0.0167548500881834, 0.00793650793650794, 0.0017636684303351)), row.names = c(NA, -17L), class = "data.frame")
原因分析
- 样本量远小于模型参数数:MM15是三因素全交互模型,需估计的参数总数约23个(含所有主效应、交互项),但数据集仅17行样本,样本量不足以支撑复杂模型,导致参数无法有效估计,出现NA。
- 因素组合缺失:数据中存在大量
Species-Habitat-Season组合缺失(例如西南季风季的农田仅包含物种2和5,缺少物种1和3),这些缺失组合导致全模型部分参数无对应数据支撑,无法计算。 - ANOVA报错根源:MM15等模型存在奇异矩阵问题,导致离散度(dispersion)计算出现NA,触发
anova()函数的条件判断报错。 - 模型类型选择不当:响应变量CR是0-1之间的比例值,使用默认正态分布的GLM不符合数据分布特性,加剧了模型估计的不稳定性。
解决方法
- 选择简约模型:放弃全交互模型MM15,从AIC结果中选择次优的、参数数与样本量匹配的模型(如MM12、MM13或MM14),这类模型复杂度更低,参数可被有效估计。
- 修正模型类型:改用适合比例数据的模型:
- 采用二项分布GLM,直接使用捕获数和未捕获数作为响应变量:
MM11_binom <- glm(cbind(Capture, Trap - Capture) ~ Species + Season + Habitat, data=ds1, family=binomial) - 若捕获率存在大量0或1,可使用Beta回归(需加载
betareg包)。
- 采用二项分布GLM,直接使用捕获数和未捕获数作为响应变量:
- 优化数据:若条件允许,补充缺失的
Species-Habitat-Season组合样本;若无法补充,需进一步简化模型结构。
内容的提问来源于stack exchange,提问作者Aditya Ganesh
相关产品推荐
相关产品推荐

