184_微生物群落组装分析¶
一句话概述¶
微生物群落组装分析研究哪些生态过程(确定性过程如环境筛选 vs 随机性过程如漂变和扩散)决定了微生物群落的组成和结构,通过零模型分析(βNTI、RCbray等指标)量化各过程的相对贡献。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| 群落组装理论 | 确定性过程 vs 随机性过程决定群落组成 |
| 确定性过程 | 环境筛选(同质/异质选择)、种间竞争 |
| 随机性过程 | 生态漂变、扩散限制、随机扩散 |
| βNTI | Beta Nearest Taxon Index,衡量系统发育周转偏离随机预期的程度 |
| RCbray | Raup-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)水平上分析,可以揭示不同谱系受不同组装过程支配的情况。传统方法是全群落平均,可能掩盖谱系间的差异。
易错点¶
- OTU表和树不匹配:必须确保OTU表中的物种与树的tip完全对应
- 随机化次数太少:<100次的随机化不足以产生可靠的零分布
- βNTI阈值误用:标准阈值是±2(对应约95%置信区间),不要随意修改
- 忽略样本量要求:每组至少需要5-10个样本才能可靠估计过程比例
- 对稀有物种过度敏感:低丰度物种可能因抽样噪声影响结果,考虑适当过滤
补充知识¶
五种组装过程的判定框架¶
| 步骤 | 条件 | 过程 |
|---|---|---|
| 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):群落主要由随机过程组装
- 生态位理论:群落由环境筛选和种间竞争(确定性过程)组装
- 现代综合观点:两种过程同时作用,关键是量化相对贡献