3. 覆盖度概念与计算方法
覆盖度这块儿,说实话,是很多做NGS分析的人容易搞混的地方。我见过不少项目报告,一看到“覆盖度20×”就以为数据质量没问题,结果回头一看,重要区域根本没测到。今天咱们把它彻底理清楚。
3.1 从测序原理讲起
测序仪读出来的每条read,本质上是一次随机采样。覆盖度,就是看每个碱基被采样了多少次。你想想看,如果基因组上某个位点被100条read覆盖,那这个位点的覆盖度就是100×。
但问题来了——我们怎么算“整个基因组”的覆盖度?怎么衡量某个特定区域的覆盖情况?这就要引出下面四个核心概念。
一句话总结:覆盖度是“深度”,覆盖率是“广度”。深度看每个碱基读了多少次,广度看整个基因组有多少比例被读到。
3.2 基因组覆盖度
基因组覆盖度,英文叫Genome Coverage。它衡量的是你的测序数据到底覆盖了参考基因组的多少个碱基。
计算方法:
Genome Coverage = 被至少1条read覆盖的碱基数 / 参考基因组总碱基数 × 100%
举个例子:人类参考基因组约3.1Gb。如果你的数据覆盖了其中2.8Gb,那基因组覆盖度就是90.3%。
我在项目中遇到过:有次做肿瘤WGS,客户端要求覆盖度98%以上,结果我跑了两次都只有95%。排查发现,是某些高GC区域死活没读上。后来加了PCR-free建库,才补上来。
3.3 区域覆盖度
这词儿经常出现在靶向测序里。说白了,就是看你关心的那部分区域被覆盖得怎么样。比如外显子组、目标Panel的区域。
区域覆盖度有两种计算视角:
| 视角 | 含义 | 常见阈值 |
|---|---|---|
| 覆盖比例 | 目标区域中被≥1条read覆盖的比例 | >95% |
| 深度达标比例 | 目标区域中被≥X条read覆盖的比例 | ≥100×覆盖 > 90% |
我个人习惯用后者,因为光看“有没有覆盖到”太粗糙了。尤其是做变异检测时,深度不够直接导致假阳性。
# 以GATK的DepthOfCoverage工具为例
gatk DepthOfCoverage \
-R reference.fa \
-I sample.bam \
-L target_region.bed \
--min-base-quality 20 \
--min-mapping-quality 30 \
-O sample.coverage
避坑指南:我曾经只设了PCR去重,没注意mark duplicates的顺序,结果所有重复read都算进了深度。区域覆盖度报表看着漂亮,实际变异检测一塌糊涂。先排序再去重,这个顺序不能错。
3.4 平均覆盖度
平均覆盖度,英文Mean Depth。这是大家最常用的一个指标,但也是最容易被误读的。
计算公式:
Mean Depth = 所有碱基的覆盖度总和 / 基因组总碱基数
举个例子:一个1Mb的基因组,总read碱基数为500Mb,那平均覆盖度就是500×。
但这里面有个大坑——平均覆盖度掩盖了分布不均。你想想看,一个区域深度2000×,另一个区域深度0×,平均一下可能还是1000×,看起来好看,实际上那个0×的区域完全不可用。
注意:报告中如果只列“平均覆盖度”,一定要追问覆盖度的标准差和深度<20×的区域占比。我见过一份“平均覆盖度300×”的报告,结果有15%的区域<20×,这种数据做变异检测风险很大。
3.5 覆盖率
覆盖率(Coverage Rate)其实和基因组覆盖度有时候混着用。但严格来讲,覆盖率更强调比例的概念。
常用的几种覆盖率指标:
- 1×覆盖率:被至少1条read覆盖的碱基比例
- 10×覆盖率:被至少10条read覆盖的碱基比例
- 30×覆盖率:被至少30条read覆盖的碱基比例
- 100×覆盖率:被至少100条read覆盖的碱基比例
这些指标在不同应用场景下是有讲究的:
| 应用场景 | 推荐深度阈值 | 覆盖率要求 |
|---|---|---|
| WGS 变异检测 | ≥10× | ≥90% |
| WES 变异检测 | ≥20× | ≥95% |
| 肿瘤低频突变检测 | ≥100× | ≥90% |
| RNA-seq 表达量 | ≥5× | ≥80% |
嗯,这里要注意一点:覆盖率是累积的。10×覆盖率一定大于或等于30×覆盖率。这个不用想太多,它就是个单调递减的曲线。
3.6 四个概念的关系
这四个概念之间的关系,我通常用一个图来给团队成员讲。你看了就明白了:
你看这个图就清楚了:基因组覆盖度和区域覆盖度是宏观尺度,告诉你“覆盖了多少位置”;平均覆盖度是深度尺度,告诉你“平均每个位置读了多少次”;而覆盖率是把深度和广度信息综合起来,告诉你“不同深度下的覆盖范围”。
3.7 实战中的计算示例
我平时用samtools depth来算覆盖度,再结合awk做统计。给你看看实际怎么算:
# 1. 先算每个位点的深度
samtools depth sample.bam > sample.depth
# 2. 统计全基因组覆盖度(被覆盖的位置比例)
awk 'END{printf "Genome coverage: %.2f%%\n", NR/3100000000*100}' sample.depth
# 3. 计算平均覆盖度
awk '{sum+=$3}END{printf "Mean depth: %.2f×\n", sum/NR}' sample.depth
# 4. 计算30×覆盖率
awk '{if($3>=30) count++}END{printf "30× coverage: %.2f%%\n", count/NR*100}' sample.depth
输出示例:
Genome coverage: 95.37%
Mean depth: 32.45×
30× coverage: 78.23%
看到没?平均深度32.45×,看起来还行,但30×覆盖率只有78.23%。这说明分布不均匀,有很多区域深度在30×以下。
我的建议:做质控时,至少看三个指标——基因组覆盖度、平均深度、50×覆盖率。这三个一起看,基本能判断数据质量。只看平均深度,容易被“平均主义”麻痹。
3.8 批次间监控中的覆盖度
在批次间监控里,覆盖度的变化是最敏感的信号之一。我一般会建一个覆盖度基线,然后每次新批次数据进来,都检查这几个点:
- 平均覆盖度波动:超过±20%要预警
- 20×覆盖率下降:下降超过5%说明这批次深度分布变了
- 高GC区域覆盖度:这个区域的覆盖度对文库扩增异常特别敏感
嗯,这些东西一开始可能觉得太细,但做久了你就知道——很多批次问题的第一信号,就是从覆盖度曲线上冒出来的。我一个老同事说,覆盖度是最诚实的QC指标,它不会骗你。
会用这四个概念,你基本上就能看懂95%的NGS质控报告了。剩下的5%,是那些故意把低质量数据包装成高质量报告的——嗯,这个咱们后面再聊。