MetaPhlAn 原理详解:标记基因与谱系划分

Kraken2 用的是 k-mer 匹配,MetaPhlAn 则完全走了另一条路——标记基因。说白了,它不跟全基因组序列较劲,而是挑出一组保守又独特的基因片段,当作物种的“身份证”。我在做肠道菌群项目时第一次尝到这个思路的甜头,结果意外的干净,假阳性少很多。

MetaPhlAn 标记基因 → 谱系划分流程 参考基因组 标记基因筛选 谱系特异性标记库 测序 reads Bowtie2 比对 标记计数 物种相对丰度 每个节点代表一个标记基因

什么是标记基因?为什么选它们?

标记基因,我理解为“进化时钟上的稳定指针”。他们具有几个共同特点:单拷贝、普遍存在于同一谱系、序列相对保守但又足够变异来区分物种。MetaPhlAn 从参考基因组中筛选出大约 1.1 万个这样的基因家族,涵盖细菌、古菌、真菌和病毒。

标记基因特点 为什么重要
单拷贝 避免多拷贝干扰定量
谱系特异性 只在某个分类群中出现,降低误比对
序列保守且可鉴别 既能跨物种比对,又能区分物种

我记得 MetaPhlAn 2 的数据库只包含约 1M 的标记基因序列,而 Kraken2 的 k-mer 库动辄几个 G 甚至几十 G。数据量小,比对就快——这是标记基因方案的先天优势。

谱系划分怎么做的?

MetaPhlAn 的数据库构建分两步走:

  1. 筛选标记基因:对所有参考基因组进行基因家族聚类(用 OrthoMCL 或类似工具),保留那些在每个物种中恰有一个拷贝且该物种独有的家族。
  2. 构建谱系树:把这些标记基因串联成一棵“物种树”,然后对每个节点(从界到种)提取一组节点特异性标记。比如,Escherichia coli 有自己的一套,而肠杆菌科又有一套更保守的标记。

实际比对时,你跑一个 Bowtie2 把 reads 打到这个标记基因集合上。MetaPhlAn 会统计每个标记基因被多少 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 验证低丰度分类是否存在。两款工具配合,效果远好于单用其一。
注意:不要对单端短 reads(<50bp)使用 MetaPhlAn。标记基因比对要求一定读长来保证特异性——我吃过这个亏,结果假阳性飙升。

总结下来,MetaPhlAn 的设计哲学是“少即是多”。用少量但高可信度的标记基因,换来低计算成本和低假阳性。在微生物组日常分析中,它绝对是我首选的轮廓分析工具。你想想看,当别人还在等 Kraken2 加载数据库时,你的 MetaPhlAn 已经出结果了——这种效率感,很舒服。