为何adonis2分析中Season*Area无交互项输出?
问题背景
使用R语言adonis2函数执行PERMANOVA检验,脚本如下:
nmds.div <- adonis2(nmds.dist ~ Season*Area, data = Type0, permutations = 999, method="bray")
其中:
- Season包含3个水平:March、May、Sept
- Area包含2个水平:Pacific、Atlantic
- 因变量为基于OTU读数的Bray-Curtis距离矩阵
原本期望查看Season与Area的交互项,但输出仅包含Season和残差项:
Df SumOfSqs R2 F Pr(>F) Season 2 6.4903 0.27066 8.9066 0.001 *** Residual 48 17.4889 0.72934 Total 50 23.9792 1.00000
而采用相同代码格式分析Cruise与Layer3时,可正常输出交互项Cruise:Layer3:
nmds.div <- adonis2(nmds.dist ~ Cruise*Layer3, data = Type0, permutations = 999, method="bray")
输出结果:
Df SumOfSqs R2 F Pr(>F) Cruise 2 6.4903090 0.27066356 9.787264 0.001 Layer3 1 0.4029121 0.01680253 1.215168 0.311 Cruise:Layer3 2 2.1654176 0.09030381 3.265409 0.002 Residual 45 14.9206109 0.62223010 NA NA Total 50 23.9792496 1.00000000 NA NA
交叉表显示Season与Area的样本分布:
table(Type0$Season, Type0$Area)
输出:
Pacific Atlantic Mar 16 0 May 27 0 Sept 0 8
疑问:为何相同代码对Cruise*Layer3有效,对Season*Area无效?自变量是否存在限制?
原因分析
核心问题是Season与Area的样本完全分离,存在完全共线性(部分单元格无样本):
- March、May的样本全部来自Pacific,没有Atlantic的样本
- Sept的样本全部来自Atlantic,没有Pacific的样本
这种情况下,交互项无法被估计:
- 交互项的作用是检验不同Season在不同Area中的效应是否存在差异,但由于每个Season仅对应单一Area,没有交叉的样本组(比如March-Atlantic、Sept-Pacific均无数据),无法计算交互项的方差,因此
adonis2会自动舍弃该交互项,甚至连Area的主效应也无法估算——因为Area的变异完全被Season的变异所解释。
而Cruise与Layer3的样本分布不存在这种完全分离的情况,每个Cruise水平都对应不同的Layer3水平,有足够的交叉样本支撑,因此可以正常估计交互项。
可行方案
- 补充样本:若要检验Area的主效应或交互效应,需补充缺失单元格的样本(比如采集March在Atlantic、Sept在Pacific的样本)。
- 合并分组:若无法补充数据,可将Season与Area合并为一个新的分组变量(如
Mar_Pacific、May_Pacific、Sept_Atlantic)进行分析,但这种方式无法区分主效应与交互效应。
内容的提问来源于stack exchange,提问作者locopoko
相关产品推荐
相关产品推荐

