PERMANOVA分析(vegan包adonis2)嵌套项支持及代码报错咨询
adonis2嵌套PERMANOVA分析问题解答
adonis2对嵌套项的支持
先明确:adonis2(vegan包的函数)完全支持嵌套语法,公式里的A/B就是A + A:B的简写,代表B嵌套在A里,所以你第一种写法里的Timeofday2/Day_groups是能被正确识别的,这点不用怀疑。但你的公式写得太冗余,反而容易让人困惑,下面具体说。
两种代码的问题解决
第一种代码:冗余项太多,简化即可
你写的第一个代码:
adonis2 (bc_long ~ Height + Timeofday2/Day_groups + Day_groups + Height*Timeofday2/Day_groups + Height*Day_groups, data=meta_long, permutations = 2000, na.action = na.omit)
这里的问题是重复加了没必要的项:
Timeofday2/Day_groups已经展开成Timeofday2 + Timeofday2:Day_groups,你额外加的Day_groups纯属于重复Height*Timeofday2/Day_groups展开后包含Height:Timeofday2、Height:Timeofday2:Day_groups,再加上Height*Day_groups又重复了部分交互项
简化成下面这样就足够,结果完全可信:
adonis2(bc_long ~ Height + Timeofday2/Day_groups + Height:Timeofday2/Day_groups, data=meta_long, permutations=2000, na.action=na.omit)
要是怕嵌套简写看不懂,也可以写成展开式,逻辑更清晰:
adonis2(bc_long ~ Height + Timeofday2 + Timeofday2:Day_groups + Height:Timeofday2 + Height:Timeofday2:Day_groups, data=meta_long, permutations=2000, na.action=na.omit)
第二种代码:报错源于数据行数不匹配
第二个代码报的Error in qr.fitted(qrhs, G) : 'qr' and 'y' must have the same number of rows,核心原因就是**strata参数的长度和你的响应变量bc_long的行数对不上**:
strata必须是和样本数(也就是bc_long的行数)一样长的向量,用来指定置换的分组范围- 先检查
long_diel2数据框里,Day_groups的行数是不是和bc_long完全一致,有没有缺行、缺失值导致的行数不匹配
另外说一句:你想用strata控制嵌套置换的思路是对的,但strata是用来限制置换范围的,和公式里的嵌套项是互补的——公式定义模型要检验的效应,strata定义置换的规则。如果你的设计是Day_groups嵌套在Timeofday2里,正确的strata应该对应上层的Timeofday2分组,或者根据你需要的置换逻辑调整,但前提是长度必须匹配。
给你个正确写法的例子(假设要限制置换仅在同一Timeofday2分组内进行):
# 先确认数据行数一致,避免报错 stopifnot(nrow(long_diel2) == length(bc_long)) # 运行分析 adonis2(bc_long ~ Height + Timeofday2, strata = long_diel2$Timeofday2, data=long_diel2, permutations=2000)
但如果你的核心需求是检验Day_groups嵌套在Timeofday2中的效应,更推荐用第一种简化后的公式嵌套写法,因为能直接在模型里估计嵌套效应的显著性,strata更多是用来控制置换的随机性,减少假阳性。
总结
- adonis2完全支持嵌套语法,
A/B的写法能被正确解析 - 第一种代码的结果可信,只要简化掉冗余的公式项就行
- 第二种代码的报错是因为strata向量和响应变量行数不匹配,先检查数据一致性再调整
内容的提问来源于stack exchange,提问作者Ayda L
相关产品推荐
相关产品推荐

