R Vegan:评估处理与对照组成对PERMANOVA对比的显著性
问题
我正在寻找一种统计检验方法,用于评估成对对比之间是否存在统计学差异。我使用的是在环境扰动前、中、后,于处理样地和对照样地采集的生态群落丰度计数数据。我的具体研究需求如下:
- 处理组的「before vs during」「before vs after」,以及对照组的对应成对对比是否具有显著性;
- 上述成对对比之间是否存在统计学差异,具体为:
- 处理组「before vs during」与对照组「before vs during」是否存在显著差异;
- 处理组「before vs after」与对照组「before vs after」是否存在显著差异。
我可通过pairwise.adonis2()完成第一个任务,但不确定如何处理第二个任务。我已修改dune数据集以匹配处理(Control、Treatment)和时期(before、during、after)水平,仅作演示用途。请问是否存在统计评估这些成对对比的方法?
示例代码:
require(vegan) require(pairwiseAdonis) require(dplyr) # Species and environmental data dune <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.spe.txt', row.names = 1) dune.env <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.env.txt', row.names = 1) #rename dune.env$Use <- recode_factor(dune.env$Use, "Haypastu" = "before") dune.env$Use <- recode_factor(dune.env$Use, "Hayfield" = "during") dune.env$Use <- recode_factor(dune.env$Use, "Pasture" = "after") dune.env$Management <- recode_factor(dune.env$Management, "HF" = "SF") dune.env$Management <- recode_factor(dune.env$Management, "NM" = "BF") dune.env$Management <- recode_factor(dune.env$Management, "SF" = "Control") dune.env$Management <- recode_factor(dune.env$Management, "BF" = "Treatment") #define pairwise comparisons dune.env1 <- dune.env %>% mutate(contrast = paste(Management, Use)) #create distmat dune_distmat <- vegdist(dune, method="bray") #pairwise permanova pair_perm <- pairwise.adonis2(dune_distmat ~ contrast, data = dune.env1, permutations = 999)
解决方案
你的第二个需求本质是检验处理组与对照组在群落时间变化幅度上的差异,可通过PERMANOVA的交互项分析+自定义成对检验实现,具体步骤如下:
1. 先检验处理与时期的交互效应
用adonis2()拟合包含Management(处理/对照)和Use(时期)交互项的模型,交互项Management:Use的显著性直接反映两组的时间变化模式是否存在差异。如果交互项显著,再进一步验证具体的成对对比;若不显著,说明两组时间变化无差异,无需后续检验。
# 拟合含交互项的PERMANOVA模型 perm_interaction <- adonis2(dune_distmat ~ Management * Use, data = dune.env, permutations = 999) print(perm_interaction)
2. 检验具体成对对比的组间差异
方法一:子集数据针对性检验
针对你关注的两个时间变化维度(before→during、before→after),分别提取对应子集数据,通过PERMANOVA的交互项检验组间差异:
检验「before vs during」的组间差异
# 筛选before和during时期的样本 subset_bd <- dune.env %>% filter(Use %in% c("before", "during")) dune_bd <- dune[rownames(subset_bd), ] dune_dist_bd <- vegdist(dune_bd, method="bray") # 拟合模型,交互项P值即为两组变化的差异显著性 perm_bd <- adonis2(dune_dist_bd ~ Management * Use, data = subset_bd, permutations = 999) print(perm_bd)
检验「before vs after」的组间差异
# 筛选before和after时期的样本 subset_ba <- dune.env %>% filter(Use %in% c("before", "after")) dune_ba <- dune[rownames(subset_ba), ] dune_dist_ba <- vegdist(dune_ba, method="bray") # 拟合模型 perm_ba <- adonis2(dune_dist_ba ~ Management * Use, data = subset_ba, permutations = 999) print(perm_ba)
方法二:用emmeans进行系统事后对比
若需更标准化的事后检验,可借助emmeans包对交互项进行成对对比,直接输出不同时期下处理组与对照组的差异结果:
require(emmeans) # 对交互项进行成对对比,按时期分组查看处理组与对照组的差异 perm_emmeans <- emmeans(perm_interaction, pairwise ~ Management | Use) print(perm_emmeans)
注意:emmeans适配距离矩阵模型时,需确保数据满足模型假设,若出现适配问题,优先采用子集检验法。
关键注意事项
- 多重检验校正:多次对比后需用
p.adjust()对P值进行校正(如FDR或Bonferroni),降低假阳性概率; - 异质性检验:PERMANOVA对组间离散度敏感,建议先用
betadisper(dune_distmat, dune.env$contrast)检验组间离散度是否一致,若离散度差异显著,需谨慎解释结果; - 样本量:确保每个处理-时期组合有足够重复,否则检验效能不足。
内容的提问来源于stack exchange,提问作者Joshua Smith
相关产品推荐
相关产品推荐

