第3章 MetaPhlAn 简介:从历史到核心思想

3.1 它从哪儿来?——MetaPhlAn 的历史

咱们做宏基因组分析的人,手里一般都有几把“刀”。Kraken2 是一把,MetaPhlAn 是另一把。这两把刀用法完全不同。

MetaPhlAn 的全称挺长——Metagenomic Phylogenetic Analysis。我第一次见这名字,还以为是个系统发育工具。后来用多了才发现,它核心干的事是:从宏基因组里快速扒出微生物的种类和丰度。

我记得最早读它的论文,大概是 2012 年左右,Curtis Huttenhower 团队搞出来的。那时候宏基因组分析还在起步,有人用 16S,有人直接打 entire metagenome。MetaPhlAn 的思路在当时挺另类——不比对全基因组,只抓几段“标记基因”。

版本 发布年 核心变化
v1.0 2012 基于 ~3,000 个参考基因组,选约 400 个 universal marker genes
v2.0 2015 支持新物种检测;数据库大幅扩展;计算速度翻倍
v3.0 2019 引入 SGB(物种级基因组分箱);覆盖 17,000+ 基因组;支持 strain-level 辨析
v4.0 2023 新增 ~100,000 个 SGB;marker genes 增加到 ~5,000 个;加入 mpa4 格式

一开始我用 v1.0 时,数据库才几百 MB。现在 v4.0 的数据库动辄几个 GB,你想想看,这十年间它攒了多少数据。

一句话总结历史: MetaPhlAn 是一个“老牌”工具,从二代测序时代一直延续到三代测序时代,越迭代越能打。它的生命力在于“只抓关键基因,不做全基因组暴力比对”。

3.2 核心思想:标记基因直系同源簇

这里是我觉得最有趣的部分。为什么 MetaPhlAn 能那么快?因为它不做全基因组比对。

你想想看,一个宏基因组样本里可能有几百种细菌,每个细菌基因组几百万个碱基。如果用 Kraken2 那种 exact k-mer 匹配,数据库能撑爆。MetaPhlAn 的办法是:只选每个物种里最“保守”又最“特异”的那些基因。

具体来说,它选的基因叫 clade-specific marker genes。这些基因要满足两个条件:

  1. 在某个分支(界、门、纲、目、科、属、种)的所有物种里都存在——这叫“保守”。
  2. 在其他分支里基本找不到同源物——这叫“特异”。

举个例子,你手上有一群大肠杆菌,它们都带 ompA 基因。这个基因在肠杆菌科里普遍存在,但在拟杆菌门里几乎找不到。那 ompA 就是一个很好的“肠杆菌科标志基因”。

但很多时候单一基因不够稳。万一某个物种正好丢了这基因呢?所以 MetaPhlAn 用了一组 直系同源簇(orthologous groups)。一个簇里包含多个拷贝或者多个同源基因,只要有一个被检测到,就能确认该物种存在。

我的个人习惯: 当我怀疑某个样本里有稀有种时,我会先跑 MetaPhlAn 看丰度表。如果它标记了一个 OBSOLETE_SGB,说明该物种可能是新发现的,还没被收录进通用数据库。这时候再换成 Kraken2 做全 k-mer 比对来验证。

3.3 核心工作流程:从序列到丰度表

MetaPhlAn 的处理管线大致分四步。我给个项目里常用的命令做示例。

第一步:标记基因扫描

metaphlan input.fastq --input_type fastq \
  --bowtie2db /path/to/metaphlan_db \
  --bowtie2out sample.bowtie2.bz2 \
  -o sample_profile.txt

第二步:比对到 marker 数据库

# 实际这一步被上面的 metaphlan 命令自动调用。
# 但你可以单独使用 bowtie2 输出比对日志:
bowtie2 -x /path/to/metaphlan_db/mpa_vJun23_CHOCOPhlAnSGB_202307 \
  -U input.fastq -S sample.sam

第三步:物种分类与丰度估算

# 这是核心计算,MetaPhlAn 内部会做:
# 1. 提取比对到 marker genes 的 reads
# 2. 根据每个 marker 的 coverage 估算相对丰度
# 3. 输出一个类表格的 profile

最终输出的文件长这样:

#clade_name    NCBI_tax_id    relative_abundance    coverage    ...
k__Bacteria    p__Firmicutes    c__Clostridia    o__Lactobacillales     ...
s__Escherichia_coli    562    0.45321    12.34    ...
s__Bacteroides_vulgatus    821    0.12345    5.67    ...

每一行是一个分类单元,从界到种层层展开。你可以看到“相对丰度”和“覆盖率”两个关键指标。我个人通常只用相对丰度,因为它已经做了内参归一化。

曾经踩过的坑: 我曾经把 --input_type fastq 写成了 --input_type fasta,结果 MetaPhlAn 报了一堆“no reads map to markers”。后来发现是参数错了。你一定要注意输入类型,尤其是压缩格式的 FASTQ 文件,一定要用 .gz 后缀。

3.4 MetaPhlAn 适用场景速览

说了这么多,到底什么时候该用它?我归纳了几个典型场景:

  • 快速物种鉴定: 几十个样本的宏基因组,想快速知道“里面有哪些细菌”。
  • 丰度比较: 疾病 vs 健康组的菌群差异分析。MetaPhlAn 的丰度值可以喂给 LEfSe 或 MaAsLin2 做后续统计。
  • 菌株级差异: v3.0 之后的 StrainPhlAn 模块能检测到 SNP 级别的差异。
  • 大规模队列: 几百个样本时,全基因组比对太慢,MetaPhlAn 的标记基因策略能节省大量时间。

这里有个重要的对比表格,能让你看清 MetaPhlAn 和 Kraken2 的分野:

维度 MetaPhlAn Kraken2
数据库构建 基于 marker genes 的直系同源簇 全基因组的 k-mer 索引
数据库大小 较小(~5 GB) 较大(~80 GB Standard)
分类粒度 物种级,支持 strain-level 物种级(主要靠 k-mer)
主要输出 相对丰度表 + 覆盖度 分类计数表
速度 快(比对量小) 较快(取决于 k-mer 匹配)
对低丰度物种 较敏感(marker 覆盖要求严格) 可能漏掉(k-mer 太短)

3.5 一张图看清 MetaPhlAn 的核心逻辑

为了让流程更直观,我画了张概念图。这里展示的是 “标记基因谱系” 怎么从测序序列变成分类结果:

MetaPhlAn 核心逻辑:标记基因直系同源簇分析流程 原始宏基因组序列 Bowtie2 比对 标记基因谱系数据库 mpa_vJun23_CHOCOPhlAnSGB 直系同源簇匹配 clade-specific marker genes 相对丰度估算 coverage / normalization 分类与丰度表 *.profile.txt 核心优势:只比对关键基因,不是全基因组 速度比全基因组比对快 10~20 倍 标记基因特点 保守 + 物种特异性

3.6 我为什么推荐在项目中先用 MetaPhlAn?

说来说去,没有绝对的好工具,只有合适的场景。但我个人的工作流里,第一步永远是 MetaPhlAn。为什么?

  • 快: 50 个样本,每个 5M 条 reads,MetaPhlAn 大概 1 小时跑完。Kraken2 可能要 3~4 小时。
  • 输出直观: 它给的丰度表可以直接喂给 R 做统计分析。不需要用专人写脚本转换格式。
  • 支持菌株级分析: 如果发现某个物种丰度有明显差异,可以用 StrainPhlAn 追查菌株变异。这一点 Kraken2 做不到。

实用技巧: 如果你做多组学整合(比如宏基因组+代谢组),先把 MetaPhlAn 的丰度表存下来。它跟很多下游工具直接兼容,省去格式转换的麻烦。

好了,这一章的核心就这些。MetaPhlAn 是个“巧劲”,它不跟全基因组较劲,只盯住关键的标记基因。这种思想值得学一学——有时候少即是多。