第4节 宏基因组分析基础:鸟枪法测序数据质控、去宿主污染、组装、基因预测与丰度定量
宏基因组分析的第一步,说白了就是把测序仪吐出来的原始数据,变成我们能用的基因列表和丰度表。这个过程绕不开几个关键环节:质控、去宿主、组装、基因预测和丰度定量。今天我就把这几个步骤拆开揉碎了讲,里面有不少我在项目中踩过的坑,你注意别重蹈覆辙。
4.1 鸟枪法测序数据质控
原始测序数据直接拿来做分析?千万别急。我见过太多新手上来就跑组装,结果一半是低质量序列和接头污染,组装出来的contig惨不忍睹。质控这步省不了,也急不得。
常用的工具有 FastQC 和 fastp。FastQC 用来做质量评估,fastp 能一站式完成过滤、裁剪和报告生成。我个人习惯先用 FastQC 扫一眼全局质量,再用 fastp 做精细化处理。
下面是我常用的 fastp 命令,你直接拿去用就行:
fastp -i R1.fastq.gz -I R2.fastq.gz \
-o R1.clean.fastq.gz -O R2.clean.fastq.gz \
--detect_adapter_for_pe \
--cut_front --cut_tail \
--cut_front_mean_quality 20 \
--cut_tail_mean_quality 20 \
--qualified_quality_phred 20 \
--length_required 50 \
--thread 8 \
--json fastp.json --html fastp.html
跑完之后,重点看 Q20/Q30 比例 和 clean reads 占比。我一般要求 Q30 不低于 85%,clean reads 占比低于 70% 就要回头检查是不是建库出了问题。
4.2 去宿主污染
宏基因组样本里经常混有宿主DNA,尤其是临床样本或肠道内容物。去宿主不干净,后续组装出来的contig里会掺大量宿主序列,直接拉低基因预测的准确率。
标准的做法是用 Bowtie2 把 reads 比对到宿主基因组,然后保留未比对的 reads。我经历过一次惨痛教训——用了一个不完整的宿主参考基因组,结果去宿主不彻底,下游差异分析全乱了。
构建索引和比对命令示例:
# 构建宿主索引
bowtie2-build host_genome.fasta host_index
# 去宿主比对
bowtie2 -x host_index \
-1 R1.clean.fastq.gz \
-2 R2.clean.fastq.gz \
--very-sensitive \
-p 16 \
--un-conc-gz host_removed \
-S aligned.sam
比对结束后,host_removed.1.fastq.gz 和 host_removed.2.fastq.gz 就是去宿主后的 clean 数据。你可以在日志里看一眼比对率,如果宿主污染超过 40%,说明采样环节可能需要优化。
4.3 宏基因组组装
组装的目的是把短 reads 拼成更长的 contig,方便后续基因预测。宏基因组组装比单菌基因组组装难得多,因为群体里物种多样性高、丰度不均一。目前社区里主流工具就两个:MEGAHIT 和 metaSPAdes。
我个人习惯这么选:数据量大、计算资源有限时用 MEGAHIT;追求组装质量、不差机器时用 metaSPAdes。这不是绝对的,但我在 50+ 个项目里试下来,这个策略最稳。
| 工具 | 特点 | 适用场景 | 内存需求 |
|---|---|---|---|
| MEGAHIT | 极快,内存优化好,适合复杂群落 | 大数据量、普通服务器 | 中等(~64 GB) |
| metaSPAdes | 组装质量高,scaffold 更长,但慢 | 小数据量、高精度需求 | 高(~256 GB) |
MEGAHIT 使用示例:
megahit -1 host_removed.1.fastq.gz \
-2 host_removed.2.fastq.gz \
-o megahit_output \
--num-cpu-threads 16 \
--memory 0.8 \
--k-min 27 --k-max 127 --k-step 10
metaSPAdes 使用示例:
metaspades.py -1 host_removed.1.fastq.gz \
-2 host_removed.2.fastq.gz \
-o metaspades_output \
-t 16 \
-m 200
关键指标:组装完成后评估 N50 和 总组装长度。宏基因组组装 N50 通常 1-10 Kb 都算正常,低于 1 Kb 说明数据质量或复杂度有问题。我见过最差的 N50 只有 300 bp,最后排查发现是去宿主时参数设太严把菌群序列也滤掉了。
4.4 基因预测与丰度定量
拿到 contig 之后,下一步是找出里面的编码基因。这一步我用 Prodigal,没有之一。它专门为细菌和古菌基因组设计,支持宏基因组的 metagenomic 模式,能自动处理不完整的基因片段。
基因预测命令很简单:
prodigal -i final.contigs.fa \
-o genes.gff \
-a proteins.faa \
-d genes.fna \
-p meta \
-q
输出文件里,genes.fna 是核苷酸序列,proteins.faa 是氨基酸序列。我个人建议把 genes.gff 也保留下来,后面做功能注释时能用上坐标信息。
基因预测完成后,就到了定量环节。这里我用 Salmon,它基于转录本定量思路,速度快、内存低,而且不依赖比对,直接通过 k-mer 计数估算丰度。
先建索引,再做定量:
# 构建索引
salmon index -t genes.fna \
-i salmon_index \
-k 31
# 定量
salmon quant -i salmon_index \
-l A \
-1 host_removed.1.fastq.gz \
-2 host_removed.2.fastq.gz \
-o salmon_output \
-p 16 \
--validateMappings
定量结果在 salmon_output/quant.sf 里。核心列是 TPM 和 NumReads。TPM 用于样本间比较,NumReads 用于绝对丰度计算。
到此为止,你已经从原始测序数据走到了基因丰度矩阵。这一整套流程,我在不同项目里跑过上百次。每次出问题,80% 都出在质控和去宿主这两个前期环节上——前期的数据质量不过关,后面的组装、预测、定量再努力也是白费。嗯,这个道理你记住了,后面的分析就不会太折腾。