本文转载于https://www.jianshu.com/p/e6d5dd774c6e

SNP位点过滤

SNP过滤有两种情况,一种是仅根据位点质量信息(测序深度,回帖质量等)对SNP进行粗过滤。如果使用GATK对重测序结果进行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

另一种过滤会考虑除了测序质量以外的信息,例如文章在方法部分所写的内容

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数大于3: 在本文语境中相当于MAF=0.01
  • 四倍兼并位点: 在2013年的黄瓜NG中,选择4D位点原因是它们的选择压小,更能反应群体结构(population structure and demography)
 

前三个条件的实现相对简单,虽然VCFtools和BCFtools都可以实现这种过滤,但是BCFtools的执行速度更快(大概是前者的2倍),所以我推荐使用BCFtools。

1 # BCFtools
2 bcftools view -i 'F_MISSING < 15 & MAC > 3' -m2 -M2 watermelon_414acc_SNP2.vcf.gz -Oz -o watermelon_414acc_SNP2_flt1.vcf.gz &
3 # VCFtools
4 # 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 &
5 bcftools index watermelon_414acc_SNP2_flt1.vcf.gz
我同时运行了两个程序,最终原始的19,725,853 SNP经BCFtools过滤后为11,925,733,而VCFtools过滤后是12,555,059,BCFtools用时6202秒, VCFtools用时10883秒。我使用vcftools的比较功能,发现问题问题出在MAC的这个标准上,vcftools中--mac 3会包括MAF=3的情况,而我写的bcftools过滤表达式为MAC > 3没有包括3。根据文章的描述,vcftools过滤参数应该写成--mac 4

四倍兼并位点(4d)过滤稍微麻烦一些,似乎也不是所有文章都会使用该方法。我个人为使用该方法的主要目的是进一步减少SNP的数目,降低后续构建系统发育树和群体结构分析的计算量。

 
过滤4d位点有两种方法,一种是基于注释的VCF文件自己写脚本处理,一种是先生成所有的4D候选位置,然后遍历VCF文件并判断当前位点是否为4D。此处,我们采用第二种方法,第一种作为练习题。
 
我们使用Reseqtools根据Fasta和GFF提取所有的4D位点
1 # 提取位点
2 iTools Fatools getCdsPep -Ref watermelon/97103_genome_v2.fa -Gff watermelon/97103_gene_gff_v2 -4DSite -OutPut watermelon
3 zcat watermelon.4Dsite.gz | cut -f 1,2 > watermelon.4Dsite.txt

然后我们可以使用BCFtools的-R参数进行过滤,但是速度会很慢,因为每个位点都要和将近400w个位点进行比较。、

1 bcftools view -R watermelon.4Dsite.txt watermelon_414acc_SNP2.flt1.vcf.gz -Oz -o watermelon_414acc_SNP2.flt2.vcf.gz

除了4D位点过滤外,更常见的一种过滤方法是基于LD(连锁不平衡)对SNP进行过滤,我们这里使用Plink进行数据过滤。

Plink的过滤是基于VCF的ID列,而我们这里的数据的ID列标记为缺失,因此我们需要先用bcftools annotate对位点进行简单注释。

1 # 需要注释位点,增加ID列
2 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筛选位点

1 plink --vcf watermelon_414acc_SNP2_flt2_anno.vcf.gz --const-fid --allow-extra-chr --indep-pairwise 50 10 0.2 --out watermelon_414ac
2 c_SNP2_flt3

最后用plink extract根据"prune.in"从原来的vcf文件中提取信息

1 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

SNP 过滤(二)的更多相关文章

  1. SNP 过滤(一)

    通用过滤 Vcftools(http://vcftools.sourceforge.net) 对vcf文件进行过滤 第一步:过滤最低质量低于30,次等位基因深度(minor allele count) ...

  2. PHP 过滤二维数组和三维数组

    <?php $arr = [ [1,3,5,7,9], [2,4,6,8,0] ]; $arr2 = [ 'list' => [ [1,3,5,7], [2,4,6,8], [3,2,9, ...

  3. Saiku关于MDX过滤的使用(九)

    Saiku查询设定:Saiku查询数据时,每次都是全量查询的,我们现在需要默认展示近一周的数据. 通过编写使用MDX表达式进行过滤 通过编写MDX表达式,添加新的指标信息对一周以内的数据进行标识 (其 ...

  4. 【GWAS文献解读】疟原虫青蒿素抗药性的全基因组关联分析

    英文名:Genetic architecture of artemisinin-resistant Plasmodium falciparum 中文名:疟原虫青蒿素抗药性的全基因组关联分析 期刊:Na ...

  5. GWAS基因芯片数据预处理:质量控制(quality control)

    一.数据为什么要做质量控制 比起表观学研究,GWAS研究很少有引起偏差的来源,一般来说,一个人的基因型终其一生几乎不会改变的,因此很少存在同时影响表型又影响基因型的变异.但即便这样,我们在做GWAS时 ...

  6. php表单数据验证类

    非常好用方便的表单数据验证类 <?php //验证类 class Fun{ function isEmpty($val) { if (!is_string($val)) return false ...

  7. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ

    · 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E&g ...

  8. MVC5+EF6 --自定义控制Action访问权限

    本章主要讲解在MVC中灵活控制Action的访问权限: 本章所使用的示例表也是上一张所使用的TbUser.TbRole.TbUserRole: 最终的效果是针对任意一个Action或Controlle ...

  9. $Django 路飞之课程下的分类,用户登陆成功前端存cookie,

    一 课程分类显示 宗旨:总的再次过滤 二 Cookie # export default new Vuex.Store({ state: { name:'', token:'', }, mutatio ...

随机推荐

  1. 如何使用远程工具连接Linux服务器

    大家好,今天我想和大家分享一下Linux如何连接远程控制工具我们都知道,Linux是著名的开源服务器操作系统,而在运维工程师的实际工作当中,我们不大可能时时刻刻都在服务器本地操作.因此这时,我们要用远 ...

  2. (数据科学学习手札129)geopandas 0.10版本重要新特性一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...

  3. Seata整合SpringBoot和Mybatis

    Seata整合SpringBoot和Mybatis 一.背景 二.实现功能 三.每个服务使用到的技术 1.账户服务 2.订单服务 四.服务实现 1.账户服务实现 1.引入jar包 2.项目配置 3.建 ...

  4. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  5. linked-list-cycle leetcode C++

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  6. 【接口】SpringBoot+接口开发(一)

    一.接口的简单介绍 1.什么是接口:接口及服务: 2.接口的分类:(1)系统的内部接口;(2)第三方的外部接口; 3.简述接口原理图: 4.接口协议:是指客户端跟服务器之间或者接口与接口间进行的通讯时 ...

  7. 【Python+postman接口自动化测试】(7)Postman 的使用教程

    Postman v6的使用 Postman: 简单方便的接口调试工具,便于分享和协作.具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, 接口文档,接口监控 ...

  8. vue监听器watch & 计算属性computed

    侦听器watch vue中watch是用来监听vue实例中的数据变化 watch监听时有几个属性: handle:其值是一个回调函数,就是监听对象对话的时候需要执行的函数 deep:其值true 或者 ...

  9. 一文带你理解TDengine中的缓存技术

    作者 | 王明明,涛思数据软件工程师 小 T 导读:在计算机系统中,缓存是一种常用的技术,既有硬件缓存,比如我们经常听到的 CPU L2 高速缓存,也有软件缓存,比如很多系统里把 Redis 当做数据 ...

  10. mybatis替换成mybatisplus后报错mybatisplus Invalid bound statement (not found):

    项目原来是mybatis,之后由于生成代码不方便,觉得替换成mybatisplus,引入mybatisplus后,启动项目报错mybatisplus Invalid bound statement ( ...