往期教程
SNP位點過濾
SNP過濾有兩種情況,一種是僅根據(jù)位點質(zhì)量信息(測序深度,回帖質(zhì)量等)對SNP進行粗過濾。如果使用GATK對重測序結(jié)果進行SNP calling,那么可以考慮下面的標準
QD< 2.0 || FS> 60.0 || MQ< 40.0 || MQRankSum <?12.5 || ReadPosRankSum <?8.0
-
QUAL<30.0||QD<2.0||FS>60.0||MQ<40.0||SOR>4.0
和--clusterWindowSize 5 --clusterSize 2
關(guān)于這部分的過濾方法,參考如下幾篇( TODO)
另一種過濾會考慮除了測序質(zhì)量以外的信息,例如文章在方法部分所寫的內(nèi)容
Bi-allelic SNPs with a missing data rate less than 15% and a minor allele count greater than three were kept for population genomic analyses. Additionally, only SNPs at fourfold degenerated sites (89,914 SNPs) were used to construct a neighbor-joining phylogenetic tree using MEGA7 with 500 bootstraps61. ... STRUCTURE analyses were run 20 times for each K value ranging from 2 to 20, using 8,000 randomly selected SNPs at fourfold degenerated sites ...
- Bi-allelic, 相對于multi-allelic, 也就是該位點中只有一個等位基因位點。會過濾掉REF=A, ALT=C,G的SNP位點
- 缺失率低于15%: 保證對于任意一個SNP,群體里至少有85%樣本有基因型
- 次要等位基因的count數(shù)大于3: 在本文語境中相當于MAF=0.01
- 四倍兼并位點: 在2013年的黃瓜NG中,選擇4D位點原因是它們的選擇壓小,更能反應群體結(jié)構(gòu)(population structure and demography)
前三個條件的實現(xiàn)相對簡單,雖然VCFtools和BCFtools都可以實現(xiàn)這種過濾,但是BCFtools的執(zhí)行速度更快(大概是前者的2倍),所以我推薦使用BCFtools。
# BCFtools
bcftools view -i 'F_MISSING < 15 & MAC > 3' -m2 -M2 watermelon_414acc_SNP2.vcf.gz -Oz -o watermelon_414acc_SNP2_flt1.vcf.gz &
# VCFtools
# vcftools --gzvcf watermelon_414acc_SNP2.vcf.gz --min-alleles 2 --max-alleles 2 --max-missing 0.15 --mac 3 --recode --recode-INFO-all --stdout | bcftools view -Oz -o watermelon_414acc_SNP2_flt1.vcf.gz &
bcftools index watermelon_414acc_SNP2_flt1.vcf.gz
我同時運行了兩個程序,最終原始的19,725,853 SNP經(jīng)BCFtools過濾后為11,925,733,而VCFtools過濾后是12,555,059,BCFtools用時6202秒, VCFtools用時10883秒。我使用vcftools
的比較功能,發(fā)現(xiàn)問題問題出在MAC的這個標準上,vcftools中--mac 3
會包括MAF=3的情況,而我寫的bcftools過濾表達式為MAC > 3
沒有包括3。根據(jù)文章的描述,vcftools過濾參數(shù)應該寫成--mac 4
。
出處: Include only sites with Minor Allele Count greater than or equal to the "--mac" value and less than or equal to the "--max-mac" value。
四倍兼并位點(4d)過濾稍微麻煩一些,似乎也不是所有文章都會使用該方法。我個人為使用該方法的主要目的是進一步減少SNP的數(shù)目,降低后續(xù)構(gòu)建系統(tǒng)發(fā)育樹和群體結(jié)構(gòu)分析的計算量。
過濾4d位點有兩種方法,一種是基于注釋的VCF文件自己寫腳本處理,一種是先生成所有的4D候選位置,然后遍歷VCF文件并判斷當前位點是否為4D。此處,我們采用第二種方法,第一種作為練習題。
我們使用Reseqtools根據(jù)Fasta和GFF提取所有的4D位點
# 提取位點
iTools Fatools getCdsPep -Ref watermelon/97103_genome_v2.fa -Gff watermelon/97103_gene_gff_v2 -4DSite -OutPut watermelon
zcat watermelon.4Dsite.gz | cut -f 1,2 > watermelon.4Dsite.txt
然后我們可以使用BCFtools的-R
參數(shù)進行過濾,但是速度會很慢,因為每個位點都要和將近400w個位點進行比較。
bcftools view -R watermelon.4Dsite.txt watermelon_414acc_SNP2.flt1.vcf.gz -Oz -o watermelon_414acc_SNP2.flt2.vcf.gz
或者我們可以寫一個Python腳本filter_vcf_by_4d.py
,先將所有位置保存在一個集合中,接著遍歷VCF文件,將每個位置和存放位置的集合進行比較,使用方法如下
python filter_vcf_by_4d.py watermelon_414acc_SNP2_flt1.vcf.gz watermelon_414acc_SNP2_flt2.vcf.gz watermelon.4Dsite.txt &
我的腳本運行時間大約是1502s(25分鐘),而用bcftools跑了6小時都還沒有結(jié)束。雖然時間存在區(qū)別,但是兩者的輸出結(jié)果完全相同。
除了4D位點過濾外,更常見的一種過濾方法是基于LD(連鎖不平衡)對SNP進行過濾,我們這里使用Plink進行數(shù)據(jù)過濾。
Plink的過濾是基于VCF的ID列,而我們這里的數(shù)據(jù)的ID列標記為缺失,因此我們需要先用bcftools annotate
對位點進行簡單注釋。
# 需要注釋位點,增加ID列
bcftools annotate --set-id +'%CHROM\_%POS\_%REF\_%FIRST_ALT' watermelon_414acc_SNP2_flt2.vcf.gz -Oz -o watermelon_414acc_SNP2_flt2_anno.vcf.gz
接著用Plink的--indep-pairwise 窗口大小 步長 R2
篩選位點
plink --vcf watermelon_414acc_SNP2_flt2_anno.vcf.gz --const-fid --allow-extra-chr --indep-pairwise 50 10 0.2 --out watermelon_414ac
c_SNP2_flt3
最后用plink extract
根據(jù)"prune.in"從原來的vcf文件中提取信息
plink --allow-extra-chr --extract watermelon_414acc_SNP2_flt3.prune.in --make-bed --out watermelon_414acc_SNP2_flt3 --recode vcf-iid --vcf watermelon_414acc_SNP2_flt2_anno.vcf.gz
最終,19,725,853個SNP經(jīng)過四個條件過濾后,剩下了141,324個SNP,和原文的89,914相比,多了大約5萬個位點,如果繼續(xù)根據(jù)連鎖平衡進行過濾,最后會只剩下10,104個SNP。
filter_vcf_by_4d.py
腳本如下