咨询permute::how()在adonis2/permutest中置换限制的正确用法
关于permute::how()置换限制设置的解答
你的核心需求是仅允许同一位点内的样本自由置换,跨位点样本完全不交换,这属于分层限制置换逻辑,下面针对你的代码和疑问逐一解析:
现有代码的问题
你当前同时设置within和plots属于冗余且逻辑冲突:
within参数是用于嵌套在plots内部的次级置换结构(比如每个位点内还有子采样单元的复杂设计),而你的实验中位点就是最外层的置换分组,不需要额外定义内层置换规则。plots参数的核心方向是对的,但搭配多余的within会干扰置换规则的执行。
正确的参数设置
针对你的实验设计,只需要保留plots参数来定义分层置换规则即可:
CTRL <- how( plots = Plots(strata = as.factor(predictor.df$site.name), type = "free"), nperm = 9999, observed = TRUE )
参数解释
plots = Plots(strata = ...):通过strata指定分组变量(位点名称),强制置换操作只能在每个位点内部进行,不同位点的样本绝对不会跨组交换。type = "free":定义每个位点内的样本可以完全自由随机置换,完全匹配你“同一位点内样本为可交换单元”的需求。- 关于
blocks参数:你的判断是对的,该参数用于随机区组设计(每个区组包含所有处理水平的重复),而你的实验是每个位点为独立重复组,无处理交叉,因此确实不适用。
验证置换规则的方法
可以用shuffleSet()生成置换结果,验证是否符合预期:
set.seed(123) # 生成10组置换索引 shuffles <- shuffleSet(nrow(predictor.df), control = CTRL) # 取第一个位点的样本索引 site1_idx <- which(predictor.df$site.name == unique(predictor.df$site.name)[1]) # 检查第一组置换中,位点1的样本是否仍在原索引范围内 all(shuffles[1, site1_idx] %in% site1_idx)
若返回TRUE,则说明置换仅发生在位点内部,符合你的设计要求。
内容的提问来源于stack exchange,提问作者Mary M
相关产品推荐
相关产品推荐

