跳转至

184_微生物群落组装分析

一句话概述

微生物群落组装分析研究哪些生态过程(确定性过程如环境筛选 vs 随机性过程如漂变和扩散)决定了微生物群落的组成和结构,通过零模型分析(βNTI、RCbray等指标)量化各过程的相对贡献。

核心知识点表格

知识点说明
群落组装理论确定性过程 vs 随机性过程决定群落组成
确定性过程环境筛选(同质/异质选择)、种间竞争
随机性过程生态漂变、扩散限制、随机扩散
βNTIBeta Nearest Taxon Index,衡量系统发育周转偏离随机预期的程度
RCbrayRaup-Crick指数(Bray-Curtis版),衡量物种组成偏离随机预期
阈值解读|βNTI|>2为确定性过程,|βNTI|≤2时看RCbray
工具iCAMP、picante、MicEco、NST
应用生态学理论验证、环境扰动评估、微生物组动态研究

步骤详解

第一步:理解群落组装理论框架

白话解释:一个地方的微生物为什么是这样的组成?有两大原因:一是环境选择了适合的物种(确定性),二是随机事件碰巧让某些物种到了这里(随机性)。群落组装分析就是要量化这两种力量的大小。

技术细节:Stegen等人提出的分析框架将群落组装过程分为5类:(1)同质选择(homogeneous selection):相似环境筛选出相似群落,βNTI<-2;(2)异质选择(variable selection):不同环境筛选出不同群落,βNTI>2;(3)扩散限制(dispersal limitation):βNTI∈[-2,2]且RCbray>0.95;(4)同质化扩散(homogenizing dispersal):βNTI∈[-2,2]且RCbray<-0.95;(5)漂变/非主导过程:βNTI∈[-2,2]且RCbray∈[-0.95,0.95]。

第二步:计算βNTI

白话解释:βNTI先计算样本间的实际系统发育距离,然后通过1000次随机打乱物种在进化树上的位置来模拟零分布,看实际值偏离随机预期多远。

library(picante)
library(vegan)
library(ape)

# 读取数据
otu_table <- read.csv("otu_table.csv", row.names = 1)
tree <- read.tree("phylogenetic_tree.nwk")

# 确保OTU表和树匹配
common_taxa <- intersect(colnames(otu_table), tree$tip.label)
otu_table <- otu_table[, common_taxa]
tree <- keep.tip(tree, common_taxa)

# 计算βMNTD(Beta Mean Nearest Taxon Distance)
# 首先计算系统发育距离矩阵
phylo_dist <- cophenetic(tree)

# 观测的βMNTD
beta_mntd_obs <- comdistnt(otu_table, phylo_dist, abundance.weighted = TRUE)

# 零模型:999次随机化
n_rand <- 999
beta_mntd_rand <- array(NA, dim = c(nrow(otu_table), nrow(otu_table), n_rand))

set.seed(42)
for (i in 1:n_rand) {
  # 随机打乱物种在树上的位置
  rand_tree <- tree
  rand_tree$tip.label <- sample(rand_tree$tip.label)
  rand_phylo_dist <- cophenetic(rand_tree)
  beta_mntd_rand[, , i] <- as.matrix(comdistnt(otu_table, rand_phylo_dist,
                                                  abundance.weighted = TRUE))
  if (i %% 100 == 0) cat("Randomization:", i, "/", n_rand, "\n")
}

# 计算βNTI
beta_nti <- matrix(NA, nrow(otu_table), nrow(otu_table))
for (j in 1:(nrow(otu_table) - 1)) {
  for (k in (j + 1):nrow(otu_table)) {
    rand_vals <- beta_mntd_rand[j, k, ]
    beta_nti[j, k] <- (beta_mntd_obs[j, k] - mean(rand_vals)) / sd(rand_vals)
    beta_nti[k, j] <- beta_nti[j, k]
  }
}

rownames(beta_nti) <- colnames(beta_nti) <- rownames(otu_table)

# βNTI解读
cat("同质选择 (βNTI < -2):", sum(beta_nti[upper.tri(beta_nti)] < -2, na.rm = TRUE), "\n")
cat("异质选择 (βNTI > 2):", sum(beta_nti[upper.tri(beta_nti)] > 2, na.rm = TRUE), "\n")
cat("随机过程 (|βNTI| <= 2):", sum(abs(beta_nti[upper.tri(beta_nti)]) <= 2, na.rm = TRUE), "\n")

第三步:计算RCbray

白话解释:对于βNTI落在-2到2之间的样本对(非确定性过程),进一步用RCbray来区分是扩散限制、同质化扩散还是纯漂变。

# 计算RCbray
# Raup-Crick with Bray-Curtis modification
calc_rcbray <- function(otu_table, n_rand = 999) {
  n_samples <- nrow(otu_table)
  rc_matrix <- matrix(NA, n_samples, n_samples)
  obs_bray <- as.matrix(vegdist(otu_table, method = "bray"))

  # 零模型
  gamma_richness <- ncol(otu_table)
  species_pool <- colSums(otu_table > 0) / nrow(otu_table)  # 物种出现频率

  rand_bray <- array(NA, dim = c(n_samples, n_samples, n_rand))

  for (i in 1:n_rand) {
    rand_comm <- matrix(0, n_samples, ncol(otu_table))
    for (s in 1:n_samples) {
      n_species <- sum(otu_table[s, ] > 0)
      selected <- sample(1:gamma_richness, n_species, prob = species_pool)
      rand_comm[s, selected] <- 1
      # 重新分配丰度
      rand_comm[s, selected] <- rmultinom(1, sum(otu_table[s, ]), rep(1, n_species))
    }
    rand_bray[, , i] <- as.matrix(vegdist(rand_comm, method = "bray"))
  }

  # 计算RCbray
  for (j in 1:(n_samples - 1)) {
    for (k in (j + 1):n_samples) {
      p <- sum(rand_bray[j, k, ] >= obs_bray[j, k]) / n_rand
      rc_matrix[j, k] <- (p - 0.5) * 2
      rc_matrix[k, j] <- rc_matrix[j, k]
    }
  }

  rownames(rc_matrix) <- colnames(rc_matrix) <- rownames(otu_table)
  return(rc_matrix)
}

rcbray <- calc_rcbray(otu_table, n_rand = 999)

第四步:整合分析和可视化

library(ggplot2)
library(reshape2)

# 提取上三角
nti_vals <- beta_nti[upper.tri(beta_nti)]
rc_vals <- rcbray[upper.tri(rcbray)]

# 分类各过程
process <- rep(NA, length(nti_vals))
process[nti_vals > 2] <- "Variable Selection"
process[nti_vals < -2] <- "Homogeneous Selection"
process[abs(nti_vals) <= 2 & rc_vals > 0.95] <- "Dispersal Limitation"
process[abs(nti_vals) <= 2 & rc_vals < -0.95] <- "Homogenizing Dispersal"
process[abs(nti_vals) <= 2 & abs(rc_vals) <= 0.95] <- "Drift"

# 统计各过程比例
process_table <- table(process)
process_pct <- round(prop.table(process_table) * 100, 1)
print(process_pct)

# 饼图
df_process <- data.frame(
  Process = names(process_pct),
  Percentage = as.numeric(process_pct)
)

ggplot(df_process, aes(x = "", y = Percentage, fill = Process)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  theme_void() +
  geom_text(aes(label = paste0(Percentage, "%")),
            position = position_stack(vjust = 0.5)) +
  ggtitle("Community Assembly Processes") +
  scale_fill_brewer(palette = "Set2")

# βNTI分布直方图
ggplot(data.frame(bNTI = nti_vals), aes(x = bNTI)) +
  geom_histogram(bins = 30, fill = "steelblue", alpha = 0.7) +
  geom_vline(xintercept = c(-2, 2), linetype = "dashed", color = "red") +
  theme_minimal() +
  labs(x = "βNTI", y = "Count", title = "βNTI Distribution")

第五步:使用iCAMP简化分析

白话解释:iCAMP是一个专门用于群落组装分析的R包,它可以在每个系统发育分支(bin)水平上分别评估组装过程,比传统的全群落分析更精细。

library(iCAMP)

# 运行iCAMP
icamp_result <- icamp.big(
  comm = otu_table,
  tree = tree,
  pd.wd = "icamp_pd/",      # 工作目录
  rand = 999,                 # 随机化次数
  nworker = 8,                # 并行核心数
  memory.G = 16,              # 内存限制(GB)
  bin.size.limit = 24,        # 每个bin的最小物种数
  sig.index = c("Confidence", "SES.RC")
)

# 提取各过程比例
process_importance <- icamp_result$CbMPDiCBraya$processes

# 可视化
barplot(t(as.matrix(process_importance)),
        beside = FALSE,
        col = c("blue", "red", "green", "orange", "grey"),
        legend = TRUE,
        main = "Community Assembly Processes (iCAMP)")

实战命令速查

# βNTI快速计算(使用MicEco包)
library(MicEco)
bnti <- bNTI(otu_table, tree, runs = 999, cores = 8)

# iCAMP一行运行
result <- iCAMP::icamp.big(comm, tree, pd.wd = "pd/", rand = 999)

# NST(归一化随机比率)
library(NST)
nst_result <- tNST(comm = otu_table, group = metadata$group,
                    dist.method = "bray", abundance.weighted = TRUE,
                    rand = 999, nworker = 8)

面试常问点

Q1: βNTI>2和βNTI<-2分别代表什么生态过程? A: βNTI>2表示异质选择(variable selection),即不同环境条件筛选出系统发育上差异更大的群落。βNTI<-2表示同质选择(homogeneous selection),即相似环境筛选出系统发育上更相似的群落。

Q2: 为什么需要同时使用βNTI和RCbray? A: βNTI基于系统发育信息,只能区分确定性和随机过程。RCbray基于物种组成(无进化信息),用于进一步细分随机过程。两者结合才能完整区分5种组装过程。

Q3: 群落组装分析对进化树有什么要求? A: 需要高质量的系统发育树。16S rRNA基因树通常够用,但树的拓扑结构和分支长度会直接影响βNTI的计算。建议使用多序列比对+最大似然法建树。

Q4: 零模型的随机化次数选择? A: 通常使用999或9999次。999次对于初步分析足够,但如果样本量小或结果处于边缘显著,建议增加到9999次。随机化次数越多,结果越稳定但计算时间越长。

Q5: iCAMP相比传统βNTI方法有什么优势? A: iCAMP在系统发育分支(phylogenetic bin)水平上分析,可以揭示不同谱系受不同组装过程支配的情况。传统方法是全群落平均,可能掩盖谱系间的差异。

易错点

  1. OTU表和树不匹配:必须确保OTU表中的物种与树的tip完全对应
  2. 随机化次数太少:<100次的随机化不足以产生可靠的零分布
  3. βNTI阈值误用:标准阈值是±2(对应约95%置信区间),不要随意修改
  4. 忽略样本量要求:每组至少需要5-10个样本才能可靠估计过程比例
  5. 对稀有物种过度敏感:低丰度物种可能因抽样噪声影响结果,考虑适当过滤

补充知识

五种组装过程的判定框架

步骤条件过程
1βNTI > 2异质选择
2βNTI < -2同质选择
3|βNTI| ≤ 2 且 RCbray > 0.95扩散限制
4|βNTI| ≤ 2 且 RCbray < -0.95同质化扩散
5|βNTI| ≤ 2 且 |RCbray| ≤ 0.95漂变(非主导过程)

相关生态理论

  • 中性理论(Hubbell):群落主要由随机过程组装
  • 生态位理论:群落由环境筛选和种间竞争(确定性过程)组装
  • 现代综合观点:两种过程同时作用,关键是量化相对贡献