使用aov()执行双向ANOVA时交互项未被估计的问题排查
问题:双向交互ANOVA分析未生成交互项结果的原因
我在数据集data5上调用aov()函数进行双向交互ANOVA分析,模型公式指定为salary_in_usd ~ company_size * employment_type,但分析结果中未生成交互项的估计值,请问问题出在哪里?
相关代码及输出如下:
data5 <- structure(list(salary_in_usd = c(180000L, 120000L, 215300L, 158200L,140400L, 215300L, 31615L, 35590L, 52396L, 40000L, 122346L, 135000L,205300L, 140400L, 140000L, 183228L, 91614L, 185100L, 200000L,120000L, 230000L, 100000L, 165000L, 86703L, 140000L, 210000L,140000L, 210000L, 140000L, 210000L, 140000L, 230000L, 150000L,120000L, 160000L, 130000L, 100000L, 48000L), company_size = c("L","L","L","L","L","L","L","L","L","L","L","L","L","L","M","M","M","M","M","M","M","M","M","M","M","M","M","M","M","M","M","M","S","S","S","S","S","S"), employment_type = c("FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","FT","PT","FT")), class = "data.frame", row.names = c(NA,-38L)) anova2i.result <- aov(salary_in_usd ~ company_size * employment_type, data = data5) # Df Sum Sq Mean Sq F value Pr(>F) #company_size 2 1.361e+10 6.807e+09 2.278 0.118 #employment_type 1 3.888e+08 3.888e+08 0.130 0.721 #Residuals 34 1.016e+11 2.988e+09
原因分析
核心问题是数据集的交叉分组存在空单元格或样本量不足,导致交互效应无法被估计:
- 先查看两个因子的交叉频数,运行
table(data5$company_size, data5$employment_type)会得到如下结果:FT PT L 14 0 M 18 0 S 5 1 - 双向交互ANOVA要求每个交叉组合(这里是3种公司规模×2种雇佣类型=6组)都有足够样本量来计算效应,但
L-PT和M-PT组完全没有数据,S-PT组也只有1个样本。 - 当交叉组没有数据或者仅1个样本时,该组无法提供自由度来估计交互项的变异,
aov()会自动跳过这个无法计算的交互项,所以结果里看不到交互项的统计量。
可行解决办法
- 若能补充数据,给
L-PT和M-PT组添加至少2个样本,保证每个交叉组都有足够数据支撑效应估计; - 若无法补数据,直接拟合不含交互项的主效应模型:
salary_in_usd ~ company_size + employment_type; - 也可以考虑合并类别,比如把
PT类型合并到FT,减少交叉组合的数量,避免空单元格问题。
内容的提问来源于stack exchange,提问作者Rochhh999
相关产品推荐
相关产品推荐

