MetaPhlAn 原理详解:标记基因与谱系划分
Kraken2 用的是 k-mer 匹配,MetaPhlAn 则完全走了另一条路——标记基因。说白了,它不跟全基因组序列较劲,而是挑出一组保守又独特的基因片段,当作物种的“身份证”。我在做肠道菌群项目时第一次尝到这个思路的甜头,结果意外的干净,假阳性少很多。
什么是标记基因?为什么选它们?
标记基因,我理解为“进化时钟上的稳定指针”。他们具有几个共同特点:单拷贝、普遍存在于同一谱系、序列相对保守但又足够变异来区分物种。MetaPhlAn 从参考基因组中筛选出大约 1.1 万个这样的基因家族,涵盖细菌、古菌、真菌和病毒。
| 标记基因特点 | 为什么重要 |
|---|---|
| 单拷贝 | 避免多拷贝干扰定量 |
| 谱系特异性 | 只在某个分类群中出现,降低误比对 |
| 序列保守且可鉴别 | 既能跨物种比对,又能区分物种 |
我记得 MetaPhlAn 2 的数据库只包含约 1M 的标记基因序列,而 Kraken2 的 k-mer 库动辄几个 G 甚至几十 G。数据量小,比对就快——这是标记基因方案的先天优势。
谱系划分怎么做的?
MetaPhlAn 的数据库构建分两步走:
- 筛选标记基因:对所有参考基因组进行基因家族聚类(用 OrthoMCL 或类似工具),保留那些在每个物种中恰有一个拷贝且该物种独有的家族。
- 构建谱系树:把这些标记基因串联成一棵“物种树”,然后对每个节点(从界到种)提取一组节点特异性标记。比如,Escherichia coli 有自己的一套,而肠杆菌科又有一套更保守的标记。
实际比对时,你跑一个 Bowtie2 把 reads 打到这个标记基因集合上。MetaPhlAn 会统计每个标记基因被多少 reads 覆盖,再根据每个物种拥有的标记数量做归一化,最终给出相对丰度。
我在项目中遇到过的一个坑
一开始我用 MetaPhlAn 跑人体粪便样本,结果出来一堆未知物种。排查后发现是因为参考数据库版本太老,很多新培养的物种没收录。后来我养成了升级数据库的习惯:
metaphlan --install --bowtie2db /path/to/db
这个命令会下载最新版标记基因索引。数据库大概 2-3 G,比 Kraken2 小一个数量级。
代码实操:运行 MetaPhlAn
metaphlan metagenome.fastq \
--input_type fastq \
--bowtie2db /data/db/metaphlan_db \
--nproc 8 \
-o profile.txt \
--unclassified_estimation
输出文件长这样:
#clade_name NCBI_tax_id relative_abundance
k__Bacteria 2 92.34521
k__Bacteria|p__Firmicutes 1239 45.12398
k__Bacteria|p__Firmicutes|c__Clostridia 186801 22.67890
...
每一行代表一个分类层级,最后一列是相对丰度百分比。注意它同时输出了未分类的估计,这在多样性研究中挺有用。
MetaPhlAn 的局限性
- 对低丰度物种敏感度有限:因为依赖少数标记基因,样品中某物种 reads 太少时可能漏掉。
- 无法区分近缘种:如果两个物种共享几乎全部标记基因,MetaPhlAn 只能报出更高层级。
- 数据库更新依赖社区:没收录的物种永远不会被检出。
总结下来,MetaPhlAn 的设计哲学是“少即是多”。用少量但高可信度的标记基因,换来低计算成本和低假阳性。在微生物组日常分析中,它绝对是我首选的轮廓分析工具。你想想看,当别人还在等 Kraken2 加载数据库时,你的 MetaPhlAn 已经出结果了——这种效率感,很舒服。