【转】vcf文件合并操作

欢迎关注公众号:oddxix
最近在做PCA,需要将多个样本vcf合并起来,并且加入千人里中国人的数据,收集到下面的资料。

bcftools extract specified samples in vcf format

1、下载安装bcftools。
2、准备样本ID文件,这里命名为samplelistname.txt,一个样本一行,如下所示:
sample1
sample2
sample3
3、输入命令:

bcftools view -S samplelistname.txt /1000genomes/ALL.chr16.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz -Ov > samplelist_1000Genomes.vcf

参考链接:
https://www.biostars.org/p/184950/
https://samtools.github.io/bcftools/bcftools.html#view
原文:http://www.cnblogs.com/chenwenyan/p/9212170.html

单个vcf文件中存储的每个sample的信息不全(loss)导致合并时很多值无法更新,尤其是碰到多variants位点时这个问题最明显。通过尝试将每个sample BAM文件中的有用信息尽可能无损(lossless)的转换到一个文件中,再通过这个文件提取得到最后的vcf文件。

a).vcf-merge**

http://vcftools.sourceforge.net/perl_module.html#vcf-merge

这个工具是vcftools里面的一个Perl脚本,具体用法如下:

vcf-mergeA.vcf.gz B.vcf.gz C.vcf.gz > out.vcf

首先最大的缺点是慢(所以后来重新开发了C版本,见后);然后另外一个比较麻烦的就在于对多variants位点的处理,碰到这些位点的时候不会更新各个sample,例如我们可以尝试合并下面两个vcf文件:

**vcf1:**
##fileformat=VCFv4.1
#CHROM      POS         ID    REF ALT QUAL     FILTER   INFO       FORMAT        Sample01
1       6324        .        T C       30    PASS       .        GT:AD    1/1:1,22
1       16324      .      T A     40    PASS       .        GT:AD    0/1:10,11
4       134861    .      G C       50    PASS       .        GT:AD    0/1:7,13

**vcf2:**
##fileformat=VCFv4.1
#CHROM      POS         ID    REF ALT QUAL     FILTER   INFO       FORMAT        Sample02
1       6324        .        T      A      45    PASS       .        GT:AD    1/1:0,23
1       16324      .        T      C,G 35    PASS       .        GT:AD    1/2:0,12,12
4       134861    .        G      GC   15    LowQual        .        GT:AD    1/1:1,19

我们可以尝试用vcf-merge来合并这两个文件,具体代码如下:

## step1: compress vcf files and create an index (this process is required for most perl APIs in vcftools)
bgzip ./test/test1.vcf
tabix -p vcf ./test/test1.vcf.gz
bgzip ./test/test2.vcf 
tabix -p vcf ./test/test2.vcf.gz

## step2: merge with vcf-merge
perl ./scripts/vcf-merge ./test/test1.vcf.gz ./test/test2.vcf.gz > ./test/test_merge.vcf

第一步是压缩以及生成index,vcftools的很多perl API都要求input的vcf文件是通过bgzip压缩,并且用tabix生成对应的index文件,这样可以实现对****vcf****文件的随机读写

得到的结果如下:

##fileformat=VCFv4.1
##source_20140401.1=vcf-merge(r840) ./test/test1.vcf.gz ./test/test2.vcf.gz
##sourceFiles_20140401.1=0:./test/test1.vcf.gz,1:./test/test2.vcf.gz
#CHROM      POS         ID    REF ALT QUAL     FILTER   INFO       FORMAT        Sample01      Sample02
1       6324        .        T      A,C 37.50       PASS       AC=2,2;AN=4;SF=0,1 GT:AD    2/2:**1,22** 1/1:**0,23**
1       16324      .        T      C,G,A      37.50       PASS       AC=1,1,1;AN=4;SF=0,1        GT:AD    0/3:**10,11**        1/2:0,**12,12**
4       134861    .        G      GC,C        32.50      **LowQual**       AC=2,1;AN=4;SF=0,1f         GT:AD    0/2:**7,13** 1/1:**1,19**

从更新的结果来看,Quality值应该是取得两者的平均值,然后INFO部分增加了AC,AN以及SF的信息,FILTER的标签是以被FILTER掉的为准,然后在SF这边有显示(1f就表示在第二个sample中是LowQual的),假设我们当时定义的LowQual的标准是30的话,这边根据情况可能就要更新成PASS;然后可以看到,这边AD值(这个值反应的是每种形态的allele的depth)的信息是没有更新的,因为每个caller生成的vcf文件中包含的INFO或者FORMAT部分的标签各种各样(这边的AD值就是HaplotypeCaller或者UnifiedGenotyper默认输出的),除非是配套的下游操作软件,否则一般是很难考虑到所有情况的,而且这边即使尝试更新,得到的结果也不一定完全准确,例如即使是0/1的情况下,也是有存在第三种形态的可能的,只是当时不足以对genotyping产生影响所以被舍弃了而已。

b).GATK CombineVariants**

http://www.broadinstitute.org/gatk/gatkdocs/org_broadinstitute_sting_gatk_walkers_variantutils_CombineVariants.html

这个是GATK里面用来合并vcf文件的工具,用法如下:

## test of CombineVariants in GATK**
java -jar ./biosoft/GenomeAnalysisTK-3.1-1/GenomeAnalysisTK.jar
 -R ./ref/TAIR9_chr1.random.fasta**
 -T CombineVariants
 --variant ./test/test1.vcf.gz
 --variant ./test/test2.vcf.gz
 -o ./test/test_combine.vcf
-genotypeMergeOptions UNIQUIFY

这边顺便提一下GATK****的大部分工具也是直接支持通过bgzip****压缩的并且通过tabix index****过的vcf****文件的

然后结果如下:

#CHROM      POS         ID    REF ALT QUAL     FILTER   INFO       FORMAT        Sample01.variant         Sample02.variant2
1       6324        .        T      C,A 30    PASS       AC=2,2;AF=0.500,0.500;AN=4;set=Intersection GT   1/1   2/2
1       16324      .        T      A,C,G      40    PASS       AC=1,1,1;AF=0.250,0.250,0.250;AN=4;set=Intersection   GT   0/1         2/3
4       134861    .        G      C      50    PASS       AC=1;AF=0.500;AN=2;set=variant GT:AD    0/1:7,13   ./.
4       134861    .        G      GC   15    LowQual        AC=2;AF=1.00;AN=2;set=FilteredInAll GT:AD    ./.     1/1:1,19

可以看到可能是也注意到AD这个值的问题了,所以前两个位点直接把AD值给删掉了(删掉了……),后面两个因为是Indel和SNP位点重合,而Indel的实际位置本身就应该是134861+1,所以这边分成两个可能应该更准确一点,但这样vcf文件当中就出现了duplicate的位置。

c). bcftools merge

http://samtools.github.io/bcftools/bcftools.html#merge

这个工具是后来重新开发的,既包含了原来samtools里面附带的bcftools的所有功能,也包含htslib (https://github.com/samtools/htslib) 里面的所有工具,用来替代vcftools里面提供的Perl API,这边的bcftools merge就是用来替代之前提到的vcf-merge的,具体用法如下:

## test of bcftools merge
./biosoft/bcftools merge./test/test1.vcf.gz ./test/test2.vcf.gz  > ./test/test_merge2.vcf

生成的结果如下:

##fileformat=**VCFv4.2**
##bcftools_mergeVersion=0.0.1+htslib-0.0.1
##bcftools_mergeCommand=merge ./test/test1.vcf.gz ./test/test2.vcf.gz
#CHROM      POS         ID    REF ALT QUAL     FILTER   INFO       FORMAT        Sample01      Sample02
1       6324        .        T      C,A 45    PASS       .        GT:AD    1/1:1,22   2/2:0,23
1       16324      .        T      A,C,G      40    PASS       .        GT:AD    0/1:10,11         2/3:0,12,12
4       134861    .        G      C      50    PASS       .        GT:AD    0/1:7,13   ./.:.
4       134861    .        G      GC   15    LowQual        .        GT:AD    ./.:.   1/1:1,19

可以看到最新的bcftools输出的vcf已经更新到4.2版本了,然后默认情况下对于SNP和Indel重合的位点的处理和CombineVariants是一样的(另外可以通过--merge参数来修改),然后这边的Quality值变成了两个的最大值,而AD值也同样是没更新的,如果存在INFO部分的话,很多值的合并方式也可以通过--info-rules来修改。

最后补充两点:

1) 这边讲的合并指的是多个****single-sample****的vcf****文件合并成单个****multi-samples****的vcf****文件,当然其中有一些工具也支持合并同样sample(s)但是包含不同位置结果的vcf文件(例如开始Call variants的时候是以每条染色体为单位的,后面可以通过CombineVariants将所有结果合并到一起);

2) 这边举得很多例子实际数据中可能占得比例并不大,而且很多时候会直接去掉这些位点(例如计算LD的时候只用bi-allelic的位点),或者有些信息根本用不上(大部分下游软件用到比较多的是GT值),这边讲的比较细节,大部分情况下对实际数据的影响都是可以忽略的,但是如果涉及到相关方面的一些分析,或者是处理低覆盖的数据的时候,这种细节方面引起的误差甚至是错误可能就不容忽视了。

原文链接:http://blog.sciencenet.cn/blog-1469385-829144.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343