美文网首页funny生物信息群体遗传
VCF格式的学习及对VCF文件的统计

VCF格式的学习及对VCF文件的统计

作者: 天秤座的机器狗 | 来源:发表于2018-08-03 14:52 被阅读884次

    部分摘自# VincentLuo91的博客

    Part 1 VCF格式的学习

    1.什么是vcf?
    VCF是用于描述SNP,INDEL和SV结果的文本文件。在GATK软件中得到最好的支持,当然SAMtools得到的结果也是VCF格式,和GATK的VCF格式有点差别。
    2. VCF的主体结构
    VCF文件分为两部分内容:以“#”开头的注释部分;没有“#”开头的主体部分
    3.VCF的10列的意义
    1CHROM : 参考序列名称
    2POS:variant的位置;如果是INDEL的话,位置是INDEL的第一个碱基位置
    3ID:variant的ID;比如在dbSNP中有该SNP的id,则会在此行给出;若没有,则用’.'表示其为一个novel variant
    4REF:参考序列的碱基
    5ALT:variant的碱基
    6QUAL:Phred格式(Phred_scaled)的质量值,表 示在该位点存在variant的可能性;该值越高,则variant的可能性越大;计算方法:Phred值 = -10 * log (1-p) p为variant存在的概率; 通过计算公式可以看出值为10的表示错误概率为0.1,该位点为variant的概率为90%,qual值与p成正比例
    7FILTER:使用上一个QUAL值来进行过滤的话,是不够的。GATK能使用其它的方法来进行过滤,过滤结果中通过则该值为”PASS”;若variant不可靠,则该项不为”PASS”或”.”。
    8INFO:这一行是variant的详细信息,内容很多,以下再具体详述。
    9FORMAT:variants的格式,例如GT:AD:DP:GQ:PL
    10_SAMPLES _:各个Sample的值,由BAM文件中的@RG下的SM标签所决定
    4.vcf文件的基因型信息
    GT:样品的基因型(genotype)。两个数字中间用’/'分 开,这两个数字表示双倍体的sample的基因型。0 表示样品中有ref的allele; 1 表示样品中variant的allele; 2表示有第二个variant的allele。所以:
    0/0表示sample中该位点为纯合位点,和REF的碱基类型一致
    0/1表示sample中该位点为杂合突变,有REF和ALT两个基因型(部分碱基和REF碱基类型一致,部分碱基和ALT碱基类型一致)
    1/1表示sample中该位点为纯合突变,总体突变类型和ALT碱基类型一致
    1/2表示sample中该位点为杂合突变,有ALT1和ALT2两个基因型(部分和ALT1碱基类型一致,部分和ALT2碱基类型一致)
    ADDP:AD(Allele Depth)为sample中每一种allele的reads覆盖度,在diploid(二倍体,或可指代多倍型)中则是用逗号分隔的两个值,前者对应REF基因,后者对应ALT基因型
    DP(Depth)为sample中该位点的覆盖度,是所支持的两个AD值(逗号前和逗号后)的加和
    例如:
    1/1:0,175:175—GT:AD(REF),AD(ALT):DP
    0/1:79,96:175
    1/2:0,20,56:76
    这里的三种类型对应的DP值均是其对应的AD值的加和,1/1的175是0+175,0/1的175是79+96,1/2的76是0+20+56
    GQ:基因型的质量值(Genotype Quality)。Phred格式(Phred_scaled)的质量值,表示在该位点该基因型存在的可能性;该值越高,则Genotype的可能性越大;计算方法:Phred值=-10log(1-P),P为基因型存在的概率。(一般在final.snp.vcf文件中,该值为99,为99时,其可能性最大)
    PL:指定的三种基因型的质量值(provieds the likelihoods of the given genotypes);这三种指定的基因型为(0/0,0/1,1/1),这三种基因型的概率总和为1。该值越大,表明为该种基因型的可能性越小。
    Phred值=-10log(P)**,P为基因型存在的概率。最有可能的genotype的值为0
    5. VCF第8列的信息
    第8列的信息包括18种,都是以“TAG=Value”,并使用分号分隔的形式,其中很多的注释信息在VCF文件的头部注释中给出,下面对常用的TAG进行解释:
    AC,AF和AN
    AC(Allele Count) 表示该Allele的数目;AF(Allele Frequency) 表示Allele的频率; AN(Allele Number) 表示Allele的总数目。对于1个diploid sample而言:则基因型 0/1 表示sample为杂合子,Allele数为1(双倍体的sample在该位点只有1个等位基因发生了突变),Allele的频率为0.5(双倍体的 sample在该位点只有50%的等位基因发生了突变),总的Allele为2; 基因型 1/1 则表示sample为纯合的,Allele数为2,Allele的频率为1,总的Allele为2
    DP(reads覆盖度)
    表示reads被过滤后的覆盖度
    FS
    FisherStrand的缩写,表示使用Fisher’s精确检验来检测strand bias而得到的Fhred格式的p值,该值越小越好;如果该值较大,表示strand bias(正负链偏移)越严重,即所检测到的variants位点上,reads比对到正负义链上的比例不均衡。一般进行filter的时候,推荐保留FS<10~20的variants位点。GATK可设定FS参数。
    ReadPosRandSum
    Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias.当variants出现在reads尾部的时候,其结果可能不准确。该值用于衡量alternative allele(变异的等位基因)相比于reference allele(参考基因组等位基因),其variant位点是否匹配到reads更靠中部的位置。因此只有基因型是杂合且有一个allele和参考基因组一致的时候,才能计算该值。若该值为正值,表明和alternative allele相当于reference allele,落来reads更靠中部的位置;若该值是负值,则表示alternative allele相比于reference allele落在reads更靠尾部的位置。
    进行filter的之后,推荐保留ReadPosRankSum>-1.65~-3.0的variant位点

    MQRankSum
    该值用于衡量alternative allele上reads的mapping quality与reference allele上reads的mapping quality的差异。若该值是负数值,则表明alternative allele比reference allele的reads mapping quality差。进行filter的时候,推荐保留MQRankSum>-1.65~-3.0的variant位点。

    Part 2 对VCF文件的统计

    1.统计一下vcf文件variant的质量值的分布
    统计的VCF文件是在GATK HaplotypeCaller call出来的VCF 文件
    KPGP-00001.HC.vcf

    把KPGP-00001.HC.vcf中以#开头的头文件部分除掉,保留主文件,并把第6列variant质量值提出来存到KPGP-00001.HC.QUAL.txt中。
    ``
    grep -v '^#' KPGP-00001.HC.vcf |cut -f 6 >KPGP-00001.HC.QUAL.txt

    将KPGP-00001.HC.QUAL.txt按第一列数值排序后取最后10行
    ``
    sort -k1,1n KPGP-00001.HC.QUAL.txt|tail
    

    结果:

    177246.77
    184866.77
    185614.77
    186061.77
    187101.77
    190499.77
    192745.77
    193674.77
    195675.77
    196247.77
    

    所以,质量值的最大为196247.77
    以10-1000区间,步长为10的区间进行统计,剩下的按大于1000算
    python脚本如下

    import sys
    args=sys.argv
    filename=args[1]
    numDict={}
    OT="over_1000"
    numDict[OT]=0
    for line in open (filename):
     lineL=float(line.strip())
     for i in range(10,1000,10):
        if i-10 <= lineL <= i:
          if i not in numDict:
             numDict[i]=1
          else:
             numDict[i]+=1
     if lineL > 1000:
            numDict[OT]+=1
    
    for k,v in numDict.items():
       print(k,v)
    

    运行python脚本并将结果按第一列数值大小排序

    python3 distribution.py KPGP-00001.HC.QUAL.txt >KPGP-00001.HC.QUAL.distribution.txt
    
    sort -k1,1n KPGP-00001.HC.QUAL.distribution.txt >KPGP-00001.HC.QUAL.distribution.sort.txt
    

    结果如下:

    over_1000 848602
    20 41126
    30 35794
    40 34196
    50 33893
    60 32039
    70 32968
    80 29885
    90 31482
    100 31294
    110 32549
    120 31780
    130 33910
    140 33254
    150 34696
    160 37889
    170 37403
    180 37569
    190 41049
    200 43558
    210 42034
    220 44231
    230 46817
    240 48619
    250 50107
    260 51146
    270 52414
    280 54788
    290 56195
    300 55299
    310 57655
    320 59335
    330 58915
    340 59563
    350 60876
    360 60676
    370 60336
    380 61357
    390 61234
    400 59689
    410 59058
    420 60001
    430 59384
    440 56861
    450 55951
    460 56236
    470 54859
    480 51336
    490 50367
    500 50711
    510 48943
    520 47230
    530 45798
    540 43991
    550 42699
    560 41013
    570 39158
    580 37561
    590 36790
    600 36122
    610 34610
    620 32404
    630 31108
    640 32030
    650 30382
    660 27705
    670 27306
    680 28260
    690 27063
    700 25393
    710 24746
    720 25701
    730 24971
    740 23089
    750 22921
    760 23543
    770 22872
    780 22520
    790 22975
    800 22249
    810 22231
    820 22805
    830 22918
    840 21630
    850 21104
    860 22502
    870 23507
    880 21907
    890 20746
    900 22812
    910 23912
    920 21318
    930 21153
    940 22891
    950 22529
    960 21540
    970 22029
    980 22957
    990 21794
    

    可以看出质量值低于20的很少,一般情况下,软件call到的variation的质量值低于20,我们会选择舍弃掉,因为这样的variation可信度不高

    再分别对VQSR之后的KPGP-00001.HC.snps.VQSR.vcf和KPGP-00001.HC.indels.VQSR.vcf进行统计

    首先是SNP:KPGP-00001.HC.snps.VQSR.vcf

    #首先取出VQSR之后PASS的变异
    
    grep "PASS" KPGP-00001.HC.snps.VQSR.vcf > KPGP-00001.HC.snps.VQSR.PASS.vcf
     
    #提取出第6列质量值
    cut -f 6 KPGP-00001.HC.snps.VQSR.PASS.vcf >KPGP-00001.HC.snps.VQSR.PASS.QUAL.txt
    
    python3 distribution.py KPGP-00001.HC.snps.VQSR.PASS.QUAL.txt >KPGP-00001.HC.snps.VQSR.PASS.QUAL.distr.txt
    sort -k1,1n KPGP-00001.HC.snps.VQSR.PASS.QUAL.distr.txt >KPGP-00001.HC.snps.VQSR.PASS.QUAL.distr.sort.txt
    cat KPGP-00001.HC.snps.VQSR.PASS.QUAL.distr.sort.txt
    20 7586
    30 6978
    40 7114
    50 8739
    60 8036
    70 11621
    80 8613
    90 10986
    100 10779
    110 12786
    120 12336
    130 14106
    140 14009
    150 15026
    160 19027
    170 18099
    180 18743
    190 21315
    200 24440
    210 23806
    220 25568
    230 27696
    240 29416
    250 31908
    260 32480
    270 34080
    280 35897
    290 37987
    300 37837
    310 40023
    320 41743
    330 41722
    340 42906
    350 44285
    360 44345
    370 43904
    380 45876
    390 45802
    400 44924
    410 44462
    420 45175
    430 45410
    440 43349
    450 42603
    460 43145
    470 42375
    480 39487
    490 39193
    500 39057
    510 37388
    520 36891
    530 35623
    540 34056
    550 32612
    560 31811
    570 30527
    580 29294
    590 28211
    600 27463
    610 27180
    620 25359
    630 23971
    640 24313
    650 24081
    660 21905
    670 21021
    680 21742
    690 21399
    700 20357
    710 19156
    720 20183
    730 19629
    740 18785
    750 18204
    760 19113
    770 18403
    780 17932
    790 18952
    800 18514
    810 17973
    820 18393
    830 19646
    840 18406
    850 17691
    860 18685
    870 19866
    880 19042
    890 17716
    900 19044
    910 20381
    920 19043
    930 18190
    940 19804
    950 19731
    960 18517
    970 19511
    980 20326
    990 19140
    

    可见,VQSR之后低质量值的变异就更少了。
    INDEL同理,直接给结果

    20 25080
    30 21471
    40 20634
    50 21342
    60 20962
    70 22412
    80 19481
    90 21583
    100 21830
    110 23103
    120 22728
    130 24317
    140 24168
    150 26206
    160 28923
    170 28230
    180 28881
    190 32201
    200 34403
    210 33287
    220 35318
    230 37679
    240 39749
    250 41159
    260 42035
    270 43483
    280 45919
    290 47002
    300 46716
    310 49116
    320 50613
    330 50536
    340 51441
    350 52712
    360 52555
    370 52505
    380 53665
    390 53737
    400 52396
    410 51932
    420 53208
    430 52683
    440 50411
    450 49896
    460 50297
    470 49165
    480 45873
    490 45110
    500 45542
    510 44209
    520 42649
    530 41291
    540 39920
    550 38712
    560 37208
    570 35687
    580 34286
    590 33613
    600 33056
    610 31768
    620 29761
    630 28634
    640 29663
    650 28096
    660 25537
    670 25378
    680 26364
    690 25347
    700 23682
    710 23067
    720 24142
    730 23504
    740 21770
    750 21745
    760 22306
    770 21678
    780 21417
    790 21886
    800 21158
    810 21262
    820 21900
    830 22006
    840 20846
    850 20290
    860 21667
    870 22772
    880 21170
    890 20036
    900 22105
    910 23200
    920 20650
    930 20509
    940 22271
    950 21931
    960 20946
    970 21412
    980 22444
    990 21245
    

    2.统计一下vcf文件杂合变异位点跟纯合变异位点的分布
    首先是SNP

    #取出第10行
    cut -f 10 KPGP-00001.HC.snps.VQSR.PASS.vcf >KPGP-00001.HC.snps.VQSR.PASS.samples.txt
    
    

    写一个python脚本

    import sys
    args=sys.argv
    filename=args[1]
    varDict={}
    for line in open(filename):
      lineL=line.strip().split(":")
      variant=lineL[0]
      if variant not in varDict:
          varDict[variant]=1
      else:
          varDict[variant]+=1
    for k,v in varDict.items():
       print(k,v,sep=":")
    

    运行

    python3 sample_count.py KPGP-00001.HC.snps.VQSR.PASS.samples.txt
    1/1:1559238
    1/2:1173
    0/1:1709664
    

    接下来是INDEL

    cut -f 10 KPGP-00001.HC.indels.VQSR.PASS.vcf >KPGP-00001.HC.indels.VQSR.PASS.samples.txt
    
    python3 sample_count.py KPGP-00001.HC.indels.VQSR.PASS.samples.txt
    
    1/2:26765
    1/1:1847390
    0/1:2129613
    
    

    可以看出,不论是SNP还是INDEL,杂合和纯合突变的比例大致为1:1,根据Jimmy老师的说法,本次call variation的步骤还算合理。

    相关文章

      网友评论

        本文标题:VCF格式的学习及对VCF文件的统计

        本文链接:https://www.haomeiwen.com/subject/zfnyvftx.html