??最近一直忙期末匯報和腳本編寫,沒來的及接著往下寫文章,年前把這一塊寫了,然后再往下的分析流程就比較特異性了,做一步寫一步那種,相對于這種已經常規化的流程(除了一些細節上的差異,別的都是大同小異的了),再往下的可能就不是很常規的分析手段了,不同的實驗室有不同的分析方法,希望能夠有大佬提點意見,多多交流。
“突變”區別
??對于WGS的數據,在處理完bam文件以后,就是call variations了,之后所有的工作其實都是針對variations進行分析,那么說到變異呢,其實中文的“變異”在英文里對應多個單詞,經常看到傻傻分不清,這里稍微區別一下。
??mutation:核苷酸序列的永久性改變(來源于ACMG),在人群中小于1%或5%(來源于北大生物信息學公開課)
??polymorphism:在人群中頻率超過1%(來源于ACMG),或超過5%(來源于北大生物信息學公開課)
??variation/variant:以上兩個的總和(來源于北大生物信息學公開課)
變異類型
??我們一般所說的variations主要有四大類:SNV,INDEL,SV,CNV。
????SNV即單核苷酸位點變異(single nucleotide variants)
????INDEL即小片段插入缺失(insertion and deletion)
????SV即結構變異(structural variation)
????CNV即拷貝數變異(copy number variation)
SNV與SNP
??說到SNV,可能大家也經常看到SNP(single nucleotide polymorphism),同樣是混淆使用,這倆其實還是有一些區別的,看到上面對變異的區分,其實也能看出這倆的區別來:
??一般SNP是二態的,SNV沒有這樣的限制,如果在一個物種中該單堿基變異的頻率達到一定水平(1%)就叫SNP,而頻率未知(比如僅僅在一個個體中發現)就叫SNV,SNV包含SNP。
變異簡述
??人基因組通常有4.1~5.0M的變異,但是99.9%都是由SNV和short indel造成。
??通常,一個人全基因組內會有約 3.6~4.4 M 個 SNVs,絕大數(大于 95%)的高頻(群體中等位基因頻率大于 5%)的 SNP 在 dbSNP中有記錄,高頻的SNP一般都不是致病的主要突變位點。
??通常,一個人全基因組內會有約 600K 的 Indel(<50bp的插入缺失為small indel)。
??編碼區或剪接位點處發生的插入缺失都可能會改變蛋白的翻譯。
SV
??結構變異指的是在基因組上一些大的結構性的變異,比如大片段丟失(deletion)、大片段插入(insertion)、大片段重復(duplication)、拷貝數變異(copy number variants)、倒位(inversion)、易位(translocation)。一般來說,結構變異涉及的序列長度在1kb到3Mb之間。結構變異普遍存在于人類基因組中,是個人差異和一些疾病易感性的來源。結構變異還可能導致融合基因的發生,一些癌癥已經證實和結構變異導致的基因融合事件有關。
CNV
??拷貝數變異指的是基因組上大片段序列拷貝數的增加或者減少,可分為缺失(deletion)和重復(duplication)兩種類型,是一種重要的分子機制。CNV能夠導致孟德爾遺傳病與罕見疾病, 同時與包括癌癥在內的復雜疾病相關,因此對于染色體水平的缺失、擴增的研究已經成為疾病研究熱點。
以上數據在不同的數據庫或文獻上可能有所差異,但相去不遠,具體的變異分類以及分布就不詳述,可參考一些文獻,下面說說怎么進行其中的SNV和indel的檢測。
??以下我將提供兩種分析方式的腳本(DeepVariant以及bcftools)和流程,為啥沒有GATK?因為我覺得黃老師的這篇GATK分析流程寫得已經很好了,大家可以參考一下。
Bcftools
??與舊版的samtools+bcftools不同,作者為了避免bcftools和samtools的版本不同導致的不兼容,新版的bcftools可以自己完成call snv/indel的工作。
??使用bcftools進行變異檢測,一般分為三部曲,分別為三個模塊mpileup、call、filter,當然,我們一般也不會分三步進行操作,而是使用管道(pipeline)進行編寫腳本,這樣能減少產生一些不必要的過程文件,同時提高自動化和效率,下面是我的實際使用腳本。
$ bcftools mpileup --threads 12 -q 20 -Q 20 -Ou -f /your/path/of/reference /your/bamfile/after/sorted.merged.markdup | bcftools call --threads 12 -vm -Ov | bcftools filter --threads 12 -s FILTER -g 10 -G 10 -i "%QUAL>20 && DP>6 && MQ>50 && (DP4[2]+DP4[3])>4" > raw.tmp.vcf
## bcftools mpileup檢測變異;
# --threads線程數
# -q表示reads比對質量選擇,MAPQ,默認0;
# -Q表示reads堿基對質量選擇,默認13
# -O表示輸出格式,u表示未壓縮bcf格式;
# -f參考序列位置
## bcftools call參數
# --threads線程;
# -v只輸出變異位點;
# m為克服-c調用模型中已知的局限性(與-c沖突)而設計的多等位和罕見變異調用的替代模型;
# -O輸出文件格式v未壓縮vcf;
## bcftools filter篩選變異;-i只保留后面條件的;-s對不符合的變異打上標簽
$ awk -F "\t" '{if($1~/#/){print}else if($7~/PASS/){print}}' raw.tmp.vcf > var.flt.vcf
# 將標為低質量的變異去掉
??有幾個點值得討論一下,首先是mpileup的-q參數,這個和之前提到的samtools view的-q是一樣的,前面的文章有大篇幅說過這個MAPQ的數值,20翻譯過來的意思其實就是比對正確率99%。
??filter中的-s是軟過濾的意思,就是把不符合后面條件的variations打上標簽,但不過濾掉;-g,-G這對參數是說,indel附近的indel或snp是不準確的,大多是假陽性,過濾掉,這里我設的10bp,這個值還是比較合理的;-i是保留后面符合條件的變異,剛好和-e相反,兩者選其一,我這里用的-i編寫過濾表達式
????QUAL:基于Phred格式的表示ALT的質量,也可以理解為可靠性;可以理解為所call出來的變異位點的質量值。Q=-10lgP,Q表示質量值;P表示這個位點發生錯誤的概率。因此,如果想把錯誤率從控制在90%以上,P的閾值就是1/10,那lg(1/10)=-1,Q=(-10)*(-1)=10。同理,當Q=20時,錯誤率就控制在了0.01。這個參數其實和mpileup的-Q是重復的。
????DP是堿基的覆蓋深度,一般很多公司和課題組會選擇10,但我這里選擇的是6,本著寬進嚴出的原則,保留更多的陽性variations,10也是沒有關系的。
????參考上一篇里的MAPQ分布可以看到,使用bwa mem后,其實大多數的reads的MAPQ都在60,這樣的話,MQ最好也就是60,但是在40有一個小突起,對于MQ的篩選,大家的選擇可以酌情而定,50是一個大家使用較多的閾值點。
????DP4分別是正反鏈上REF和ALT的深度,我用“DP4[2]+DP4[3]>4”篩選ALT的深度至少是5的variations。
??那么,以上的腳本其實是符合單個樣本進行分析的,但如果是家系樣本進行分析,其實是有問題的,因為在call這一步的時候用-v參數只輸出變異位點,在獲得了三個人的vcf文件進行merge的時候,對于一些變異(這些變異只存在于三個人的某一個或某兩個),你就不知道不存在的那個人身上,是因為無變異還是沒有覆蓋到reads。這不利于做trio分析。那么要克服這個問題只需要去掉-v參數即可。
??然后進行merge,是在完成了一個家系的call snp/indel以后。
$ bgzip -c -f -@ 12 var.flt.vcf > var.vcf.gz
# 進行文件壓縮;-c不改變內容; -f強制輸出,存在就覆蓋;-@線程數
$ bcftools index -t var.vcf.gz
# 建立索引,merge需要; -t建立tbi格式索引
$ bcftools merge -Ov --force-samples -l file.list -o merge.var.vcf
# 進行合成,-O輸出文件格式,v表示vcf格式文件;
# --force-samples,對于重名樣本強制合成;-o輸出文件
# -l包含文件名的文件,一行一個文件名,將先證者放在第一位
??之后可以用bcftools對結果做一下統計處理
## 統計結果plot-vcfstats
$ bcftools stats -F/your/path/of/reference -s - merge.var.vcf > merge.var.vcf.stats && \
$ plot-vcfstats merge.var.vcf.stats -p vars_output
# plot-vcfstats程序在bcftools下的misc目錄中
DeepVariant
??谷歌提供了分別適用于WGS和WES的腳本,可供大家參考。我親測了一下這個軟件,速度有點慢……完全沒有谷歌自己描述的那么快,做為嘗鮮吧,把當時的腳本放上來,這里要特別感謝師姐的指導!雖然最后我也沒打算用這個軟件完成我的課題吧。
????https://github.com/google/deepvariant/tree/r0.7/scripts
??Deepvariant無需安裝,直接拉docker下來就行,不然要是安裝,這個環境配置怕是要折磨死人的。
# docker安裝,僅針對ubuntu用戶
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ sudo docker run hello-world
$ sudo usermod -aG docker $USER
??拉取一下docker就可以使用deepvariant了
$ sudo docker pull dajunluo/deepvariant
$ sudo docker images
$ sudo docker run -it dajunluo/deepvariant:latest
$ sudo docker run -it --name deepvariant -v /you/path/of/refrence/dir/:/home/ref_hg19 -v /home/biowork/:/home/biowork dajunluo/deepvariant
# -v是把我本地的數據對接到docker環境里,這個請自行根據需要對接
$ nohup python /home/bin/make_examples.zip --mode calling --ref /you/path/of/refrence --reads //you/path/of/bam --examples example.gz > 1.log &
$ nohup python /home/bin/call_variants.zip --outfile call_variants_output.gz --examples example.gz --checkpoint /home/models/model.ckpt > 2.log &
$ nohup python /home/bin/postprocess_variants.zip --ref /you/path/of/refrence --infile call_variants_output.gz --outfile output.vcf.gz > 3.log &
??之后便可以用bcftools或者gatk進行merge,對于這一步可以參考上面的gatk鏈接或者bcftools步驟。
??到了這一步就可以完了么?顯然不是,你用上述兩個方法或者參考黃老師的腳本用gatk得到的結果,如果你仔細看,就會發現。
??這是什么鬼,這又是什么鬼,為什么有那么多的多等位位點,你要是去統計,會發現這樣的多等位位點還挺多的,所以你還不能直接過濾。對于這些變異我們一般是不會考慮嵌合的,因為平均30X的WGS是沒法檢測出嵌合體的。那么對于這樣的位點怎么去考慮分析呢?
??比較便捷的方法就是用bcftools里面的norm工具了。
$ bgzip -c -f -@ 12 merge.var.vcf > merge.var.vcf.gz
# 進行文件壓縮;-c不改變內容; -f強制輸出,存在就覆蓋;-@線程數
$ bcftools index -t merge.var.vcf.gz
# 建立索引, -t建立tbi格式索引
$ bcftools norm -Ov -m-any -f /you/path/of/refrence merge.var.vcf.gz > norm.vcf
??這樣,多等位位點就變成了二等位位點了,便于后續的分析。今天的內容就到這里了,下一篇就是注釋以及各種過濾了。
??水平有限,要是存在什么錯誤請評論指出!請大家多多批評指正,相互交流,共同成長,謝謝!!!