第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。这些基因要满足两个条件:
- 在某个分支(界、门、纲、目、科、属、种)的所有物种里都存在——这叫“保守”。
- 在其他分支里基本找不到同源物——这叫“特异”。
举个例子,你手上有一群大肠杆菌,它们都带 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 的核心逻辑
为了让流程更直观,我画了张概念图。这里展示的是 “标记基因谱系” 怎么从测序序列变成分类结果:
3.6 我为什么推荐在项目中先用 MetaPhlAn?
说来说去,没有绝对的好工具,只有合适的场景。但我个人的工作流里,第一步永远是 MetaPhlAn。为什么?
- 快: 50 个样本,每个 5M 条 reads,MetaPhlAn 大概 1 小时跑完。Kraken2 可能要 3~4 小时。
- 输出直观: 它给的丰度表可以直接喂给 R 做统计分析。不需要用专人写脚本转换格式。
- 支持菌株级分析: 如果发现某个物种丰度有明显差异,可以用 StrainPhlAn 追查菌株变异。这一点 Kraken2 做不到。
实用技巧: 如果你做多组学整合(比如宏基因组+代谢组),先把 MetaPhlAn 的丰度表存下来。它跟很多下游工具直接兼容,省去格式转换的麻烦。
好了,这一章的核心就这些。MetaPhlAn 是个“巧劲”,它不跟全基因组较劲,只盯住关键的标记基因。这种思想值得学一学——有时候少即是多。