參考:堿基礦工
從零開(kāi)始完整學(xué)習(xí)全基因組測(cè)序數(shù)據(jù)分析:第4節(jié) 構(gòu)建WGS主流程
GATK4.0和全基因組數(shù)據(jù)分析實(shí)踐(上)
前言
由于人類基因組數(shù)據(jù)過(guò)大(我的小小服務(wù)器也只有50G),而人的參考序列長(zhǎng)度就有3Gb,且高深度測(cè)序結(jié)果往往動(dòng)輒100G。因此作者也嘗試用E.coli K12 的數(shù)據(jù)作為替代,一來(lái)它的基因不是很復(fù)雜,數(shù)據(jù)小,它的基因組長(zhǎng)度只有4.6Mb,二來(lái)也能很好的跑一遍流程,熟悉過(guò)程。
咱們開(kāi)始吧~
準(zhǔn)備階段
首先需要在服務(wù)器上部署相關(guān)的軟件,包括以下四個(gè)軟件。
1)BWA (Burrow-Wheeler Aligner):非常權(quán)威的NGS數(shù)據(jù)比對(duì)軟件,https://github.com/lh3/bwa。
2)Samtools:一個(gè)專門用于處理比對(duì)數(shù)據(jù)的軟件,https://github.com/samtools/samtools。
3)Picard:也是一款功能強(qiáng)大的NGS數(shù)據(jù)處理工具,功能和samtools 很類似,但更多的是與其互補(bǔ),http://broadinstitute.github.io/picard/。
4)GATK:是一款非常權(quán)威的基因數(shù)據(jù)變異檢測(cè)工具。目前有3.x和4.x兩個(gè)不同的版本。4.x在核心算法層面并沒(méi)太多的修改,采用了新的設(shè)計(jì)模式,后續(xù)GATK團(tuán)隊(duì)也將主要維護(hù)4.x的版本。但目前還不如3.x 版本穩(wěn)定,且短期來(lái)看3.x版本還將在業(yè)內(nèi)繼續(xù)使用一段時(shí)間。這里作者也以GATK3.8(最新版本)作為流程的重要工具進(jìn)行分析流程的構(gòu)建。https://software.broadinstitute.org/gatk/download/
對(duì)于WGS 分析來(lái)說(shuō),這四個(gè)工具就夠了。
安裝
關(guān)于conda 安裝,參見(jiàn):http://www.lxweimin.com/p/632f35c48137
BWA 的安裝
conda create -n wgs python=2 bwa # 創(chuàng)建環(huán)境及conda 安裝
source activate wgs # 激活環(huán)境
# 這樣我們安裝的包就只在這一個(gè)環(huán)境下了,不會(huì)使linux 工作環(huán)境污染。
samtools
conda install samtools
Picard
conda install picard
GATK
conda install gatk
sratoolkit
wget https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/2.10.5/sratoolkit.2.10.5-centos_linux64.tar.gz # 下載
添加內(nèi)容的環(huán)境變量,vi ~/.bashrc
并在底部加上文件目錄
db-config --interactive # 按照提示完成配置
項(xiàng)目結(jié)構(gòu)設(shè)計(jì)
./20200524_wgs_practice/
├── bin
├── input
└── output
- bin 存放所有執(zhí)行程序和代碼
- input 存放所有輸入數(shù)據(jù)
- output 存放所有輸出數(shù)據(jù)
獲取E.coli K12的參考基因組序列
一般來(lái)說(shuō)基因組信息都可以從ensemble 或者ncbi兩個(gè)數(shù)據(jù)庫(kù)獲取,除此之外也還有很多的數(shù)據(jù)庫(kù),可以參考以下:
http://www.lxweimin.com/p/6c45620b2578
-
這里我是通過(guò)ncbi獲取。
可以通過(guò)ftp下載得到fasta 格式的序列。
這里我們可以利用wget 獲得fasta 文件
wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/005/845/GCF_000005845.2_ASM584v2/GCF_000005845.2_ASM584v2_genomic.fna.gz
通過(guò)gzip解壓縮并將名字重命名為E.coli_K12_MG1655.fa。
gzip -dc GCF_000005845.2_ASM584v2_genomic.fna.gz > E.coli_K12_MG1655.fa
我們可以查看一下它的前十行
$head -10 E.coli_K12_MG1655.fa
>NC_000913.3 Escherichia coli str. K-12 substr. MG1655, complete genome
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGCTTCTGAACTG
GTTACCTGCCGTGAGTAAATTAAAATTTTATTGACTTAGGTCACTAAATACTTTAACCAATATAGGCATAGCGCACAGAC
AGATAAAAATTACAGAGTACACAACATCCATGAAACGCATTAGCACCACCATTACCACCACCATCACCATTACCACAGGT
AACGGTGCGGGCTGACGCGTACAGGAAACACAGAAAAAAGCCCGCACCTGACAGTGCGGGCTTTTTTTTTCGACCAAAGG
TAACGAGGTAACAACCATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCG
ATATTCTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCTGGTG
GCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATTTTTGCCGAACTTTT
GACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCGTCGATCAGGAATTTGCCCAAATAA
AACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAGCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAA
下載測(cè)序數(shù)據(jù)
ncbi 的SRA ,Sequence Read Archive,數(shù)據(jù)庫(kù)http://www.ncbi.nlm.nih.gov/sra/ 是目前最常用的存儲(chǔ)測(cè)序數(shù)據(jù)的數(shù)據(jù)庫(kù)。
E.coli K12 作為一種非常常用的模式生物,已經(jīng)有很多測(cè)序信息在ncbi上了,這里選擇其中一個(gè)測(cè)序信息SRR1770413。
這個(gè)數(shù)據(jù)來(lái)自Illumina MiSeq測(cè)序平臺(tái),read長(zhǎng)度為300bp,測(cè)序類型是Pair-end。
小插曲,PE測(cè)序與SE測(cè)序
在之前的測(cè)序技術(shù)的介紹中,我們已經(jīng)知道包括illumina 在內(nèi)的NGS測(cè)序都是短讀長(zhǎng)的測(cè)序,每次測(cè)出來(lái)的read 長(zhǎng)度都不太長(zhǎng),為了盡可能的把DNA的序列片段多測(cè)出來(lái),一邊測(cè)不夠,就測(cè)兩邊。
于是就有了一種從被測(cè)DNA 序列兩端各測(cè)序一次的模式,被稱為雙末端測(cè)序(Pair-End Sequencing,簡(jiǎn)稱PE測(cè)序)。
灰色的是被測(cè)序的DNA 片段,左邊黃色與右邊藍(lán)色分別是測(cè)序出來(lái)的read1 與read2 序列,上圖中假定它們的長(zhǎng)度都是100bp。
雖然很多時(shí)候Pair-End測(cè)序還是無(wú)法完全的將這個(gè)被測(cè)DNA 的片段完全測(cè)完,但它依然提供了非常有用的信息。
比如當(dāng)我們知道每一對(duì)的read1與read2 都來(lái)自于同一個(gè)DNA片段,read1 與read2 之間的距離是這個(gè)DNA片段的長(zhǎng)度,且read1 與read2 的方向是剛好相反的。(這些信息對(duì)于后期的變異檢測(cè)等分析非常有用)
除此之外,read1 在fq1 文件中位置和read2 在fq2 文件中位置是相同的,而且read ID 之間只在末尾有一個(gè)'/1'或者'/2'的差別。
對(duì)應(yīng)雙末端,自然也有單末端測(cè)序(Single End Sequecing,簡(jiǎn)稱SE測(cè)序),它只測(cè)序其中一端。因此,在使用如bwa進(jìn)行比對(duì)時(shí),in2.fq是非強(qiáng)制性的(所以用方括號(hào)括起來(lái)),只有在雙末端測(cè)序時(shí)才需要添加。
Usage: bwa mem [options] <idxbase> <in1.fq> [in2.fq]
繼續(xù)下載SRA 文件
我們可以在通過(guò)sratoolkit 工具直接下載prefetch SRRxxxxx
某個(gè)SRR 的run 編號(hào)。(但實(shí)測(cè)速度非常慢)
或者也可以在NCBI 的SRR 網(wǎng)站上下載相關(guān)的數(shù)據(jù)。
下載完成后由于SRR 得到的是壓縮的文件,我們需要把里面的read1和read2的測(cè)序數(shù)據(jù)解壓出來(lái),變成需要的fastq格式。
fastq-dump --split-files SRR1770413.1
準(zhǔn)備就緒,現(xiàn)在目錄下就有這些東西了~
$tree ..
..
|-- bin
|-- input
| |-- E.coli_K12_MG1655.fa
| |-- E.coli_K12_MG1655.fa.fai
| |-- GCF_000005845.2_ASM584v2_genomic.fna.gz
| |-- SRR1770413.1
| |-- SRR1770413.1_1.fastq
| `-- SRR1770413.1_2.fastq
`-- output
正式開(kāi)始
-
將目錄內(nèi)容打理一下,再來(lái)看看有哪些東西。
質(zhì)控
關(guān)于質(zhì)控,是不可以省略的。
可以借助Trimmomatic。
參見(jiàn)http://www.lxweimin.com/p/56977fc52ecf
構(gòu)建索引
首先我們需要為該序列構(gòu)建一個(gè)索引,以便能夠在序列比對(duì)的時(shí)候進(jìn)行快速的搜索和定位。這里使用samtools。
samtools faidx E.coli_K12_MG1655.fa
根據(jù)samtools 幫助界面可知,faidx 還可以對(duì)序列內(nèi)容進(jìn)行提取。
faidx index/extract FASTA
因而我們也可以用它來(lái)提取特定區(qū)域的序列內(nèi)容。
$samtools faidx E.coli_K12_MG1655.fa NC_000913.3:1000000-1000200
>NC_000913.3:1000000-1000200
GTGTCAGCTTTCGTGGTGTGCAGCTGGCGTCAGATGACAACATGCTGCCAGACAGCCTGA
AAGGGTTTGCGCCTGTGGTGCGTGGTATCGCCAAAAGCAATGCCCAGATAACGATTAAGC
AAAATGGTTACACCATTTACCAAACTTATGTATCGCCTGGTGCTTTTGAAATTAGTGATC
TCTATTCCACGTCGTCGAGCG
序列比對(duì)
通過(guò)NGS 儀器測(cè)序得到的,而NGS 在測(cè)定這些序列的過(guò)程中,非常粗暴地將序列給沖散成一個(gè)個(gè)短序列(read),保存在FASTQ 文件中。因此文件中不同的read 之間是沒(méi)有位置關(guān)系的。
因此首先要做的就是通過(guò)序列比對(duì)的方式,將這些read 和物種的參考基因組(比如人的全基因組)比較,從而找到不同read 在參考基因組上本來(lái)的位置,將它們捋順排好。
在這次實(shí)踐中,我們就需要將獲得的E.coli 測(cè)序信息,與原始參考基因組序列進(jìn)行比對(duì),確定每一個(gè)read
的位置。
即便是相比起雙序列比對(duì)已經(jīng)有所優(yōu)化的BLAST 算法,面對(duì)海量的短數(shù)據(jù)時(shí),執(zhí)行的耗費(fèi)的時(shí)間也太長(zhǎng)了。而這里使用的便是BWA,其將BW(Burrows-Wheeler)壓縮算法和后綴樹(shù)相結(jié)合,可以耗費(fèi)較小的時(shí)間與空間,獲得較為準(zhǔn)確的序列比對(duì)結(jié)果。
關(guān)于blast 的知識(shí):BLAST 序列比對(duì)
使用bwa 構(gòu)建索引
首先需要為參考序列構(gòu)建bwa 比對(duì)所需要的FM-index 比對(duì)索引。
$bwa index E.coli_K12_MG1655.fa
[bwa_index] Pack FASTA... 0.03 sec
[bwa_index] Construct BWT for the packed sequence...
[bwa_index] 2.27 seconds elapse.
[bwa_index] Update BWT... 0.04 sec
[bwa_index] Pack forward-only FASTA... 0.02 sec
[bwa_index] Construct SA from BWT and Occ... 1.26 sec
[main] Version: 0.7.17-r1188
[main] CMD: bwa index E.coli_K12_MG1655.fa
[main] Real time: 3.904 sec; CPU: 3.625 sec
由于該序列比較短,所以很快(4s 不到,相比來(lái)說(shuō)人類基因組就得要3h了)索引就創(chuàng)建完畢了。
這時(shí)文件中便會(huì)多出來(lái)幾個(gè)**.fa.**
的文件。ps:其中E.coli_K12_MG1655.fa.fai
是我們之前用samtools
工具獲得的。
$ls -l
total 12544
-rw-r--r-- 1 root root 4699745 May 24 10:48 E.coli_K12_MG1655.fa
-rw-r--r-- 1 root root 12 May 27 16:17 E.coli_K12_MG1655.fa.amb
-rw-r--r-- 1 root root 98 May 27 16:17 E.coli_K12_MG1655.fa.ann
-rw-r--r-- 1 root root 4641732 May 27 16:17 E.coli_K12_MG1655.fa.bwt
-rw-r--r-- 1 root root 29 May 24 10:54 E.coli_K12_MG1655.fa.fai
-rw-r--r-- 1 root root 1160415 May 27 16:17 E.coli_K12_MG1655.fa.pac
-rw-r--r-- 1 root root 2320880 May 27 16:17 E.coli_K12_MG1655.fa.sa
接著我們使用mem BWA-MEM algorithm
這個(gè)算法,將E.coli K12質(zhì)控后的測(cè)序數(shù)據(jù)定位到其參考基因組上。ps:一般MEM模塊
適合長(zhǎng)read的比對(duì),目的是解決第三代測(cè)序技術(shù)這種能夠產(chǎn)生長(zhǎng)達(dá)幾十kb甚至幾Mbp的read情況。而通常小于等于70bp
的情況下,一般使用ALN
模塊。
為了方便顯示,就不使用代碼塊而轉(zhuǎn)為引用。
$bwa mem -t 4 -R '@RG\tID:foo\tPL:illumina\tSM:E.coli_K12' ~/20200524_wgs_practice/input/E.col/fasta/E.coli_K12_MG1655.fa ~/20200524_wgs_practice/input/E.col/fastq/SRR1770413.1_1.fastq ~/20200524_wgs_practice/input/E.col/fastq/SRR1770413.1_2.fastq|samtools view -Sb - > ~/20200524_wgs_practice/output/E_coli_K12.bam && echo "** bwa mapping done **"
解讀bwa 語(yǔ)法
由bwa 說(shuō)明界面可知:
Usage: bwa mem [options] <idxbase> <in1.fq> [in2.fq]
[options]
為一系列可選擇項(xiàng),比如這里的-t 4
, 表示四線程,-R
則指的是Read Group的字符串信息,以。而<idxbase>
輸入的便是參考基因組的bw 索引文件,便是之前通過(guò)bwa 操作建立的索引。
- 特別強(qiáng)調(diào)的
-R
@RG\tID:foo\tPL:illumina\[tSM:E.coli_K12'](tsm:E.coli_K12')
在比對(duì)語(yǔ)法中,我們以@RG
開(kāi)頭,表示為對(duì)比對(duì)的read 進(jìn)行分組。關(guān)于read group有以下幾個(gè)參數(shù):
1)ID。一般為測(cè)序的lane ID。
2)PL,為測(cè)序的平臺(tái),需要準(zhǔn)確填寫(xiě)。在GATK中,PL只被允許寫(xiě)為ILLUMINA,SLX,SOLEXA,SOLID,454,LS454,COMPLETE,PACBIO,IONTORRENT,CAPILLARY,HELICOS或UNKNOWN
等信息之一。如果這一步?jīng)]有設(shè)定正確的PL名稱,則后續(xù)使用GATK過(guò)程則可能會(huì)出現(xiàn)報(bào)錯(cuò)。
3)SM:為樣本ID,因?yàn)槲覀冊(cè)跍y(cè)序時(shí),由于樣本量較多,可能會(huì)分成許多不同的lane 被分別測(cè)出來(lái),這時(shí)候可以使用SM 區(qū)分這些樣本。
4)LB:測(cè)序文庫(kù)的名字。一般如果ID 足夠用于區(qū)分,則可以不設(shè)定LB。
對(duì)于序列比對(duì)而言,設(shè)定這四個(gè)參數(shù)就足夠了。除此之外,在RG中還需要用制表符\t
將各個(gè)內(nèi)容區(qū)分開(kāi)。
而<in1.fq>
與[in2.fq]
則表示質(zhì)控后的fastq 文件(也就是參考序列),因?yàn)檫@是雙末端測(cè)序,因此其結(jié)果有兩個(gè)文件。
管道后的內(nèi)容
而其中管道|
后面的內(nèi)容,則是將對(duì)比數(shù)據(jù)引至samtools工具,通過(guò)samtools 將文件轉(zhuǎn)換為bam
格式(sam
格式的二進(jìn)制形式),其中samtools view -b
便表示輸出為bam
。另外-Sb
與 >
中間的-
表示被引流的數(shù)據(jù)。接著重定向>
輸出到文件并保存。
對(duì)比對(duì)結(jié)果進(jìn)行排序
samtools sort -@ 4 -m 4G -O bam -o E_coli_K12.bam E_coli_K12.sorted.bam
其中-@ 4
表示排序時(shí)的線程,設(shè)定為4。
-m
表示限制排序時(shí)最大的內(nèi)存消耗,設(shè)定為4G。
-O bam
表示指定輸出格式為bam。
-o
表示輸出文件名,為‘E_coli_K12.sorted.bam’。
由于這里使用后我的會(huì)提示,Error: samtools sort: couldn't allocate memory for bam_mem
,嘗試不設(shè)置內(nèi)存。
samtools sort -O bam -o E_coli_K12.sorted.bam E_coli_K12.bam
$ll
total 481124
-rw-r--r-- 1 root root 284944979 May 27 16:41 E_coli_K12.bam
-rw-r--r-- 1 root root 207714622 May 27 18:26 E_coli_K12.sorted.bam
去除重復(fù)序列
完成了比對(duì)之后,就可以開(kāi)始進(jìn)行去重復(fù)了。(去除PCR 重復(fù)序列)
重復(fù)序列的產(chǎn)生
首先,什么是重復(fù)序列?
我們知道,在進(jìn)行NGS 測(cè)序時(shí),其中一個(gè)步驟便是橋式PCR擴(kuò)增
。而進(jìn)行該步驟目的就是為了彌補(bǔ)測(cè)序文庫(kù)由于構(gòu)建過(guò)程的種種問(wèn)題而導(dǎo)致濃度不夠的缺陷,因而會(huì)使測(cè)序過(guò)程極有可能漏掉某些原本基因組上的一些DNA片段,導(dǎo)致測(cè)序不全。
而正因?yàn)檎麄€(gè)反應(yīng)都是同步進(jìn)行,無(wú)差別式擴(kuò)增, 所以某些本身密度就不是很低的DNA序列也會(huì)被同步的放大,而這些DNA 片段就非常有可能會(huì)被重復(fù)去進(jìn)行測(cè)序。
重復(fù)序列的主要影響
其主要影響在于增大了變異的結(jié)果。
1)DNA 在打斷過(guò)程可能會(huì)引發(fā)一些堿基的顛換(嘌呤與嘧啶互換),而PCR 過(guò)程會(huì)放大該結(jié)果,以產(chǎn)生變異。
2)PCR 這一過(guò)程本身可能也會(huì)帶來(lái)新的堿基錯(cuò)誤。發(fā)生在前幾輪的PCR 擴(kuò)增反應(yīng)發(fā)生的錯(cuò)誤會(huì)在后續(xù)的過(guò)程里繼續(xù)放大,帶來(lái)新的變異。
3)對(duì)于真實(shí)的變異,PCR 反應(yīng)可能會(huì)對(duì)包含某一個(gè)堿基的DNA模版擴(kuò)增而更加劇烈(PCR bias),因此如果反應(yīng)對(duì)參考等位基因的模版偏向的話,可能會(huì)導(dǎo)致變異堿基的信號(hào)變小,因而導(dǎo)致假陰性結(jié)果。
因此,重復(fù)序列對(duì)于真實(shí)的變異檢測(cè)與真實(shí)序列的檢測(cè)都有不好的影響。GATK、Samtools 這些工具都會(huì)默認(rèn)序列數(shù)據(jù)為非重復(fù)序列,因此重復(fù)序列的去除是必不可少的操作。(或者直接采用PCR-free 的方案)
進(jìn)行重復(fù)序列的去除工作
現(xiàn)有的工具包括Samtools、Picard、gatk 都可以用于去除重復(fù)序列。
samtools 的rmdup
是直接將重復(fù)序列從比對(duì)BAM文件中刪除。picard與gatk 的MarkDuplicates
則是在BAM的FLAG信息中標(biāo)記出來(lái),不作刪除,但我們可以在變異檢測(cè)時(shí)識(shí)別它們,并忽略。
- 我們可以用gatk 來(lái)創(chuàng)建
gatk MarkDuplicates \
-I E_coli_K12.sorted.bam\
-O E_coli_K12.sorted.markdup.bam \
-M E_coli_K12.sorted.markdup_metrics.txt
$tree .
.
|-- E_coli_K12.bam
|-- E_coli_K12.sorted.bam
|-- E_coli_K12.sorted.markdup.bam
`-- E_coli_K12.sorted.markdup_metrics.txt
0 directories, 4 files
- 類似的也可以使用picard
java -jar picard.jar MarkDuplicates \
I=E_coli_K12.sorted.bam \
O=E_coli_K12.sorted.markdup.bam \
M=E_coli_K12.sorted.markdup_metrics.txt
picard 也提供了直接刪除重復(fù)序列的操作。
直接添加額外選項(xiàng),設(shè)定為true 即可REMOVE_DUPLICATES=true
。
創(chuàng)建序列索引
這一步的目的,是方便我們可以快速地訪問(wèn)基因組上任意位置的比對(duì)情況,有助于我們隨時(shí)了解數(shù)據(jù)。
samtools index E_coli_K12.sorted.markdup.bam
局部重比對(duì)
- 這一步與下面的BQSR 在gatk 分析E.coli K12 的本次實(shí)戰(zhàn)中都沒(méi)有應(yīng)用。原因有二。
沒(méi)有局部重比對(duì)是因?yàn)镚ATK 4.0 中沒(méi)有相應(yīng)的功能項(xiàng),但GATK4.0 也提供了GATK HaplotypeCaller
這個(gè)功能實(shí)現(xiàn)同樣的結(jié)果。
而沒(méi)有BQSR 則是因?yàn)镋.coli K12沒(méi)有那些必須的已知的變異集。
但我還是來(lái)了解一下重比對(duì)及BQSR 的執(zhí)行過(guò)程及它們的意義。
開(kāi)始前的合并
由上圖所顯示的那樣,一般在局部重比對(duì)開(kāi)始前,還有一部merge
操作。它的作用是將同個(gè)樣本的所有比對(duì)結(jié)果合并為一個(gè)大的bam文件。可以借助samtools 實(shí)現(xiàn)。
一般來(lái)說(shuō)有些樣本測(cè)序深度會(huì)很高,其測(cè)序結(jié)果需要經(jīng)過(guò)多次測(cè)序(或者分布在不同的測(cè)序lane中)才能全部獲得。
這時(shí)候一般是先比對(duì)排序并去重后再進(jìn)行合并。
samtools merge <out.bam> <in1.bam> [<in2.bam> ... <inN.bam>]
開(kāi)始局部重比對(duì)
局部重比對(duì)的目的是將BWA 比對(duì)過(guò)程中所發(fā)現(xiàn)有潛在序列插入或者序列刪除(insertion和deletion,簡(jiǎn)稱Indel)的區(qū)域進(jìn)行重新校正。這個(gè)過(guò)程往往還會(huì)把一些已知的Indel區(qū)域一并作為重比對(duì)的區(qū)域。
那么為什么要進(jìn)行校正這一步呢?
原因就在于參考基因組的序列特點(diǎn)以及bwa、bowtie 這類序列比對(duì)算法本身。這類在全局搜索序列最優(yōu)匹配的算法在存在Indel 區(qū)域的及其附近時(shí)往往會(huì)不準(zhǔn)確。【特別是當(dāng)一些存在長(zhǎng)Indel、重復(fù)性序列的區(qū)域或者存在長(zhǎng)串單一堿基(比如,一長(zhǎng)串的TTTT或者AAAAA等)的區(qū)域中更是如此?!?/p>
另外,在這些比對(duì)算法中,對(duì)于堿基錯(cuò)配以及出現(xiàn)間隙的容忍度即罰分情況是不同的,而一般的序列比對(duì)算法則更傾向于堿基錯(cuò)配的情況。這就會(huì)導(dǎo)致基因組上本來(lái)是非常大的一段Indel 的地方,被錯(cuò)誤的變?yōu)殄e(cuò)配內(nèi)容與短的gap。(關(guān)于雙序列比對(duì)罰分規(guī)則的影響,可以參見(jiàn):https://www.yuque.com/mugpeng/bioinfo/fgk5gz#b95f85b7
這必然會(huì)讓我們檢測(cè)到很多錯(cuò)誤的變異。而且,這種情況還會(huì)隨著所比對(duì)的read長(zhǎng)度的增長(zhǎng)(比如三代測(cè)序的Read,通常都有幾十kbp)而變得越加嚴(yán)重。
而進(jìn)行序列重比對(duì),就使用了Smith-Waterman 算法,實(shí)現(xiàn)對(duì)全局比對(duì)結(jié)果的校正和調(diào)整,最大程度低地降低由全局比對(duì)算法的不足而帶來(lái)的錯(cuò)誤。而且GATK的局部重比對(duì)模塊,除了應(yīng)用這個(gè)算法之外,還會(huì)對(duì)這個(gè)區(qū)域中的read進(jìn)行一次局部組裝,把它們連接成為長(zhǎng)度更大的序列,這樣能夠更進(jìn)一步提高局部重比對(duì)的準(zhǔn)確性。
比對(duì)先后的不同。(白色為空位,黑色為讀取序列,彩色為錯(cuò)配)
GATK 提供了相關(guān)的功能。(推測(cè)這里作者使用的是3.x 版本的GATK)
- 首先是通過(guò)
RealignerTargetCreator
,定位出所有需要進(jìn)行序列重比對(duì)的目標(biāo)區(qū)域。
java -jar GenomeAnalysisTK.jar \
-T RealignerTargetCreator \
-R human.fasta \
-I sample_name.sorted.markdup.bam \
-known 1000G_phase1.indels.b37.vcf \
-known Mills_and_1000G_gold_standard.indels.b37.vcf \
-o sample_name.IndelRealigner.intervals
- 接著通過(guò)
IndelRealigner
對(duì)所有在第一步中找到的目標(biāo)區(qū)域運(yùn)用算法進(jìn)行序列重比對(duì),最后得到新的結(jié)果。也就是上圖的after 的結(jié)果。
java -jar GenomeAnalysisTK.jar \
-T IndelRealigner \
-R human.fasta \
-I sample_name.sorted.markdup.bam \
-known 1000G_phase1.indels.b37.vcf \
-known Mills_and_1000G_gold_standard.indels.b37.vcf \
-o sample_name.sorted.markdup.realign.bam \
--targetIntervals sample_name.IndelRealigner.intervals
需要特別說(shuō)明的是,-R
參數(shù)所用的參考序列為.fasta 格式。
這里還需要額外說(shuō)明VCF文件。1000G_phase1.indels.b37.vcf
, Mills_and_1000G_gold_standard.indels.b37.vcf
分別來(lái)自于千人基因組項(xiàng)目和Mills項(xiàng)目,記錄了那些項(xiàng)目中檢測(cè)到的人群Indel區(qū)域。
候選的重比對(duì),除了要在樣本自身的比對(duì)結(jié)果中尋找外,還應(yīng)該把人群已知的Indel 區(qū)域也包含進(jìn)來(lái)。這些文件可以在GATK bundle ftp 中下載,(ftp://ftp.broadinstitute.org/bundle/)該版本需和參考基因組版本一致。
當(dāng)然我們之前也說(shuō)過(guò)了,如果我們?cè)诤竺娴淖儺悪z測(cè)使用GATK 的GATK HaplotypeCaller 模塊,則可以減少這個(gè)局部重比對(duì)過(guò)程。因?yàn)镚ATK HaplotypeCaller 模塊就包括了對(duì)潛在的變異區(qū)域進(jìn)行相同的局部重比。
堿基質(zhì)量重校正 BQSR
之前提到過(guò),在上面的E_coli_K12
基因組分析過(guò)程里,由于沒(méi)有已知的變異集,無(wú)法進(jìn)行這一步的操作。但這并不代表它不重要。
堿基質(zhì)量值是衡量測(cè)序出來(lái)的堿基準(zhǔn)確性的重要指標(biāo),而變異檢測(cè)也是極度依賴堿基質(zhì)量值。
而測(cè)定的堿基質(zhì)量值與真實(shí)結(jié)果(實(shí)際的堿基質(zhì)量)之間的偏差大小,也受到多方因素的影響。包括物理和化學(xué)等對(duì)測(cè)序反應(yīng)的影響,甚至連儀器本身和周圍環(huán)境都是其重要的影響因素。
BQSR(Base Quality Score Recalibration)這一方法也就應(yīng)運(yùn)而生。其主要采用機(jī)器學(xué)習(xí)
的方法來(lái)構(gòu)建測(cè)序堿基的錯(cuò)誤率模型
,并對(duì)這些堿基的質(zhì)量值進(jìn)行相應(yīng)的調(diào)整。
通過(guò)對(duì)比不難發(fā)現(xiàn),經(jīng)過(guò)BQSR 校正后,橫軸的理論值
更加接近了縱軸真實(shí)值
的數(shù)值,圖像也擬合為了一條直線。
但是,理論值我們可以通過(guò)fastq 文件獲得,真實(shí)值是如何產(chǎn)生的?
"真實(shí)值"是采用統(tǒng)計(jì)學(xué)的方法,獲得極其接近的分布結(jié)果。下面是尋求“真實(shí)值”的思路。
假如一個(gè)堿基的質(zhì)量報(bào)告為
20
。根據(jù)公式Q = -10log(p_error)
,則錯(cuò)誤率也就是10**-2 為1%
。換句話說(shuō),意思就是如果有100個(gè)堿基的質(zhì)量值均為20
,則其中將會(huì)有一個(gè)堿基測(cè)定結(jié)果是錯(cuò)的。現(xiàn)在的問(wèn)題就轉(zhuǎn)換成了如何找到這些錯(cuò)誤的堿基。
通常來(lái)說(shuō)人與人之間基因的整體差異是很小的,那么一般來(lái)說(shuō)在一個(gè)群體中發(fā)現(xiàn)的已知變異,在某個(gè)人身上也很可能是同樣存在的。
因此我們可以嘗試排除掉所有的已知變異位點(diǎn),接著計(jì)算每個(gè)報(bào)告中(測(cè)序結(jié)果)的質(zhì)量值和參考基因組比對(duì)有多少是不同的,這些不同的就可以認(rèn)定為是錯(cuò)誤的堿基,這些不同的堿基的數(shù)目所占整體其所屬的質(zhì)量值下相同的堿基的總數(shù)目的比例,就是真實(shí)的堿基錯(cuò)誤率。再通過(guò)
Q = -10log(p_error)
換算成質(zhì)量分?jǐn)?shù),就可以和測(cè)得的質(zhì)量數(shù)進(jìn)行比較了。不難發(fā)現(xiàn),在上圖的原始質(zhì)量值中,大部分的質(zhì)量值都被高估了。
和局部重比對(duì)一樣,BQSR 也包含了兩個(gè)步驟。
1)通過(guò)BaseRecalibrator
,計(jì)算出所有需要進(jìn)行重校正的read和特征值,并將這些信息輸出為一份校準(zhǔn)表文件(sample_name.recal_data.table)。
java -jar GenomeAnalysisTK.jar \
-T BaseRecalibrator \
-R human.fasta \
-I sample_name.sorted.markdup.realign.bam \
—knownSites 1000G_phase1.indels.b37.vcf \
—knownSites Mills_and_1000G_gold_standard.indels.b37.vcf \
—knownSites dbsnp_138.b37.vcf \
-o sample_name.recal_data.table
2)然后通過(guò)PrintReads
,利用第一步得到的校準(zhǔn)表文件(sample_name.recal_data.table)重新調(diào)整來(lái)BAM文件中的堿基質(zhì)量值,并輸出一份新的BAM文件。
java -jar /path/to/GenomeAnalysisTK.jar \
-T PrintReads \
-R human.fasta \
-I sample_name.sorted.markdup.realign.bam \
—BQSR sample_name.recal_data.table \
-o sample_name.sorted.markdup.realign.BQSR.bam
這里必須注意,BQSR實(shí)際是為了校正測(cè)序過(guò)程中的系統(tǒng)性錯(cuò)誤,因此,在執(zhí)行的時(shí)候也是按照不同的測(cè)序文庫(kù)進(jìn)行處理。而這時(shí)候@RG
信息就顯得尤為重要了,BQSR 就是通過(guò)識(shí)別@RG
中的ID
信息,從而分辨各個(gè)測(cè)序過(guò)程。
變異檢測(cè)
獲得最終的變異結(jié)果,是一般的全基因組分析的流程的目標(biāo)。
變異檢測(cè)的內(nèi)容一般會(huì)包括:SNP、Indel,CNV和SV等。而這里使用GATK HaplotypeCaller
模塊對(duì)樣本中的變異進(jìn)行檢測(cè),它也是目前最適合用于對(duì)二倍體基因組進(jìn)行變異(SNP
+Indel
)檢測(cè)的算法。
HaplotypeCaller
與一般的直接應(yīng)用貝葉斯推斷的算法有所不同,它會(huì)先推斷群體的單倍體組合情況,計(jì)算各個(gè)組合的幾率,然后根據(jù)這些信息再反推每個(gè)樣本的基因型組合。因此它不但特別適合應(yīng)用到群體的變異檢測(cè)中,而且還能夠依據(jù)群體的信息更好地計(jì)算每個(gè)個(gè)體的變異數(shù)據(jù)和它們的基因型組合。
如圖上所示,變異檢測(cè)應(yīng)用HaplotypeCaller
有兩種做法。對(duì)應(yīng)于但樣本與多樣本的情況。
做法一
直接使用HaplotypeCaller
。這個(gè)方法適合單樣本,或者固定樣本的情況。但缺陷是,如果需要增加新的樣本就必須要重新運(yùn)行HaplotypeCaller
,也就是所謂N+1 難題。
java -jar /path/to/GenomeAnalysisTK.jar \
-T HaplotypeCaller \
-R /path/to/human.fasta \
-I sample_name.sorted.markdup.realign.BQSR.bam \
-D /path/to/gatk/bundle/dbsnp_138.b37.vcf \
-stand_call_conf 50 \
-A QualByDepth \
-A RMSMappingQuality \
-A MappingQualityRankSumTest \
-A ReadPosRankSumTest \
-A FisherStrand \
-A StrandOddsRatio \
-A Coverage
-o sample_name.HC.vcf
- 其中
-D
參數(shù)輸入的dbSNP 也同樣可以在GATK bundle 中找到,這份文件匯集的是目前幾乎所有的公開(kāi)人群變異數(shù)據(jù)集。
除外,如果我們有多個(gè).bam樣本輸入則可以繼續(xù)使用-I
參數(shù)輸入。-I sample1.bam [-I sample2.bam ...]
一般來(lái)說(shuō),若是直接對(duì)人類基因組做變異檢測(cè),由于人類基因組數(shù)據(jù)過(guò)于龐大,往往整個(gè)過(guò)程會(huì)消耗大量的時(shí)間,通常需要幾十個(gè)小時(shí)甚至幾天。因此我們?yōu)榱颂岣咝士梢圆捎梅植紙?zhí)行的方法。
我們可以將基因上不同的染色體理解為相互獨(dú)立的(結(jié)構(gòu)性變異除外),也就是說(shuō),我們可以對(duì)待不同的染色體,一條條獨(dú)立的來(lái)執(zhí)行變異檢測(cè)這個(gè)步驟,最后再把結(jié)果合并起來(lái)。這里就額外指定一個(gè)參數(shù)-L
, 一般直接寫(xiě)-L 1
,但有的也會(huì)書(shū)寫(xiě)-L chr1
,這是由fasta 文件中的命名決定的。
做法二
第二個(gè)方法是在第一個(gè)方法之上,先將每個(gè)樣本各自生成一個(gè)gVCF,再對(duì)整個(gè)群體進(jìn)行joint-genotype。
gVCF
全稱為genome VCF
,是每個(gè)樣本用于變異檢測(cè)的中間文件,格式類似于VCF,它將整個(gè)joint-genotype
過(guò)程中需要的所有信息都記錄在這里面。而從文件大小上和數(shù)據(jù)量上,都遠(yuǎn)遠(yuǎn)小于原來(lái)的BAM文件。這樣一旦新增加樣本也不需要再重新去讀取所有人的BAM文件,只需要額外生成一份gVCF
并再進(jìn)行一次joint-genotype
就好。
開(kāi)始變異檢測(cè)
在開(kāi)始之前可以利用CreateSequenceDictonary
功能為E.coli K12的參考序列生成一個(gè).dict 的文件。
gatk CreateSequenceDictionary -R E.coli_K12_MG1655.fa \
-O E.coli_K12_MG1655.dict
接著就開(kāi)始變異檢測(cè)了。這里我們使用上面提到的做法二
。
- 首先需要生成gVCF 的中間文件。
gatk HaplotypeCaller -R E.coli_K12_MG1655.fa \
> --emit-ref-confidence GVCF \
> -I ~/20200524_wgs_practice/output/E.col/E_coli_K12.sorted.markdup.bam \
> -O ~/20200524_wgs_practice/output/E.col/E_coli_K12.g.vcf
這個(gè)過(guò)程一般會(huì)持續(xù)比較久的時(shí)間,比如僅僅是E.coli_K12
,就耗費(fèi)了Elapsed time: 3.79 minutes
。
其中--emit-ref-confidence GVCF
表示產(chǎn)生gVCF 的指令。
- 接著通過(guò)生成的gVCF檢測(cè)變異
gatk GenotypeGVCFs \
> -R ~/20200524_wgs_practice/input/E.col/fasta/E.coli_K12_MG1655.fa \
> -V E_coli_K12.g.vcf \
> -O E_coli_K12.vcf
這樣我們就獲得了E.coli K12 樣本的變異結(jié)果E_coli_K12.vcf
。
接著我們就可以用tabix為它構(gòu)建索引,方便以后的分析。
tabix -p vcf
提示需要先將其壓縮。
[tabix] was bgzip used to compress this file? E_coli_K12.vcf
壓縮一下
bgzip -f E_coli_K12.vcf
再重新執(zhí)行tabix 即可。
變異檢測(cè)質(zhì)控和過(guò)濾(VQSR)
和原始數(shù)據(jù)的質(zhì)控一樣,對(duì)變異檢測(cè)的結(jié)果進(jìn)行質(zhì)控和過(guò)濾,也是同樣的重要。VQSR,Variant Quality Score Recalibration,是通過(guò)構(gòu)建GMM模型對(duì)好和壞的變異進(jìn)行區(qū)分,從而實(shí)現(xiàn)對(duì)變異的質(zhì)控。它通過(guò)機(jī)器學(xué)習(xí)的方式,利用多個(gè)不同的數(shù)據(jù)特征訓(xùn)練一個(gè)模型以對(duì)變異數(shù)據(jù)進(jìn)行質(zhì)控。使用VQSR 需要具備兩個(gè)條件。
條件1:已知變異集
首先需要一個(gè)已知的變異集,將作為訓(xùn)練質(zhì)控模型的數(shù)集?,F(xiàn)在有Hapmap、OMNI,1000G和dbsnp等這些國(guó)際性項(xiàng)目的數(shù)據(jù),可以作為高質(zhì)量的變異集。GATK的bundle主要就是對(duì)這四個(gè)數(shù)據(jù)集做了精心的處理和選擇,然后把它們作為VQSR時(shí)的真集位點(diǎn)。
需要注意的是,VQSR并不是用這些變異集里的數(shù)據(jù)來(lái)訓(xùn)練的,而是用我們自己的變異數(shù)據(jù)。這些國(guó)際項(xiàng)目的數(shù)據(jù)集只是為我們提供了位點(diǎn),告訴模型群體中哪些位點(diǎn)
存在著變異,如果在其他人的數(shù)據(jù)里能觀察到落入這個(gè)集合中的變異位點(diǎn)
,那么這些被已知集包括的變異就有很大的可能是正確的。
因此我們可以從數(shù)據(jù)中篩選出那些和國(guó)際項(xiàng)目的數(shù)據(jù)集
也就是真集
相同的變異,并把它們當(dāng)作真實(shí)的變異
。接著,進(jìn)行VQSR的時(shí)候,程序就可以用這個(gè)篩選出來(lái)的數(shù)據(jù)
作為真集數(shù)據(jù)
來(lái)訓(xùn)練,并構(gòu)造模型了。
VQSR 的原理
VQSR 的核心就在于構(gòu)建一個(gè)區(qū)分“好”與“壞”變異的分類器。
該分類器是通過(guò)GMM 模型來(lái)構(gòu)建的。這個(gè)模型在構(gòu)造時(shí),并不是使用所有的數(shù)據(jù)來(lái)進(jìn)行構(gòu)造的。而是挑出一部分
,那些可以和已知的變異集合位點(diǎn)(國(guó)際項(xiàng)目的參考數(shù)據(jù)集,Hapmap、千人數(shù)據(jù)等)對(duì)應(yīng)的數(shù)據(jù)
,為它們分配不同的高可信度權(quán)重。基于群體遺傳的原理,已知的變異會(huì)被認(rèn)為是更加靠譜的變異,因此在初始化的時(shí)候先把它們當(dāng)作是正確的變異。
利用這個(gè)初始變異集
,我們可以按照特征訓(xùn)練一個(gè)區(qū)分好變異的GMM 模型,接著對(duì)全部數(shù)據(jù)進(jìn)行打分,再把那些評(píng)分低的挑選出來(lái),構(gòu)成一個(gè)最不正確的變異集合,并用這個(gè)集合構(gòu)建一個(gè)區(qū)分壞變異的GMM。
最后再同時(shí)利用好變異
與壞變異
的GMM 對(duì)變異數(shù)據(jù)進(jìn)行打分,通過(guò)該變異的評(píng)分,就可以評(píng)判這個(gè)變異的質(zhì)量值了。
條件2: 檢測(cè)結(jié)果有足夠多的變異
檢測(cè)結(jié)果必須有足夠多的變異信息,不然VQSR在進(jìn)行模型訓(xùn)練的時(shí)候會(huì)因?yàn)榭捎玫淖儺愇稽c(diǎn)數(shù)目不足而無(wú)法進(jìn)行。
由于條件1的限制(已知的變異集),包括我們上面的E.coli K12 在內(nèi),很多的非人的物種在完成變異檢測(cè)后是無(wú)法進(jìn)行VQSR 的。
而條件2則會(huì)導(dǎo)致某些捕獲測(cè)序(Panel測(cè)序數(shù)據(jù),甚至外顯子測(cè)序)的數(shù)據(jù),由于變異位點(diǎn)的不夠,也無(wú)法只使用VQSR。
硬過(guò)濾是什么
當(dāng)無(wú)法使用VQSR時(shí),就不得不考慮硬過(guò)濾的方法了。
所謂硬過(guò)濾,就是人為的設(shè)定一個(gè)或者若干個(gè)指標(biāo)閾值(數(shù)據(jù)特征值),然后把所有不滿足閾值的變異位點(diǎn)采用一刀切的方法切除。
我們?cè)撊绾螆?zhí)行硬過(guò)濾呢?或者說(shuō),該如何選擇指標(biāo)用以標(biāo)準(zhǔn)來(lái)評(píng)定變異呢?
我們可以直接使用gatk_vqsr 中精心挑選的指標(biāo)。這些指標(biāo)一共有6個(gè)(這些指標(biāo)都在VCF文件的INFO域中,如果不是GATK得到的變異,可能會(huì)有所不同,但知道它們的含義之后我們也是可以通過(guò)自己計(jì)算來(lái)確定的)
包括:
1.QualByDepth(QD)
2.FisherStrand (FS)
3.StrandOddsRatio (SOR)
4.RMSMappingQuality (MQ)
5.MappingQualityRankSumTest (MQRankSum)
6.ReadPosRankSumTest (ReadPosRankSum)
那么我們?cè)撊绾卧O(shè)定這些閾值呢?
QualByDepth(QD)
QD 是變異質(zhì)量值(Quality)
除以覆蓋深度(Depth)
得到的比值。而這里的變異質(zhì)量值就是VCF中QUAL
的值。QUAL
用來(lái)用來(lái)衡量變異的可靠程度;而Depth
則表示這個(gè)位點(diǎn)上所有的含有變異堿基的樣本的覆蓋深度之和
。通俗來(lái)說(shuō),這個(gè)數(shù)值可以由每個(gè)含變異的樣本的覆蓋深度累加獲得。
其中,對(duì)于樣本中的G/T 非0 樣本(GT=1/1表示純合變異;GT=0/1表示雜合變異;GT=0/0表示非變異),計(jì)算它們的加和。并按照定義,QD值即為質(zhì)量值QUAL
除以含有變異樣本的深度之和Depth
。
QD這個(gè)值描述的實(shí)際上就是單位深度的變異質(zhì)量值,一般來(lái)說(shuō)QD 越高變異的可信度也就越高。
但是QD 的數(shù)值是如何確定的呢?可以通過(guò)VQSR質(zhì)控先后的數(shù)據(jù)來(lái)進(jìn)行解釋。(這里選用的是NA12878 的數(shù)據(jù))
我們可以先把所有變異位點(diǎn)的QD值都提取出來(lái),然后畫(huà)一個(gè)密度分布圖。通過(guò)這個(gè)分布圖,不難了解到,QD的范圍主要集中在0~40之間。而兩個(gè)峰值分別為QD = 12 以及QD = 32。
其中第一個(gè)峰(QD=12)代表雜合,而第二峰(QD=32)代表純合。因?yàn)閷?duì)于純合變異來(lái)說(shuō),貢獻(xiàn)給質(zhì)量值的read 是雜合變異的兩倍,因而同樣深度的情況下,QD 會(huì)更大一些。
接著我們可以畫(huà)出VQSR 后的所有可信變異(綠色),與不可信變異(紅色)的QD分布圖。
由圖可見(jiàn),大部分的不可信變異都集中在了左側(cè)的低QD區(qū)域,而恰好紅色區(qū)域的波峰為QD = 2 處。
但我們也不難發(fā)現(xiàn),在高的QD 區(qū)域其實(shí)也存在小部分的不可信變異(紅)分布;而同樣在低QD 區(qū)域也存在小部分的可信變異(綠)。而這樣的結(jié)果也是硬過(guò)濾的弊端。它不會(huì)像VQSR那樣,通過(guò)多個(gè)不同維度的數(shù)據(jù)構(gòu)造合適的高維分類模型,從而能夠更準(zhǔn)確地區(qū)分好和壞的變異,而僅僅是一刀切。
FisherStrand (FS)
FS 是通過(guò)Fisher檢驗(yàn)的p-value轉(zhuǎn)換而來(lái)的值,它是用來(lái)描述測(cè)序或者比對(duì)時(shí)對(duì)于只含有變異的read
以及只含有參考序列堿基的read
是否存在著明顯的正負(fù)鏈特異性(Strand bias,或者說(shuō)是差異性)
這個(gè)差異反映了測(cè)序過(guò)程是否隨機(jī),或者說(shuō)比對(duì)算法是否在基因組的某些區(qū)域存在一定的選擇傾向。如果測(cè)序過(guò)程是隨機(jī)的,而且比對(duì)不存在問(wèn)題,則無(wú)論read 是否存在變異,再或者該變異來(lái)自于基因組的正鏈或負(fù)鏈,只要是真實(shí)的,這些read 都應(yīng)該是比較均勻的,也就是說(shuō)FS 的值應(yīng)該接近于零
,即不出現(xiàn)鏈特異的比對(duì)結(jié)果。
除此之外,在VCF文件的INFO區(qū)域內(nèi),有些時(shí)候除了FS,還可能會(huì)有SB 或SOR。它們實(shí)際上也是從不同層面對(duì)鏈特異描述的指證。SB 表示原始各鏈比對(duì)數(shù)目,而FS 是對(duì)結(jié)果進(jìn)行了Fisher檢驗(yàn)后轉(zhuǎn)換而來(lái)的結(jié)果;SOR則和FS 類似,只是使用了不同的統(tǒng)計(jì)方法來(lái)計(jì)算差異程度,它更適合高覆蓋度的數(shù)據(jù)
。
而FS 硬過(guò)濾數(shù)值的確定,和QD 的確定過(guò)程是類似的。
由圖可見(jiàn),F(xiàn)S 的數(shù)值范圍非常廣泛,而大多數(shù)的結(jié)果還是集中在了100以內(nèi)。
而經(jīng)過(guò)VQSR 后的結(jié)果,和QD 的圖也是類似的。所有可信變異(綠色),與不可信變異(紅色)。大部分的可信變異都在
0-10
之間,而大部分的不可信變異都集中在60附近。因此過(guò)濾的時(shí)候,我們把FS設(shè)置為大于60。雖然這么做看起來(lái)很激進(jìn)(60以下還是有很多的不可信變異紅色區(qū)域),但是由于不可信變異的變化非常平緩,無(wú)論如何都會(huì)保留大部分,倒不如選擇一個(gè)可以保留多的可信變異內(nèi)容的數(shù)值,再借助其他的過(guò)濾指標(biāo)進(jìn)行篩選。
StrandOddsRatio(SOR)
和FS 一樣,SOR 也是對(duì)鏈特異的一種描述。由于常常FS 在硬過(guò)濾的時(shí)候不是很能滿足過(guò)濾的需求(如上所述的那樣),而且很多時(shí)候read 在外顯子區(qū)域末端的覆蓋存在著一定的鏈特異(是正常的),往往只有一個(gè)方向的read,這個(gè)時(shí)候如果該區(qū)域中有變異位點(diǎn)的話,則FS 會(huì)給出很差的分值,而SOR 就可以起到補(bǔ)充校正的作用了。
SOR 計(jì)算使用的是symmetric odds ratio test,數(shù)據(jù)表現(xiàn)為一個(gè)2×2的列聯(lián)表。
考慮的其實(shí)就是ALT和REF這兩個(gè)堿基的read覆蓋方向的比例是否有偏,如果完全無(wú)偏,那么應(yīng)該等于1。
SOR = (ref_fwd/ref_rev) / (alt_fwd/alt_rev)
可以看到,大部分的SOR 分布集中在0~3 之間。
可信變異大部分集中在0~3 之間,因此可以將閾值選擇為3。
RMSMappingQuality(MQ)
MQ 表示的是所有比對(duì)至該位點(diǎn)上的read的比對(duì)質(zhì)量值的平方和的平均值的平方根。
這個(gè)數(shù)值相比平均值,能夠更好的反應(yīng)整體的比對(duì)質(zhì)量值的離散程度。如果我們的比對(duì)工具用的是bwa mem,那么按照它的算法,對(duì)于一個(gè)好的變異位點(diǎn),我們可以預(yù)期,它的MQ值將等于60。
由圖顯示,在40以下,不可信變異幾乎完全沒(méi)有了,因此可以將閾值設(shè)定為40。
除此之外,對(duì)于MappingQualityRankSumTest(MQRankSum) 與ReadPOSRankSumTest(ReadPOSRankSum)的設(shè)定原理,和其他四個(gè)是完全一樣的, 都是通過(guò)VQSR 密度分布圖,確定了硬過(guò)濾的閾值(保留大多數(shù)的可信變異,剔除大多數(shù)的不可信變異)。
執(zhí)行硬過(guò)濾
gatk 提供了VariantFiltration
模塊來(lái)進(jìn)行硬過(guò)濾。但需要注意的是,過(guò)濾的時(shí)候需要分SNP 與Indel 兩個(gè)不同的變異類型來(lái)進(jìn)行。因?yàn)檫@兩個(gè)變異類型的一些閾值是不同的,需要區(qū)別對(duì)待。
為SNP進(jìn)行硬過(guò)濾
首先要選擇出SNP
gatk SelectVariants \
-select-type SNP \
-V ../output/E.coli/E_coli_K12.vcf.gz \
-O ../output/E.coli/E_coli_K12.snp.vcf.gz
接著對(duì)這些SNP 進(jìn)行硬過(guò)濾。
gatk VariantFiltration \
-V ../output/E.coli/E_coli_K12.snp.vcf.gz \
--filter-expression "QD < 2.0 || MQ < 40.0 || FS > 60.0 || SOR > 3.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" \
--filter-name "PASS" \
-O ../output/E.coli/E_coli_K12.snp.filter.vcf.gz
為Indel 進(jìn)行硬過(guò)濾
選擇出Indel
gatk SelectVariants \
-select-type INDEL \
-V ../output/E.coli/E_coli_K12.vcf.gz \
-O ../output/E.coli/E_coli_K12.indel.vcf.gz
對(duì)Indel 進(jìn)行過(guò)濾
gatk VariantFiltration \
-V ../output/E.coli/E_coli_K12.indel.vcf.gz \
--filter-expression "QD < 2.0 || FS > 200.0 || SOR > 10.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" \
--filter-name "PASS" \
-O ../output/E.coli/E_coli_K12.indel.filter.vcf.gz
合并過(guò)濾結(jié)果
上面關(guān)于Indel 與SNP 的過(guò)濾所使用的閾值都是借用NA12878(來(lái)自GIAB)的高深度數(shù)據(jù)進(jìn)行計(jì)算獲得的,但如果序列來(lái)源不是哺乳動(dòng)物,就最好選定新的合適的閾值。
gatk MergeVcfs \
-I ../output/E.coli/E_coli_K12.snp.filter.vcf.gz \
-I ../output/E.coli/E_coli_K12.indel.filter.vcf.gz \
-O ../output/E.coli/E_coli_K12.filter.vcf.gz
Ti/Tv 的范圍
可以將Ti/Tv 值理解為物種在與自然相互作用和演化過(guò)程中在基因組上留下來(lái)的一個(gè)統(tǒng)計(jì)標(biāo)記,在物種中這個(gè)值具備一定的穩(wěn)定性。
Ti 是轉(zhuǎn)換 Transition, 指的是嘌呤轉(zhuǎn)嘌呤,嘧啶轉(zhuǎn)嘧啶,A-G,C-T。
Tv是顛換 Transversion,指的是嘌呤轉(zhuǎn)嘧啶,嘧啶轉(zhuǎn)嘌呤,A-C,A-T,G-T或 G-C。
因此在完成變異質(zhì)控之后,我們最好再看一下這些變異位點(diǎn)Ti/Tv的值是多少,以此來(lái)進(jìn)一步確定結(jié)果的可靠程度。
另外,在哺乳動(dòng)物基因組上C->T的轉(zhuǎn)換比較多,這是因?yàn)榛蚪M上的胞嘧啶C在甲基化
的修飾下容易發(fā)生C->T的轉(zhuǎn)變。
一般來(lái)說(shuō),如果沒(méi)有選擇壓力,Ti/Tv將等于0.5,因?yàn)閺母怕噬蟻?lái)說(shuō),Tv 發(fā)生的概率是Ti 的兩倍。而事實(shí)上,對(duì)于不同的物種,有不同的差異。對(duì)于人來(lái)說(shuō),全基因組正常的Ti/Tv在2.1
左右,而外顯子中則在3.0
,新發(fā)生的變異則在1.5
左右。(Tv 更容易發(fā)生)
Ti/Tv 實(shí)際上是一個(gè)被動(dòng)指標(biāo),因此我們只能夠用它來(lái)檢驗(yàn)結(jié)果的可靠程度,而不能夠?qū)⑵渥鳛橐粋€(gè)變異質(zhì)控的過(guò)濾標(biāo)準(zhǔn)。
最后
其實(shí)我們都可以把各個(gè)步驟的命令寫(xiě)稱shell 腳本保存起來(lái),這樣就像程序一樣,我們可以合并或者修改腳本中的某些參數(shù),達(dá)到一個(gè)快速的流程化的全基因組分析。