# 对单样本逐个看
fastqc sample_R1.fastq.gz -o qc_output/
# 批量看几十个样本
for i in *_R1.fastq.gz; do fastqc "$i" -o qc_output/; done
输出里会有一个html报告,里面“Per base sequence quality”那张图是关键。如果大部分碱基的Q值落在绿色区域(>28),就没问题。如果大量落在黄色甚至红色区域,那就要警惕了。
**批次的Q30怎么汇总?**
只看单样本不够。我建议把同一批次所有样本的Q30列在一张表里。
| 样本ID | R1 Q30(%) | R2 Q30(%) | 备注 |
|--------|-----------|-----------|------|
| S1 | 91.2 | 88.5 | 正常 |
| S2 | 89.7 | 87.1 | 正常 |
| S3 | 92.0 | 89.3 | 正常 |
| S4 | 78.5 | 72.1 | 偏低,需复查 |
| S5 | 90.1 | 86.9 | 正常 |
如果一半以上样本的Q30都低于85%,那这批数据就得考虑重测了。如果只有个别样本低,那可能是文库本身的问题,可以单独处理。
#### 4.3 碱基分布:文库构建的“心电图”
**碱基分布看什么?**
它看的是reads上每个位置的四种碱基(A、T、C、G)的比例。正常情况下,在随机打断的文库中,四种碱基的比例应该大致相等,不会有太大的波动。
但有些情况会导致异常。比如RNA-seq中,如果引物残留或PCR偏好性太强,就会导致某个碱基的比例异常升高。我做WGS时,也见过GC含量偏离理论值的情况,那多半是扩增环节出了问题。
**怎样算异常?**
我个人总结了一个快速判断标准:
- 任意碱基在任意位置的波动超过5%(跟整体均线比)
- GC含量偏离理论值(人类基因组GC含量约41%)超过±3%
- read开头几个碱基出现明显偏向(比如前5bp全是G)
**一个真实的坑**
我曾经被一个“GC含量偏高”的批次坑过。当时GC含量高达52%,Q30和duplicate rate都正常。我以为数据能用,结果下游变异检测时,在GC-rich区域的假阳性高得离谱。后来才发现是文库构建时用了高保真聚合酶,但扩增循环数设多了,导致高GC区域被过度扩增。
**怎么快速检测?**
还是用fastqc。
# 单样本
fastqc sample_R1.fastq.gz
# 批处理
ls *.fastq.gz | cut -d'_' -f1 | sort -u | while read id; do
fastqc "${id}"_R1.fastq.gz "${id}"_R2.fastq.gz -o qc_output/
done
在fastqc报告里,重点关注“Per base sequence content”和“GC content”这两张图。
| 指标 | 正常特征 | 异常特征 |
|------|---------|---------|
| 碱基含量 | 每条read上的A/T/C/G比例大致平行 | 某个碱基在某段区域突然升高 |
| GC含量 | 单峰分布,中心接近理论值 | 双峰分布或偏移理论值超过±3% |
| 开头几个碱基 | 可能略有波动,但很快稳定 | 前5-10bp有明显偏向 |
小提示:RNA-seq的碱基分布会比DNA-seq波动大一些,因为基因表达本身就有偏向性。但离谱的波动还是不能放过去的。
#### 4.4 Duplicate Rate:文库复杂度的“照妖镜”
**Duplicate是什么?**
就是测序时测到同一个DNA片段的多个拷贝。这些重复reads可能来自:
- PCR duplicate:文库扩增时,同一个模板被扩增了多次
- Optical duplicate:测序仪上的cluster太挤,导致同一个cluster被读成了两个
- 天然的重复:某些区域本身拷贝数就高
**怎么判断是否过高?**
我通常会这样看:
- `< 20%`:理想
- `20%-30%`:可以接受
- `30%-50%`:偏高,需要看具体原因
- `> 50%`:不合格,建议重做
有一次,一个客户送来了50个RNA-seq样本,duplicate rate普遍在40%以上。我一看QC报告,上机总量没问题,但PCR循环数设了18个循环。我建议他降到12个循环试试,结果重复率直接降到15%。说明问题就在扩增环节。
**怎么计算?**
用MarkDuplicates(picard工具)是最常见的。
java -jar picard.jar MarkDuplicates \
I=aligned.bam \
O=aligned_dedup.bam \
M=dedup_metrics.txt \
REMOVE_DUPLICATES=false
输出文件`dedup_metrics.txt`里会有一行:
LIBRARY UNPAIRED_READS_EXAMINED READ_PAIRS_EXAMINED PERCENT_DUPLICATION ESTIMATED_LIBRARY_SIZE
S1 0 50000000 0.325 33750000
这里的`PERCENT_DUPLICATION`就是我们要的重复率。0.325就是32.5%。
**批次汇总时如何呈现?**
我一般把每个样本的重复率放在一张表里,方便横向比较。
| 样本ID | 输入reads数 | 去重后reads数 | 重复率(%) | 评估 |
|--------|------------|--------------|-----------|------|
| S1 | 50,000,000 | 42,500,000 | 15.0 | ✅ 良好 |
| S2 | 50,000,000 | 38,000,000 | 24.0 | ✅ 可接受 |
| S3 | 50,000,000 | 30,000,000 | 40.0 | ⚠️ 偏高 |
| S4 | 50,000,000 | 20,000,000 | 60.0 | ❌ 不合格 |
注意:WES和靶向测序的重复率通常比WGS高,因为捕获区域有限。WES重复率40%可能勉强能用,WGS到40%就要警觉了。一定要跟同类项目比,别跨类型。
#### 4.5 三个指标一起看,才算完整评估
单独看任何一个指标都可能误判。我遇到过的情况是这样的:
- Q30高的批次,但duplicate rate也高,有效数据其实很少
- 碱基分布正常的批次,但Q30中段突然下降,后来发现是测序仪液路堵了
- Duplicate rate低的批次,但Q30也低,质量差到没法用
**所以我建议的做法是:**
1. 先跑一次`MultiQC`把所有样本的fastqc报告汇总
2. 生成一张`指标对照表`
3. 标记出三项中至少一项异常的样本
# 安装MultiQC
pip install multiqc
# 汇总所有fastqc报告
multiqc qc_output/ -o multiqc_report/
这样你就能在一份报告里看到所有样本的Q30、碱基分布和duplicate rate。一眼就能看出哪些样本是“问题选手”。
**总结一下判断逻辑:**
| 组合 | 可能原因 | 处理建议 |
|------|---------|---------|
| Q30低 + 其他正常 | 测序仪问题/试剂问题 | 复查上机环节 |
| 碱基分布异常 + Q30正常 | 文库扩增问题 | 检查PCR循环数/polymerase |
| Duplicate高 + 其他正常 | 文库复杂度不够 | 减少PCR循环或增加起始量 |
| 三者都异常 | 上机或文库构建均出问题 | 强烈建议重做这批