接上一篇,数据拆分完成后,得到 FASTQ 文件,下面对数据进行质控。
当前主流测序平台的数据存储格式无外乎两种,FASTQ(Illumina, MGI),BAM(Life Ion Torrent,PacBio),对于 BAM 文件,通常也需要先转换成 FASTQ 文件后再进行质控处理。
质控软件非常多,有 FastQC,Cutadapt, Trimomatic 等,通常需要多款软件共同配合使用,这难免过于繁琐,在实际项目中,推荐用fastp[1],根据官网介绍,这是一款处理 FASTQ 文件的 all-in-one 软件,质控用它就够了,下面是扩增子数据的质控命令。
代码语言:javascript复制/path/to/fastp -i $fq1 -I $fq2
-h ${outdir}/${sample}_merge_clean.html
-j ${outdir}/${sample}_merge_clean.json
-m --merged_out ${outdir}/${sample}_merge_clean.fastq.gz
--failed_out ${outdir}/${sample}_failed.fastq.gz
--include_unmerged
--overlap_len_require 6
--overlap_diff_percent_limit 20
--detect_adapter_for_pe
-5
-r
-l 20
-n 5
-y
--thead 10
参数解释:
-i $fq1
,输入样本的 FASTQ1 文件,可以是 gz 压缩格式;
-I $fq2
,输入样本的 FASTQ2 文件,可以是 gz 压缩格式;
-h {outdir}/{sample}_merge_clean.html,输出 html 格式的质控报告;
-j {outdir}/{sample}_merge_clean.json,输出 json 格式的质控报告;
-m
,合并双端 reads 模式,设定该参数时满足条件的双端 reads 会合并在一起;
--merged_out {outdir}/{sample}_merge_clean.fastq.gz,输出合并后的结果文件;
--failed_out {outdir}/{sample}_failed.fastq.gz,保存被过滤掉的 reads 到该文件中;
--include_unmerged
,设定该参数,未能合并的 reads 也包含在结果文件中,否则默认是不包含的;
--overlap_len_require 6
,合并的条件一:双端 reads 至少有 6bp 重叠;
--overlap_diff_percent_limit 20
,合并条件二:重叠区域最多允许有 20%的碱基错配;
--detect_adapter_for_pe
,自动检测双端测序的接头序列并切除,默认只自动检测单端数据的接头序列;
-5
,从 5'端开始滑动一个窗口,如果窗口内碱基的平均质量低于某个阈值,则剪切掉窗口内的序列,否则停止剪切;
-r
, 从 5'端开始滑动一个窗口,如果窗口内碱基的平均质量低于某个阈值,则剪切掉窗口内以及其后的所有序列;
-l 20
,丢弃长度低于 20bp 的序列;
-n 5
,read 中 N 碱基数不能超过 5 个;
-y
,低复杂度过滤;
--thead 10
,指定 10 条工作线程;
以上命令除了常规的剪切、过滤操作外,还进行了双端 reads 的合并,最终结果如下 :
代码语言:javascript复制wenku1
|___wenku1_failed.fastq.gz 被过滤掉的reads结果文件
|___wenku1_merge_clean.fastq.gz 通过质控的reads结果文件
|___wenku1_merge_clean.html html质控报告
|___wenku1_merge_clean.json json质控报告
通过 html 质控报告,可以直观地看出很多指标,如过滤前后的 reads 数、bases 数、碱基质量、插入片段长度、碱基组成、GC 含量、接头类别等,如:
碱基质量:横坐标是read的碱基位置,纵坐标是碱基的phred值
碱基组成:横坐标是read的碱基位置,纵坐标是碱基组成百分比
此外,也可以通过编写脚本读取 json 报告的内容,生成个性化的质控报告。
质控知识小结
数据质控的目的是为了过滤掉那些不好的序列,从而减小对下游数据分析的干扰。
下面是一条 FASTQ 格式的序列,我们能对它进行些什么操作呢?主要有剪切、过滤、碱基质量校正等。
代码语言:javascript复制@M06862:6:000000000-C9TL7:1:1102:17871:1939 1:N:0:ATTACTCG GGCTCTGA
GCCCTCTTTGTCCTCCTTGGTGAGAACCAGGGCCTCGACCTCATCGCCCACGGAAACGACCTCGTTGGGGTCGA
1111>>CFF3F@EGEEGGB1G1BGHGHHGFA0AAFF0EEGGHGHHBEEE?FGCEGGHFCEEGHAHGHFC?GG??
为什么要剪切 read,无非是因为 read 中要么含有接头,要么含有低质量序列,这些信息对我们没用,甚至对分析结果造成干扰。
1.接头序列剪切
如果 read 中含有接头序列,则从接头开始的地方删除至 read 末尾。接头序列的来源可能是因为测序片段的长度低于测序的读长,从而被测通导致的,另外也不排除接头之间形成了二聚体,测出来的只有接头序列。
2.低质量序列剪切
Illumina 测序仪的特性,低质量序列可能位于 5'端,3'端或者 read 的中间,对应的处理方式有这几种:
- 从 5'端开始滑动一个窗口,如果窗口内碱基的平均质量低于某个阈值,则剪切掉窗口内的序列,否则停止剪切
- 从 3'端开始滑动一个窗口,如果窗口内碱基的平均质量低于某个阈值,则剪切掉窗口内的序列,否则停止剪切
- 从 5'端开始滑动一个窗口,如果窗口内碱基的平均质量低于某个阈值,则剪切掉窗口内以及其后的所有序列
通过以上几种方法,就可以剪切掉 5'端和 3'端的低质量序列,如果低质量序列位于 read 中间,则剪切掉该低质量序列及其后的所有序列。
3.全局剪切
以上去掉低质量序列的方式是有条件的,需要满足一定的阈值才会进行,也可以直接剪切掉 read 的头部和尾部,通常做法是:
- 去掉 5'端一定数量碱基
- 去掉 3'端一定数据碱基
- 或者限定 read 的最大长度,当 read 的长度超过限定值时,其尾部序列会被剪切掉
4.polyG 剪切
双色发光法的 Illumina 设备(NextSeq /NovaSeq),在没有光信号情况下 base calling 的结果会返回 G,所以在序列的尾端可能会出现较多的 polyG,需要被去除。
5.polyX
如果 3'端存在 polyX(如 mRNA-Seq 数据中的 polyA),可以剪切掉。
完成了剪切,下面就是过滤了。
1.质量过滤
对于低质量 reads,应直接丢弃,有如下方式:
- 按低质量碱基占 read 的比例,如达到 40%,则过滤掉,当然需要先定义低质量碱基的阈值,如 phred quality < Q15
- 按 read 中碱基的平均质量,如低于 30,则过滤掉
2.N 碱基过滤
测序过程中某个碱基无法识别时,体现在 read 中可能是一个大写 N 字母,当这样的 N 碱基过多时,则过滤掉该 read。
3.低复杂度过滤
复杂度的定义是 read 中与下一个碱基不同的碱基的百分比(base[i] != base[i 1])。
代码语言:javascript复制# a 51-bp sequence, with 3 bases that is different from its next base
seq ='AAAATTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGGGGGGGCCCC'
complexity = 3/(51-1) = 6%
这样的序列在靶向测序中,通常是不应该存在的,因此需要去除。
4.长度过滤
过滤掉太短或太长的序列:
- 长度太短,过滤掉
- 长度太长,过滤掉
此外,为了降低测序错误产生的噪声,质控时还可以对碱基的质量进行校正,通常的做法有:
1.PE 数据碱基校正
当双端测序的配对 reads 之间有 overlap 并且有错配时,如果错配碱基一个质量很高,一个质量很低,则进行碱基及其质量的校正。
2.UMI 标签
通过 UMI 标签来消除重复和测序错误,这通常在超高深度的测序数据中用到。
至此,质控部分就讲完了,下一篇介绍聚类分析。