跳转至

微生物多样性分析(Microbial Diversity Analysis)

模块编号:02 | 彭文强 面试知识库 | 2026届 生信分析工程师


1. 一句话概述

微生物多样性分析通过扩增子测序(16S/ITS)或宏基因组测序数据,评估样本中微生物群落的组成(谁在那里)、结构(各有多少)和差异(组间有什么不同),是微生物组研究的核心分析内容。


2. 核心知识点

2.1 扩增子分析基础

2.1.1 常用标记基因

标记基因 目标生物 常用区段 典型引物 测序平台
16S rRNA 细菌/古菌(Bacteria/Archaea) V3-V4 区(最常用) 341F/806R Illumina PE250/PE300
16S rRNA 细菌/古菌 V4 区 515F/806R(Earth Microbiome Project) Illumina PE150
ITS 真菌(Fungi) ITS1 / ITS2 ITS1F/ITS2R Illumina PE250/PE300
18S rRNA 真核微生物(Eukaryota) V4 / V9 区 TAReuk454FWD1/TAReukREV3 Illumina PE250

为什么选 V3-V4 区? - V3-V4 区长度约 460 bp,包含足够的变异信息用于物种分类 - Illumina PE250/PE300 可以完全覆盖,双端拼接后质量好 - 数据库中 V3-V4 区的参考序列最全,注释准确率高

2.1.2 16S 扩增子 vs 宏基因组

对比项 16S 扩增子(Amplicon) 宏基因组(Metagenomics)
原理 PCR 扩增特定标记基因 直接打断全部 DNA 测序
分辨率 属级(genus)为主,种级(species)有限 可达种/株级(species/strain)
功能信息 无直接功能信息(可用 PICRUSt2 预测) 直接获得功能基因信息
引物偏好 有(primer bias),部分物种扩增不到 无引物偏好
成本 低(约 50-100 元/样本) 高(约 500-2000 元/样本)
数据量 5-10 万条 reads/样本 5-20 Gb/样本(通常 10 Gb)
宿主污染 低(引物特异性高) 需去宿主(如人、小鼠)
分析复杂度 低,流程标准化 高,涉及组装、binning 等
适用场景 大规模群落调查、临床筛查 深入功能研究、新物种发现
数据库依赖 SILVA / Greengenes2 / UNITE NCBI nr / GTDB / UniRef
定量方式 相对丰度(relative abundance) 相对丰度 / 可结合 spike-in 做绝对定量

💡 实习经验:在百迈客,16S 项目量远大于宏基因组项目,因为客户预算有限且很多课题只需要群落组成信息。宏基因组通常在需要功能分析或高分辨率物种鉴定时才会选用。


2.2 OTU vs ASV ★

对比项 OTU(Operational Taxonomic Unit) ASV(Amplicon Sequence Variant)
定义 按序列相似度(通常 97%)聚类的操作分类单元 经去噪(denoising)得到的精确序列变体
核心方法 聚类(clustering):UPARSE、CD-HIT、VSEARCH 去噪(denoising):DADA2、Deblur、UNOISE3
序列分辨率 97% 相似度,约属级 100% 精确,单碱基差异可区分
代表序列 聚类中心序列(centroid) 真实的生物序列(biological sequence)
跨研究可比性 差,不同研究聚类结果不可直接比较 好,同一序列在不同研究中一致
对噪音处理 聚类会将测序错误吸收进 OTU 统计模型主动识别并去除测序错误
特征表大小 较小(聚类后合并) 较大(保留更多真实变体)
主流趋势 传统方法,逐渐被 ASV 取代 当前推荐方法
代表工具 USEARCH/VSEARCH + QIIME 1 DADA2 + QIIME 2

DADA2 去噪原理简述: 1. 学习测序错误模型(error model):基于每个 run 的数据,拟合错误率与质量值的关系 2. 样本推断(sample inference):利用错误模型,区分真实生物序列和测序错误 3. 合并双端序列(merge paired reads):要求至少 12 bp 重叠,无错配 4. 去除嵌合体(remove chimeras):用 consensus 方法识别嵌合序列

📌 面试要记住:OTU 是 97% 聚类,ASV 是 100% 去噪;现在主流推荐 ASV(DADA2),因为分辨率更高、可跨研究比较。


2.3 Alpha 多样性(样本内多样性)★

Alpha 多样性(alpha diversity)衡量单个样本内微生物群落的多样性,回答"这个样本里的微生物种类有多丰富、分布有多均匀"。

2.3.1 常用指标详解

指标 英文名 衡量维度 值域范围 直觉理解
Observed species Observed features 丰富度(richness) >= 0,整数 直接数有多少种
Chao1 Chao1 index 丰富度估计 >= Observed 加上对稀有种的补偿估计
ACE ACE index 丰富度估计 >= Observed 类似 Chao1,用丰度分布估计
Shannon Shannon-Wiener index 丰富度 + 均匀度 0 ~ ln(S) 越大 = 种类多且分布均匀
Simpson Simpson's index (D) 优势度 0 ~ 1 越大 = 优势种越突出(低多样性)
Inverse Simpson 1/D 多样性 1 ~ S 越大 = 多样性越高
Pielou's evenness Pielou's J 均匀度 0 ~ 1 越接近 1 = 越均匀
Good's coverage Good's coverage 测序覆盖度 0 ~ 1 越接近 1 = 覆盖越充分
Faith's PD Faith's phylogenetic diversity 系统发育多样性 >= 0 进化枝越多 = 多样性越高

2.3.2 各指标详细说明

Observed species(观察到的物种数) - 最直观的丰富度指标,直接统计样本中出现的 ASV/OTU 数量 - 缺点:严重依赖测序深度,测序浅的样本值偏低 - 需要配合稀释曲线(rarefaction curve)评估

Chao1 指数 - 公式直觉:Chao1 = 已观察到的种数 + 对未观察到的稀有种的估计 - 核心思想:如果样本中有很多"只出现 1 次"(singleton)或"只出现 2 次"(doubleton)的物种,说明还有很多稀有种没被测到 - Chao1 = S_obs + F1^2 / (2 * F2),其中 F1 = singleton 数,F2 = doubleton 数 - 值增大:说明样本有更多物种(包括估计的稀有种) - 值减小/接近 Observed:说明大部分物种已被充分采样

ACE 指数(Abundance-based Coverage Estimator) - 与 Chao1 类似,但利用丰度 <= 10 的物种分布来估计 - 对稀有物种的估计更稳健 - 通常与 Chao1 趋势一致

Shannon 指数(Shannon-Wiener Index) ★ - H = -sum(pi * ln(pi)),其中 pi 是第 i 个物种的相对丰度 - 同时考虑丰富度(种类数)和均匀度(分布是否均匀) - 值范围:0(只有 1 个物种)到 ln(S)(所有物种等比例) - 典型值:肠道微生物 2-5,土壤微生物 5-10 - H 增大 = 物种多且分布均匀 = 高多样性 - H 减小 = 物种少或某些种极度优势 = 低多样性

Simpson 指数 ★ - D = sum(pi^2),衡量"随机取两个个体属于同一物种"的概率 - ⚠️ 注意方向:D 越大 = 优势种越突出 = 多样性越低 - 这与 Shannon 指数方向相反!Shannon 越大多样性越高,Simpson 的 D 越大多样性越低 - 因此常用 1-D(Gini-Simpson)或 1/D(Inverse Simpson)来与 Shannon 方向一致 - 1-D 值范围:0(完全单一)到 1-1/S(非常多样)

⚠️ 易混淆:Shannon 越大 = 多样性越高;Simpson 的 D 越大 = 多样性越低。面试时一定注意这个方向差异!软件输出的"Simpson"可能是 D、1-D 或 1/D,要看清楚文档。

Good's coverage(Good 覆盖度) - 估计测序对群落的覆盖程度 - 公式:C = 1 - (F1 / N),F1 = singleton 数,N = 总序列数 - 值 > 0.97 通常认为测序深度足够 - 值 < 0.90 建议增加测序深度

Faith's PD(Faith 系统发育多样性) - 计算样本中所有物种在系统发育树上覆盖的总枝长 - 既考虑物种数,又考虑物种间的进化距离 - 优点:进化距离越远的物种贡献越大 - 需要构建系统发育树(QIIME 2 中用 fragment-insertion 或 align-to-tree-mafft-fasttree)

2.3.3 Alpha 多样性统计检验

比较场景 统计方法 R/QIIME2 函数
两组比较 Wilcoxon 秩和检验(非参数) wilcox.test() / qiime diversity alpha-group-significance
多组比较 Kruskal-Wallis 检验 kruskal.test() / qiime diversity alpha-group-significance
多组两两比较 Dunn 检验(事后检验) dunn.test::dunn.test()
配对样本 Wilcoxon 符号秩检验 wilcox.test(paired=TRUE)

2.4 Beta 多样性(样本间差异)★

Beta 多样性(beta diversity)衡量不同样本之间微生物群落组成的差异程度,回答"这些样本的微生物群落有多不一样"。

2.4.1 常用距离/相异度

距离指标 英文 考虑因素 值域 适用场景
Bray-Curtis Bray-Curtis dissimilarity 物种丰度差异 0~1 最常用,关注丰度变化
Jaccard Jaccard distance 物种有无(presence/absence) 0~1 只关心组成,不关心丰度
Weighted UniFrac Weighted UniFrac 丰度 + 进化关系 0~1 丰度差异 + 系统发育
Unweighted UniFrac Unweighted UniFrac 有无 + 进化关系 0~1 稀有种差异 + 系统发育
Euclidean Euclidean distance 丰度绝对差 >= 0 较少用于微生物组
Aitchison Aitchison distance 组分数据(CLR 变换后) >= 0 组分数据分析推荐

2.4.2 核心距离详解

Bray-Curtis 距离 ★ - 公式直觉:两个样本共有物种的丰度差异 / 总丰度 - BC = 1 - 2 * sum(min(xi, yi)) / (sum(xi) + sum(yi)) - 0 = 两样本完全相同 - 1 = 两样本没有任何共有物种 - 最常用的 beta 多样性距离,适合大多数微生物组分析 - 对丰度敏感,优势种影响大

UniFrac 距离 ★ - 独特之处:考虑物种间的进化关系(phylogenetic relationship) - 需要系统发育树作为输入

类型 Weighted UniFrac Unweighted UniFrac
考虑因素 物种进化距离 + 丰度 仅物种进化距离(有/无)
敏感性 对优势种(高丰度物种)变化敏感 对稀有种(低丰度/独有物种)变化敏感
适用场景 群落结构整体差异 物种组成差异(不论丰度)
计算 进化枝长 * 丰度权重 仅计算独有枝长比例

📌 选择建议: - 关注整体群落变化(优势种主导)→ Weighted UniFrac 或 Bray-Curtis - 关注稀有种或物种组成差异 → Unweighted UniFrac 或 Jaccard - 没有系统发育树 → Bray-Curtis(不需要树) - 有树且想考虑进化 → UniFrac

Jaccard 距离 - 只考虑物种是否存在(有/无),不考虑丰度 - J = 1 - |A ∩ B| / |A ∪ B| - 适合关注"共有了哪些物种"而非"各有多少"

2.4.3 可视化方法

方法 英文 原理 优缺点
PCoA Principal Coordinates Analysis 基于距离矩阵的降维 最常用,保留距离关系
NMDS Non-metric Multidimensional Scaling 非参数排序,保留秩次 stress < 0.2 可接受
PCA Principal Component Analysis 基于原始数据的降维 适合 CLR 变换后的数据
CCA/RDA Constrained Analysis 约束排序,结合环境因子 解释环境因子的影响
UPGMA 树 UPGMA clustering 层次聚类 展示样本间层次关系

PCoA vs NMDS: - PCoA:线性方法,保留实际距离,轴有百分比解释度 - NMDS:非线性方法,保留距离的秩次关系,用 stress 值评估拟合 - 一般优先 PCoA,NMDS 在非线性关系明显时更好

2.4.4 统计检验 ★

方法 英文 用途 工具/函数
PERMANOVA Permutational MANOVA 检验组间群落结构是否有显著差异 vegan::adonis2() / qiime diversity beta-group-significance
ANOSIM Analysis of Similarities 类似 PERMANOVA,非参数 vegan::anosim()
PERMDISP Permutational Dispersion 检验组间方差是否均一(PERMANOVA 前提) vegan::betadisper()
Mantel test Mantel test 检验距离矩阵间的相关性 vegan::mantel()

PERMANOVA(adonis) ★ - 最常用的 beta 多样性统计检验 - 原理:将总变异分解为组间和组内,用置换检验(permutation test)评估显著性 - 前提假设:各组方差齐性(需先做 PERMDISP 检验) - p < 0.05 说明组间差异显著 - R^2 值反映分组因素解释了多少变异


2.5 差异分析 ★

差异分析用于找出哪些特定微生物在不同组间有显著差异,即寻找"标志物"(biomarker)。

2.5.1 常用方法对比

方法 全称 原理 输入 优势 局限
LEfSe LDA Effect Size Kruskal-Wallis + LDA 相对丰度 直观、图形好看、广泛引用 假阳性偏高、不校正
DESeq2 Differential Expression (adapted) 负二项分布模型 raw counts 统计严谨、自动 FDR 校正 对零膨胀敏感
ANCOM-BC ANCOM with Bias Correction 组分数据分析 raw counts 处理组分性偏差 计算复杂
Wilcoxon Wilcoxon rank-sum test 非参数秩检验 相对丰度 简单稳健 需人工多重校正
MaAsLin2 Microbiome Multivariable Association 多变量线性模型 相对丰度/counts 可纳入协变量 参数选择影响大
ALDEx2 ANOVA-Like Differential Expression 2 CLR + 贝叶斯 raw counts 处理组分数据好 保守(假阴性偏高)

2.5.2 LEfSe 详解 ★

LEfSe(Linear Discriminant Analysis Effect Size) 是微生物组差异分析中最广泛使用的工具之一。

分析步骤: 1. Kruskal-Wallis 检验:在所有组间检验每个分类单元是否有显著差异(p < 0.05) 2. Wilcoxon 秩和检验:对通过步骤 1 的分类单元,做两两组间比较,确认差异一致 3. LDA 打分:用线性判别分析计算效应值(effect size),默认 LDA > 2 为显著

结果解读: - LDA 柱状图:每个柱子代表一个显著差异的分类单元,长度 = 效应值大小,颜色 = 富集在哪个组 - 进化分支图(cladogram):在分类树上标注差异物种及其归属组 - LDA > 2:弱差异;LDA > 3:中等差异;LDA > 4:强差异

⚠️ 注意:LEfSe 不做多重检验校正,在物种数多时可能有假阳性。高分文章建议配合 DESeq2 或 ANCOM-BC 交叉验证。

2.5.3 多重检验校正

方法 英文 严格程度 适用场景
Bonferroni Bonferroni correction 最严格 少量比较
FDR (BH) Benjamini-Hochberg 中等 最常用,控制假发现率
FDR (BY) Benjamini-Yekutieli 较严格 相关检验较多时

⚠️ 易错:做多组比较时,必须进行多重检验校正。不做校正的 p 值会大幅膨胀假阳性。用 p.adjust(p, method="BH") 校正。


2.6 分析流程总览

原始数据 (FASTQ)
    |
    v
[1] 质量控制 (QC) ─── fastp / Trimmomatic / Cutadapt(去引物)
    |
    v
[2] 去噪/聚类 ─── DADA2(推荐)/ VSEARCH / Deblur
    |
    v
[3] 特征表 (Feature Table) + 代表序列 (Rep Seqs)
    |
    v
[4] 物种注释 ─── classify-sklearn (QIIME2) → SILVA / Greengenes2 / UNITE
    |
    v
[5] 构建进化树 ─── MAFFT 比对 → FastTree 建树
    |
    v
[6] Alpha 多样性 ─── Shannon, Chao1, Observed, Faith's PD...
    |
    v
[7] Beta 多样性 ─── Bray-Curtis, UniFrac → PCoA/NMDS → PERMANOVA
    |
    v
[8] 差异分析 ─── LEfSe / DESeq2 / ANCOM-BC
    |
    v
[9] 功能预测 ─── PICRUSt2(16S→功能预测)/ Tax4Fun2
    |
    v
[10] 可视化 & 报告 ─── 柱状图、热图、网络图、Venn图

3. 实战命令/代码

3.1 QIIME 2 扩增子分析流程

# ============================================================
# QIIME 2 16S 扩增子分析流程
# 环境:conda activate qiime2-amplicon-2024.5
# ============================================================

# ---------- 0. 数据导入 ----------
# 将 FASTQ 文件导入 QIIME 2 格式(.qza)
# manifest 文件包含样本名和 FASTQ 路径的对应关系
qiime tools import \
  --type 'SampleData[PairedEndSequencesWithQuality]' \
  --input-path manifest.tsv \                 # 样本清单文件
  --output-path paired-end-demux.qza \        # 输出的 qza 文件
  --input-format PairedEndFastqManifestPhred33V2  # 输入格式

# 查看导入数据的质量分布(生成可视化文件)
qiime demux summarize \
  --i-data paired-end-demux.qza \
  --o-visualization paired-end-demux.qzv      # 用 view.qiime2.org 查看

# ---------- 1. DADA2 去噪 ----------
# 根据质量分布图确定截断位置
# 📌 trunc-len 参数需要根据质量图调整,确保双端拼接有 >= 12 bp 重叠
qiime dada2 denoise-paired \
  --i-demultiplexed-seqs paired-end-demux.qza \
  --p-trim-left-f 0 \              # 正向读段左端裁剪长度(去引物后设 0)
  --p-trim-left-r 0 \              # 反向读段左端裁剪长度
  --p-trunc-len-f 230 \            # 正向读段截断到 230 bp(根据质量图)
  --p-trunc-len-r 220 \            # 反向读段截断到 220 bp
  --p-n-threads 16 \               # 使用 16 个线程
  --o-table table.qza \            # 输出特征表(ASV 丰度矩阵)
  --o-representative-sequences rep-seqs.qza \  # 输出代表序列
  --o-denoising-stats dada2-stats.qza          # 输出去噪统计

# 查看去噪统计(检查每步保留了多少序列)
qiime metadata tabulate \
  --m-input-file dada2-stats.qza \
  --o-visualization dada2-stats.qzv

# 查看特征表摘要(样本数、ASV 数、测序深度)
qiime feature-table summarize \
  --i-table table.qza \
  --o-visualization table.qzv \
  --m-sample-metadata-file metadata.tsv

# ---------- 2. 物种注释 ----------
# 使用预训练的 Naive Bayes 分类器
# 📌 分类器要与引物区段和 SILVA 版本匹配
qiime feature-classifier classify-sklearn \
  --i-classifier silva-138-99-nb-classifier-V3V4.qza \  # SILVA 138 V3-V4 分类器
  --i-reads rep-seqs.qza \
  --p-n-jobs 16 \
  --o-classification taxonomy.qza

# 查看注释结果
qiime metadata tabulate \
  --m-input-file taxonomy.qza \
  --o-visualization taxonomy.qzv

# 生成物种组成柱状图(不同分类水平)
qiime taxa barplot \
  --i-table table.qza \
  --i-taxonomy taxonomy.qza \
  --m-metadata-file metadata.tsv \
  --o-visualization taxa-bar-plots.qzv

# ---------- 3. 构建进化树 ----------
# 用于计算 UniFrac 距离
qiime phylogeny align-to-tree-mafft-fasttree \
  --i-sequences rep-seqs.qza \
  --o-alignment aligned-rep-seqs.qza \     # MAFFT 多序列比对
  --o-masked-alignment masked-aligned.qza \ # 屏蔽高变异位点
  --o-tree unrooted-tree.qza \             # 无根树
  --o-rooted-tree rooted-tree.qza \        # 有根树(用于 UniFrac)
  --p-n-threads 16

# ---------- 4. Alpha + Beta 多样性核心分析 ----------
# 📌 sampling-depth 根据 table.qzv 中最小测序深度确定
# 一般取最小深度附近,排除测序太浅的样本
qiime diversity core-metrics-phylogenetic \
  --i-phylogeny rooted-tree.qza \
  --i-table table.qza \
  --p-sampling-depth 10000 \    # 稀释深度,需根据数据调整
  --m-metadata-file metadata.tsv \
  --p-n-jobs-or-threads 16 \
  --output-dir core-metrics-results   # 输出目录,包含多个结果文件

# 输出目录包含:
# - shannon_vector.qza          Shannon 指数
# - observed_features_vector.qza  Observed species
# - faith_pd_vector.qza          Faith's PD
# - evenness_vector.qza          Pielou 均匀度
# - bray_curtis_distance_matrix.qza    Bray-Curtis 距离矩阵
# - weighted_unifrac_distance_matrix.qza  Weighted UniFrac
# - unweighted_unifrac_distance_matrix.qza  Unweighted UniFrac
# - bray_curtis_emperor.qzv      PCoA 可视化(Emperor)
# ... 等

# ---------- 5. Alpha 多样性组间比较 ----------
# Kruskal-Wallis 检验各组 Shannon 指数差异
qiime diversity alpha-group-significance \
  --i-alpha-diversity core-metrics-results/shannon_vector.qza \
  --m-metadata-file metadata.tsv \
  --o-visualization shannon-group-significance.qzv

# Chao1 指数需要单独计算(core-metrics 不包含 Chao1)
qiime diversity alpha \
  --i-table table.qza \
  --p-metric chao1 \
  --o-alpha-diversity chao1_vector.qza

qiime diversity alpha-group-significance \
  --i-alpha-diversity chao1_vector.qza \
  --m-metadata-file metadata.tsv \
  --o-visualization chao1-group-significance.qzv

# ---------- 6. Beta 多样性统计检验 ----------
# PERMANOVA 检验(基于 Bray-Curtis)
qiime diversity beta-group-significance \
  --i-distance-matrix core-metrics-results/bray_curtis_distance_matrix.qza \
  --m-metadata-file metadata.tsv \
  --m-metadata-column Group \         # 分组列名
  --p-method permanova \              # 使用 PERMANOVA
  --p-pairwise \                      # 两两比较
  --o-visualization bray-curtis-permanova.qzv

# PERMANOVA 检验(基于 Weighted UniFrac)
qiime diversity beta-group-significance \
  --i-distance-matrix core-metrics-results/weighted_unifrac_distance_matrix.qza \
  --m-metadata-file metadata.tsv \
  --m-metadata-column Group \
  --p-method permanova \
  --p-pairwise \
  --o-visualization weighted-unifrac-permanova.qzv

# ---------- 7. 稀释曲线 ----------
qiime diversity alpha-rarefaction \
  --i-table table.qza \
  --i-phylogeny rooted-tree.qza \
  --p-max-depth 50000 \             # 最大稀释深度
  --p-steps 20 \                    # 采样步数
  --m-metadata-file metadata.tsv \
  --o-visualization alpha-rarefaction.qzv

3.2 R 语言分析代码

# ============================================================
# R 语言微生物多样性分析
# 需要安装:vegan, ggplot2, phyloseq, ape
# ============================================================

# ---------- 加载包 ----------
library(vegan)      # 群落生态学核心包
library(ggplot2)    # 画图
library(ape)        # 进化树操作

# ---------- 读取数据 ----------
# 特征表:行=样本,列=物种/ASV
otu_table <- read.csv("otu_table.csv", row.names = 1, check.names = FALSE)
# 分组信息
metadata <- read.csv("metadata.csv", row.names = 1)

# ---------- Alpha 多样性计算 ----------

# Shannon 指数
shannon <- diversity(otu_table, index = "shannon")

# Simpson 指数(注意:vegan 返回的是 1-D,即 Gini-Simpson)
simpson <- diversity(otu_table, index = "simpson")

# Observed species(观测到的物种数)
observed <- specnumber(otu_table)

# Chao1 指数(使用 estimateR 函数,需要整数 count 数据)
# estimateR 返回多个估计值,包含 S.chao1
chao1_result <- t(estimateR(round(otu_table)))  # 需要整数输入
chao1 <- chao1_result[, "S.chao1"]

# ACE 指数
ace <- chao1_result[, "S.ACE"]

# Pielou 均匀度 = Shannon / ln(Observed)
pielou <- shannon / log(observed)

# 汇总为数据框
alpha_div <- data.frame(
  Sample = rownames(otu_table),
  Group = metadata[rownames(otu_table), "Group"],  # 从 metadata 获取分组
  Shannon = round(shannon, 3),
  Simpson = round(simpson, 3),
  Observed = observed,
  Chao1 = round(chao1, 1),
  ACE = round(ace, 1),
  Pielou = round(pielou, 3)
)

# ---------- Alpha 多样性箱线图 ----------

# Shannon 指数箱线图
p_shannon <- ggplot(alpha_div, aes(x = Group, y = Shannon, fill = Group)) +
  geom_boxplot(outlier.shape = NA, alpha = 0.7) +    # 箱线图,隐藏离群点
  geom_jitter(width = 0.2, size = 1.5, alpha = 0.6) + # 添加散点
  theme_bw() +                                         # 白色背景主题
  labs(
    title = "Shannon Diversity Index",
    x = "Group",
    y = "Shannon Index"
  ) +
  theme(legend.position = "none") +   # 隐藏图例(颜色已区分)
  stat_compare_means(method = "wilcox.test")  # 添加 p 值(需 ggpubr 包)

ggsave("alpha_shannon_boxplot.pdf", p_shannon, width = 6, height = 5)

# ---------- Alpha 多样性统计检验 ----------

# 两组比较:Wilcoxon 秩和检验
wilcox_shannon <- wilcox.test(
  Shannon ~ Group,
  data = alpha_div
)
cat("Shannon Wilcoxon p-value:", wilcox_shannon$p.value, "\n")

# 多组比较:Kruskal-Wallis 检验
kw_shannon <- kruskal.test(Shannon ~ Group, data = alpha_div)
cat("Shannon Kruskal-Wallis p-value:", kw_shannon$p.value, "\n")

# 多组事后两两比较:Dunn 检验(需 dunn.test 包)
# library(dunn.test)
# dunn.test(alpha_div$Shannon, alpha_div$Group, method = "bh")

# ---------- 稀释曲线(Rarefaction Curve) ----------

# 使用 vegan 的 rarecurve 函数
pdf("rarefaction_curve.pdf", width = 8, height = 6)
rarecurve(
  round(otu_table),     # 需要整数 count
  step = 200,           # 每隔 200 条序列采样一次
  col = as.numeric(factor(metadata$Group)),  # 按组着色
  lwd = 1.5,
  xlab = "Number of Sequences",   # X 轴:测序深度
  ylab = "Observed Species",      # Y 轴:观测物种数
  main = "Rarefaction Curves"
)
# 曲线趋于平台 = 测序深度足够
# 曲线仍在上升 = 测序深度不足
dev.off()

# ---------- Beta 多样性分析 ----------

# 1. 计算 Bray-Curtis 距离矩阵
bc_dist <- vegdist(otu_table, method = "bray")

# 2. 计算 Jaccard 距离矩阵(基于有无)
jaccard_dist <- vegdist(otu_table, method = "jaccard", binary = TRUE)

# 3. PCoA 分析(基于 Bray-Curtis)
pcoa_result <- cmdscale(bc_dist, k = 2, eig = TRUE)  # 取前 2 个轴

# 计算各轴解释度
eig_percent <- round(pcoa_result$eig / sum(pcoa_result$eig) * 100, 1)

# 整理 PCoA 数据
pcoa_df <- data.frame(
  PC1 = pcoa_result$points[, 1],
  PC2 = pcoa_result$points[, 2],
  Group = metadata[rownames(pcoa_result$points), "Group"]
)

# 4. PCoA 画图
p_pcoa <- ggplot(pcoa_df, aes(x = PC1, y = PC2, color = Group)) +
  geom_point(size = 3, alpha = 0.8) +       # 样本散点
  stat_ellipse(level = 0.95, linewidth = 0.8) +  # 95% 置信椭圆
  theme_bw() +
  labs(
    title = "PCoA based on Bray-Curtis Distance",
    x = paste0("PC1 (", eig_percent[1], "%)"),  # 轴标签含解释度
    y = paste0("PC2 (", eig_percent[2], "%)")
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),   # 标题居中
    legend.position = "right"
  )

ggsave("pcoa_bray_curtis.pdf", p_pcoa, width = 7, height = 5)

# ---------- NMDS 分析 ----------
nmds_result <- metaMDS(
  otu_table,
  distance = "bray",
  k = 2,            # 2 维
  trymax = 100      # 最大迭代次数
)
cat("NMDS stress:", nmds_result$stress, "\n")
# stress < 0.05:非常好
# stress < 0.1:好
# stress < 0.2:可接受
# stress > 0.2:不可靠

# ---------- PERMANOVA 统计检验 ----------

# 📌 最重要的 beta 多样性统计检验
permanova_result <- adonis2(
  otu_table ~ Group,            # 公式:特征表 ~ 分组因子
  data = metadata,
  method = "bray",              # 使用 Bray-Curtis 距离
  permutations = 999            # 置换次数
)
print(permanova_result)
# 关注:
# - Pr(>F) 即 p 值,< 0.05 说明组间差异显著
# - R2 值:分组因素解释了多少比例的变异
# - F 值:越大说明组间差异相对组内越大

# PERMDISP:检验方差齐性(PERMANOVA 的前提)
betadisp_result <- betadisper(bc_dist, metadata$Group)
permutest(betadisp_result)
# p > 0.05:方差齐性假设成立,PERMANOVA 结果可靠
# p < 0.05:方差不齐,PERMANOVA 显著可能是方差差异导致

# ---------- ANOSIM 检验 ----------
anosim_result <- anosim(
  otu_table,
  metadata$Group,
  distance = "bray",
  permutations = 999
)
print(anosim_result)
# R 值范围 -1 ~ 1
# R > 0.75:组间差异大
# R > 0.5:组间差异中等
# R > 0.25:组间差异小
# R ~ 0:无差异

3.3 LEfSe 分析流程

# ============================================================
# LEfSe 分析流程
# 环境:conda activate lefse
# 输入:lefse_input.txt(第一行为分组信息,后续行为物种丰度)
# ============================================================

# 格式说明:lefse_input.txt 格式
# 第 1 行:class(分组信息)
# 第 2 行(可选):subclass(亚组信息)
# 第 3 行(可选):subject(个体ID)
# 后续行:每行一个物种的相对丰度

# 步骤 1:格式化输入文件
# 将文本格式转换为 LEfSe 内部格式
lefse_format_input.py \
  lefse_input.txt \         # 输入文件
  lefse_formatted.in \      # 格式化后的文件
  -c 1 \                    # 第 1 行是 class(主分组)
  -s 2 \                    # 第 2 行是 subclass(可选,没有则去掉 -s)
  -u 3 \                    # 第 3 行是 subject(可选)
  -o 1000000                # 归一化到百万

# 步骤 2:运行 LEfSe 分析
# Kruskal-Wallis + Wilcoxon + LDA
lefse_run.py \
  lefse_formatted.in \      # 输入
  lefse_results.res \       # 输出结果
  -l 2.0 \                  # LDA 阈值(默认 2.0,可调高到 3.0/4.0 更严格)
  -a 0.05 \                 # Kruskal-Wallis p 值阈值
  -w 0.05                   # Wilcoxon p 值阈值

# 步骤 3:绘制 LDA 柱状图
lefse_plot_res.py \
  lefse_results.res \
  lefse_lda_bar.pdf \       # 输出柱状图
  --format pdf \
  --dpi 300

# 步骤 4:绘制进化分支图(cladogram)
lefse_plot_cladogram.py \
  lefse_results.res \
  lefse_cladogram.pdf \
  --format pdf \
  --dpi 300

# 查看显著差异物种列表
# 筛选 LDA > 2 且有分组归属的结果
grep -v "^$" lefse_results.res | awk -F'\t' '$4 != ""' | sort -k4 -nr
# 输出列含义:
# 第 1 列:物种分类
# 第 2 列:log 最高均值对应的组
# 第 3 列:该物种的 LDA 得分
# 第 4 列:该物种在哪个组中富集(空 = 不显著)

3.4 功能预测(PICRUSt2)

# ============================================================
# PICRUSt2:基于 16S 预测功能基因组成
# 环境:conda activate picrust2
# 注意:PICRUSt2 结果是"预测",不能替代宏基因组
# ============================================================

# 一步法运行(推荐)
picrust2_pipeline.py \
  -s rep-seqs.fasta \           # ASV 代表序列(FASTA 格式)
  -i feature_table.biom \       # 特征表(BIOM 格式)
  -o picrust2_output \          # 输出目录
  -p 16 \                      # 线程数
  --stratified                  # 输出每个 ASV 对功能的贡献

# 输出文件:
# picrust2_output/
# ├── EC_metagenome_out/      EC 酶注释结果
# ├── KO_metagenome_out/      KEGG KO 注释结果
# ├── pathways_out/           MetaCyc 通路丰度
# └── ...

# 将 KO 丰度表转换为 KEGG 通路丰度
# 可用于后续 STAMP 或 R 画图

4. 面试常问点

★ 什么是 alpha 多样性和 beta 多样性?区别是什么?

参考答案:

Alpha 多样性衡量的是单个样本内微生物群落的多样性,主要关注物种丰富度(有多少种)和均匀度(分布是否均匀)。常用指标包括 Shannon 指数、Simpson 指数、Chao1 指数等。

Beta 多样性衡量的是不同样本之间微生物群落的差异程度,回答"两个样本的微生物组成有多大不同"。常用 Bray-Curtis 距离、UniFrac 距离等来量化,用 PCoA 或 NMDS 来可视化,用 PERMANOVA 来统计检验。

简单来说:alpha 看"一个样本有多丰富",beta 看"两个样本有多不同"。

💡 加分回答:在百迈客做 16S 项目时,我们标准分析流程中 alpha 和 beta 多样性都是必做的。alpha 多样性用箱线图展示组间差异,beta 多样性用 PCoA 图展示样本聚类情况。客户最关心的往往是 PCoA 图上两组是否明显分开,以及 PERMANOVA 的 p 值是否显著。


★ Shannon 和 Simpson 指数的区别?

参考答案:

两者都是 alpha 多样性指标,但侧重不同:

Shannon 指数: - 同时考虑物种丰富度和均匀度 - 对稀有物种更敏感(因为用 ln 变换,稀有种的贡献不会被压缩太多) - 值越大,多样性越高

Simpson 指数(D): - 更侧重优势种的影响 - 表示"随机取两个个体属于同一物种的概率" - D 越大,优势种越突出,多样性越(方向与 Shannon 相反) - 实际使用时常用 1-D 或 1/D,使方向与 Shannon 一致

最重要的区别是对稀有种的敏感度:Shannon 更敏感,Simpson 更关注优势种。如果样本间稀有种差异大,Shannon 更能体现;如果优势种变化是关注点,Simpson 更合适。


★ Bray-Curtis 和 UniFrac 的区别?什么时候用哪个?

参考答案:

核心区别:是否考虑进化关系。

  • Bray-Curtis:只基于物种丰度计算,不考虑物种间的进化距离。两个物种无论亲缘关系远近,丰度差异的权重相同。
  • UniFrac:利用系统发育树,考虑物种间的进化距离。亲缘关系远的物种差异贡献更大。

选择建议:

场景 推荐距离 原因
有系统发育树,想考虑进化关系 Weighted/Unweighted UniFrac 进化信息是额外维度
没有系统发育树(如功能基因分析) Bray-Curtis 不需要树
关注优势种的丰度变化 Weighted UniFrac / Bray-Curtis 两者都对丰度敏感
关注稀有种/独有种的差异 Unweighted UniFrac 只看有无,不看丰度
通用/不确定 Bray-Curtis 最常用,发表最多

实际项目中通常同时做多个距离,放在补充材料或正文中展示一致性。

💡 加分回答:在百迈客的报告中,我们一般同时给 Bray-Curtis 和 Weighted UniFrac 的 PCoA 图,让客户看两种距离下的聚类是否一致。如果两种距离结果一致,说明结论更可靠。


★ OTU 和 ASV 的区别?现在推荐用哪个?

参考答案:

对比 OTU ASV
方法 97% 相似度聚类 DADA2 等去噪,保留精确序列
分辨率 低(约属级) 高(单碱基可区分)
可重复性 低,不同研究聚类结果不同 高,同一序列跨研究可比

现在推荐 ASV(DADA2),原因: 1. 单碱基分辨率,能区分更多真实变体 2. 可跨研究比较(同一 ASV 序列全球通用) 3. 不会将不同物种错误合并(97% 聚类可能把近缘种合并) 4. QIIME 2 默认使用 DADA2,已成行业标准

但 OTU 在老文献中仍然很常见,读文献时需要理解。


★ 如何判断两组样本的微生物群落有显著差异?

参考答案:

判断方法分两个层面:

整体群落层面(beta 多样性): 1. 计算距离矩阵(如 Bray-Curtis) 2. 做 PCoA 可视化,看两组是否在图上分开 3. 用 PERMANOVA(adonis2 函数)做统计检验 - p < 0.05:组间差异显著 - R^2:分组因素解释了多少变异 4. 先做 PERMDISP 检验方差齐性(PERMANOVA 的前提)

单个物种层面(差异分析): 1. 用 LEfSe 找哪些物种在不同组间有显著差异 2. 用 DESeq2 或 ANCOM-BC 进行更严谨的差异丰度分析 3. 注意做多重检验校正(FDR)

💡 实习经验回答:在百迈客做项目时,标准分析报告中我们先用 PCoA 展示整体差异趋势,再用 PERMANOVA 给出 p 值,最后用 LEfSe 找具体的差异物种。客户看报告时最在意的三个数字:PERMANOVA 的 p 值、R^2 值,以及 LEfSe 中 LDA 最高的物种是什么。


★ LEfSe 分析的原理和结果怎么解读?

参考答案:

原理(三步法): 1. Kruskal-Wallis 检验:在所有组间筛选差异显著的物种(p < 0.05) 2. Wilcoxon 秩和检验:对通过第一步的物种做两两组间比较,确认差异方向一致 3. LDA 打分:用线性判别分析计算效应值,量化差异的生物学意义

结果解读: - LDA 柱状图:每个柱子 = 一个显著差异物种,长度 = 效应值大小(LDA score),颜色 = 富集在哪个组 - LDA > 2:差异显著(默认阈值) - LDA > 3 或 > 4:差异更强 - 进化分支图(cladogram):在分类树上用不同颜色标注各组的标志物种,从门到属逐层展示

局限性: - 不做多重检验校正,物种数多时假阳性偏高 - 建议配合 DESeq2 或 ANCOM-BC 交叉验证


★ 稀释曲线的作用是什么?怎么判断测序深度够不够?

参考答案:

作用: 评估测序深度是否足够捕获样本中的物种多样性。

原理: 随机从测序数据中抽取不同数量的序列,计算对应的物种数(observed species),绘制"序列数-物种数"曲线。

判断标准: - 曲线趋于平台:说明测序深度足够,继续增加测序量也不会发现新物种 → 测序深度 OK - 曲线仍在上升:说明还有很多物种没被测到,测序深度不足 → 需要增加测序量 - 定量指标:Good's coverage > 0.97 通常认为足够

面试加分: - 稀释曲线不仅评估测序深度,还能初步比较样本间的物种丰富度 - 如果不同组的曲线平台高度不同,说明这些组的物种丰富度确实有差异 - 在做 alpha 多样性分析前,通常需要将所有样本稀释(rarefy)到相同测序深度,以消除测序量差异的影响

💡 实习经验:在百迈客,客户有时会问"测序够不够深",我们就看稀释曲线。16S 项目通常 5-10 万条 clean reads 就足够了,Good's coverage 一般都在 0.99 以上。


★ 你在百迈客做 16S 项目时,分析流程是怎样的?

参考答案:

标准 16S 分析流程:

  1. 数据质控:用 fastp 或 Cutadapt 去引物、去低质量碱基、去接头
  2. DADA2 去噪:在 QIIME 2 中运行 DADA2,得到 ASV 特征表和代表序列
  3. 物种注释:用 classify-sklearn 分类器比对 SILVA 138 数据库,得到各 ASV 的分类信息
  4. Alpha 多样性:计算 Shannon、Simpson、Chao1、Observed species 等指标,做组间比较(Wilcoxon/Kruskal-Wallis)
  5. Beta 多样性:计算 Bray-Curtis 和 UniFrac 距离,做 PCoA 可视化,PERMANOVA 检验
  6. 物种组成:绘制各分类水平(门、纲、目、科、属)的物种组成柱状图
  7. 差异分析:用 LEfSe 找标志物种,必要时用 DESeq2 补充
  8. 功能预测(客户需要时):用 PICRUSt2 预测 KEGG 通路
  9. 出报告:整理结果图表,撰写分析报告

💡 关键细节: - 引物序列必须去干净,否则影响 DADA2 去噪和物种注释 - DADA2 的 trunc-len 参数要根据质量图调整,保证拼接重叠 >= 12 bp - 稀释深度要根据最小测序量确定,太低会丢样本,太高会丢信息 - 报告中要给 Good's coverage,证明测序深度充分


5. 易错/易混淆点

⚠️ Shannon vs Simpson 方向相反

  • Shannon 越大 = 多样性越高
  • Simpson D 越大 = 多样性越低(优势种越突出)
  • 软件输出的 "Simpson" 可能是 D、1-D 或 1/D,需查看文档
  • R 的 vegan 包 diversity(x, "simpson") 返回的是 1-D(方向与 Shannon 一致)
  • QIIME 2 的 Simpson 也是 1-D

⚠️ Weighted vs Unweighted UniFrac 的选择

  • Weighted UniFrac:考虑丰度,对优势种敏感
  • 适合:关注整体群落结构变化
  • 可能被少数高丰度物种主导
  • Unweighted UniFrac:不考虑丰度,只看有/无
  • 适合:关注稀有种或独有种的差异
  • 可能被测序噪音(低丰度假阳性)影响
  • 建议:两者都做,结果一致 = 结论稳健

⚠️ 稀释(Rarefaction)vs 不稀释的争议

传统做法(稀释): - 将所有样本随机抽取到相同测序深度 - 优点:消除测序量差异的影响,简单公平 - 缺点:丢弃大量数据(深测序样本的数据被浪费)

反对方(不稀释): - McMurdie & Holmes (2014) 提出稀释是"不可接受的",建议用统计模型(如 DESeq2)处理 - 理由:稀释丢弃有效数据,降低统计功效

当前共识: - Alpha 多样性:稀释仍然是主流做法,因为丰富度指标对测序深度极其敏感 - Beta 多样性:可以不稀释,用相对丰度或 CSS/TMM 标准化 - 差异分析:用 DESeq2、ANCOM-BC 等模型方法,不需要稀释 - 实际操作:QIIME 2 的 core-metrics 默认稀释

⚠️ 相对丰度 vs 绝对丰度

  • 扩增子测序得到的是相对丰度(relative abundance),不是绝对丰度
  • 相对丰度是"组分数据"(compositional data),总和恒为 100%
  • 一个物种看起来"增加"可能只是因为其他物种"减少"了
  • 要获得绝对丰度,需要:
  • 加入内标(spike-in,如已知浓度的合成 DNA)
  • 结合 qPCR 定量总细菌量
  • 使用流式细胞术计数

📌 面试中被问"16S 结果能代表绝对丰度吗",答"不能,16S 只能给相对丰度,要绝对丰度需要 spike-in 或 qPCR 辅助。"

⚠️ p 值校正(多重检验问题)

  • 同时检验多个物种的差异时,假阳性概率会膨胀
  • 例如:检验 100 个物种,p < 0.05,期望有 5 个假阳性
  • 必须做多重检验校正
  • FDR(BH 法):控制假发现率,最常用
  • Bonferroni:最严格,适合少量比较
  • R 代码:p.adjust(p_values, method = "BH")
  • 校正后的 p 值称为 q 值(q-value)或 adjusted p-value

⚠️ 其他常见错误

错误 正确做法
不去引物序列直接去噪 Cutadapt 去引物后再 DADA2
DADA2 的 trunc-len 设太短导致无法拼接 确保 F + R - 扩增长度 >= 12(重叠区)
用错分类器(V4 区分类器注释 V3-V4 数据) 分类器必须与引物区段匹配
PERMANOVA 显著就说差异大 还要看 R^2,R^2 小说明分组解释力弱
只报 p 值不报效应量 p 值 + R^2(PERMANOVA)/ LDA score(LEfSe)
用 Euclidean 距离做群落分析 微生物组数据用 Bray-Curtis 或 UniFrac
不检查方差齐性就做 PERMANOVA 先 betadisper + permutest 检验

6. 术语速查表(中英对照)

中文 英文 缩写
扩增子测序 Amplicon sequencing -
操作分类单元 Operational Taxonomic Unit OTU
扩增子序列变体 Amplicon Sequence Variant ASV
阿尔法多样性 Alpha diversity -
贝塔多样性 Beta diversity -
香农指数 Shannon-Wiener index H'
辛普森指数 Simpson's index D
物种丰富度 Species richness -
均匀度 Evenness J
稀释曲线 Rarefaction curve -
主坐标分析 Principal Coordinates Analysis PCoA
非度量多维标度 Non-metric Multidimensional Scaling NMDS
置换多元方差分析 Permutational MANOVA PERMANOVA
线性判别分析效应量 LDA Effect Size LEfSe
差异丰度分析 Differential abundance analysis -
物种注释 Taxonomic classification -
系统发育树 Phylogenetic tree -
相对丰度 Relative abundance -
绝对丰度 Absolute abundance -
测序深度 Sequencing depth -
去噪 Denoising -
嵌合体 Chimera -
多重检验校正 Multiple testing correction FDR
假发现率 False Discovery Rate FDR
组分数据 Compositional data -
中心对数比变换 Centered Log-Ratio transform CLR

7. 推荐阅读

资源 说明
QIIME 2 官方教程 最权威的扩增子分析教程
DADA2 Tutorial DADA2 R 版教程
Microbiome Helper 宏基因组/扩增子分析实用工具集
Callahan et al., 2016 (Nature Methods) DADA2 原始论文
Segata et al., 2011 (Genome Biology) LEfSe 原始论文
Anderson, 2001 (Austral Ecology) PERMANOVA 方法论文
Gloor et al., 2017 (Frontiers in Microbiology) 组分数据分析综述

最后更新:2026-04-27 | 面试前重点复习 ★ 标记的问答和 ⚠️ 易混淆点