4. MetaPhlAn 简介与核心原理
MetaPhlAn 是另一款主流的宏基因组物种分类工具。和 Kraken2 不同,它走的是“标记基因”路线。说实话,当年我刚接触它时还觉得有点绕——为什么非得挑几个基因出来代表整个物种?后来实践多了才明白,这一招其实很聪明,能有效避开保守区的干扰。
4.1 什么是 MetaPhlAn
MetaPhlAn 全称是 Metagenomic Phylogenetic Analysis,由哈佛大学的 Curtis Huttenhower 团队开发。它从宏基因组测序数据中提取特定标记基因序列,然后和预构建的标记基因数据库比对,最终输出每个物种的相对丰度。
我记得第一次在项目里同时跑了 Kraken2 和 MetaPhlAn,发现结果差别挺大。后来排查才发现:Kraken2 逮到的是所有 k-mer 匹配的片段,而 MetaPhlAn 只看那几个“签名基因”。思路完全不一样。
4.2 核心原理:标记基因与物种鉴定
MetaPhlAn 的核心在于它定义了一套 物种特异性标记基因。每个物种一般选 50~300 个基因,这些基因在基因组中高度保守且只在该物种中出现。
为什么要这样做?你想想看:如果直接用全基因组比对,不同物种的保守区(比如核糖体RNA)会互相干扰。MetaPhlAn 的做法是绕过这些干扰区,只盯住那些“独有”的基因片段。
关键思想:用标记基因的覆盖率来估计物种丰度,而不是用所有读段的平均覆盖。
选择标记基因的原则
- 单拷贝:避免多拷贝基因导致的假阳性
- 谱系特异性:同一属内不同物种的标记基因序列差异明显
- 基因组内保守:在物种内序列基本不变,保证比对稳定
- 覆盖全面:每个物种至少覆盖 ~95% 的基因内容
4.3 MetaPhlAn 的工作流程
整个流程可以分为三步:
- 第一步:质控与过滤 — 去除宿主 DNA 和低质量序列
- 第二步:比对标记基因数据库 — 使用 bowtie2 或源自 MetaPhlAn 自带的比对器,只和标记基因库比对
- 第三步:丰度估计 — 基于比对上的 read 数和标记基因长度,用最大似然或 EM 算法计算相对丰度
我曾在分析一个口腔样本时,直接用了默认参数。结果发现有些低丰度物种被低估了。后来调大了 --bowtie2-out 的置信度阈值才改善。说白了,EM 算法对那些 rare taxa 挺敏感的,你得自己试几轮。
典型的命令行是这样的:
metaphlan sample.fastq --input_type fastq \
--bowtie2db /path/to/db \
--nproc 8 \
-o sample_profile.txt
输出是一个物种丰度表,每行一个物种,列是相对丰度百分比。看起来像这样:
#SampleID Bacteroides_vulgatus Faecalibacterium_prausnitzii ...
sample01 32.14 21.78 ...
4.4 MetaPhlAn vs Kraken2:核心差异
很多初学者会问:既然都能做物种分类,为什么还需要两种工具?我常拿下面这个表格来解释:
| 维度 | MetaPhlAn | Kraken2 |
|---|---|---|
| 依赖数据库 | 物种特异性标记基因 | 全部基因组 k-mer |
| 比对方式 | bowtie2 精确比对 | k-mer 精确查找 + LCA |
| 敏感度 | 高(只比对关键区域) | 中等(受重复 k-mer 影响) |
| 丰度估计方法 | EM 算法,自带长度归一化 | 基于覆盖度的简单计数 |
| 对宿主污染的处理 | 内置过滤步骤 | 需要单独去除 |
| 低丰度物种检测 | 较敏感,但易受阈值影响 | 较差(假阳性率高) |
| 内存消耗 | ~4-8 GB | ~30-60 GB(标准库) |
| 运行速度 | 较快(比对量小) | 极快(精确匹配) |
我的选择建议:如果样本宿主污染高或你想重点分析稀有物种,优先用 MetaPhlAn。如果你追求极致速度且在实验室环境下,Kraken2 更合适。当然,我一般两个都跑,交叉验证。
4.5 实战避坑指南
我曾经有一次跑 MetaPhlAn 时发现结果里出现一个不该出现的物种——后来查日志才发现,标记基因数据库里有个旁系同源基因没被过滤掉。这让我养成了一个习惯:跑完一定检查 log.txt 里的 clade_excluded 记录。
注意:MetaPhlAn 的数据库版本很重要。不同版本(v3.0 / v4.0)标记基因集差异很大,结果无法直接比较。升级数据库后必须重跑所有样本。
还有一点:如果输入是双端测序文件,要记得先合并成 interleaved FASTQ,或者分别指定 -1 和 -2。我见过不少新手直接传两个文件,结果 MetaPhlAn 只处理了一个。
嗯,这里要特别提一下 质控环节。MetaPhlAn 虽然内置了宿主过滤,但它默认用的是 bowtie2 比对人类参考基因组。如果你的样本不是人源(比如土壤、海洋),记得用 --host_remove 参数指定你自己的宿主参考基因组。否则一部分真细菌 reads 会白白被丢掉。
这张图把 MetaPhlAn 的“读入 - 质控 - 比对 - EM 估计 - 输出”串起来了。你对比一下 Kraken2 的图就会发现:Kraken2 少了 EM 这一步,它直接基于覆盖度算丰度。这也就是为什么两个工具算出来的丰度经常不一样的原因之一。