SNP过滤

SNP过滤

文章目录

  • SNP过滤
    • 前言
    • 一. 利用Perl脚本get_vcf_stats.pl统计位点信息
    • 二. 利用R脚本149toTZC.2allele.filtered.R画图并获得过滤后的位点位置信息
    • 三. 用vcftools保留过滤后的位点
    • 四、get_vcf_stats.pl 脚本存放处
  • 总结


SNP过滤

所属目录:紫菜创建时间:2024/7/25作者:星云<XingYun>更新时间:2024/7/25URL:https://blog.csdn.net/2301_78630677/article/details/140733551

前言

之前(也就是博客重测序数据处理得到vcf文件)得到了原始的vcf文件,本文就使用该文件进行SNP过滤,以便后续的分析

也就是本文是对博客【重测序数据处理得到vcf文件】的补充

首先对原来的vcf文件进行过滤,得到一个高质量的vcf文件,用于后续的群体遗传结构分析

原始文件:
在这里插入图片描述

推荐阅读:图文详解 VCF 生信格式 (变异信息)

在这里插入图片描述


一. 利用Perl脚本get_vcf_stats.pl统计位点信息

工作路径:之前创建的5.haitanensis文件夹

首先将之前得到的"149toTZC.2allele.vcf.recode.vcf"文件压缩为gz格式

gzip 149toTZC.2allele.vcf.recode.vcf

使用脚本get_vcf_stats.pl

perl get_vcf_stats.pl 149toTZC.2allele.vcf.recode.vcf.gz >149toTZC.2allele.vcf.recode.vcf.stat.txt

查看

less -SN 149toTZC.2allele.vcf.recode.vcf.stat.txt

在这里插入图片描述

二. 利用R脚本149toTZC.2allele.filtered.R画图并获得过滤后的位点位置信息

这段R代码执行了一系列数据读取、处理和可视化操作,主要目标是对一个VCF统计文件进行质量控制过滤,并保存过滤后SNP的位置信息。

library(readr)
library(ggplot2)
library(dplyr)
data<-read.table("149toTZC.2allele.vcf.recode.vcf.stat.txt", header = T)
head(data)
par(mfrow=c(3,4))
plot(density(data$qual))
#plot(density(data$BQR))
plot(density(na.omit(data$QD)))
plot(density(na.omit(data$MQ)))
plot(density(na.omit(data$FS)))
plot(density(na.omit(data$SOR)))
plot(density(na.omit(data$MQR)))
plot(density(na.omit(data$RPR)))
plot(density(na.omit(data$Inb)))
plot(density(na.omit(data$EH)))
plot(density(na.omit(data$miss_rate)))
plot(density(na.omit(data$mean_depth)))
plot(density(na.omit(data$mean_GQ)))
snp=data
head(snp)
keep.snp<-snp$QD>=5 & !is.na(snp$QD) & snp$MQ>=50 & !is.na(snp$MQ) & snp$FS<10 & !is.na(snp$FS) &snp$SOR < 2 & !is.na(snp$SOR) & snp$MQR > -2.5 & snp$MQR<2.5 & !is.na(snp$MQR) &snp$RPR > -3 & snp$RPR<3 & !is.na(snp$RPR) & snp$Inb>-0.5 & !is.na(snp$Inb) & snp$EH<3 & !is.na(snp$EH) &snp$miss_rate <=0.2 & snp$mean_depth>=5 & snp$mean_depth<80 & snp$mean_GQ>=20
snp.filtered <- snp[keep.snp,]
pos.snp<-snp[keep.snp, c('chr','pos')]
head(pos.snp)
write_tsv(pos.snp,"149toTZC.2allele.filtered.pos.txt")

代码解释:

# 1. 加载包
library(readr) 
library(ggplot2)
library(dplyr)#2. 使用read.table函数读取名为254toCja.2SNP.vcf.stat.txt的文件,假设文件有表头,将其存储在data对象中。
data<-read.table("149toTZC.2allele.vcf.recode.vcf.stat.txt", header = T)#显示data数据框的前几行,检查数据是否正确加载。
head(data)
#3. 设置图形布局为3行4列,准备绘制多个子图。
par(mfrow=c(3,4))#4. 接下来的多行plot(density(...))语句
#绘制data中各个变量的密度图,包括qual、QD、MQ、FS、SOR、MQR、RPR、Inb、EH、miss_rate、mean_depth和mean_GQ。注意,na.omit()用于去除NA值后再计算密度。#5. 将data复制给snp,用于后续操作。
snp=data#6. 定义一个逻辑向量keep.snp,用于标识满足一系列质量控制条件的SNP。条件包括但不限于:QD大于等于5、MQ大于等于50、FS小于10、SOR小于2等。
keep.snp<-snp$QD>=5 & !is.na(snp$QD) & ...#7. 使用keep.snp逻辑向量过滤snp数据框,只保留符合条件的行,生成snp.filtered数据框。
snp.filtered <- snp[keep.snp,]#8. 从过滤后的snp数据框中提取chr(染色体)和pos(位置)两列,生成pos.snp数据框,仅包含过滤后的SNP位置信息。
pos.snp<-snp[keep.snp, c('chr','pos')]#显示pos.snp数据框的前几行,确认过滤和提取操作是否成功。
head(pos.snp)#9. 将pos.snp数据框以制表符分隔的文本格式保存到文件254toTZC.2SNP.filtered.pos.txt中,记录过滤后SNP的染色体和位置信息。
write_tsv(pos.snp,"149toTZC.2allele.filtered.pos.txt")

三. 用vcftools保留过滤后的位点

vcftools --gzvcf 149toTZC.2allele.vcf.recode.vcf.gz --positions 149toTZC.2allele.filtered.pos.txt --recode --recode-INFO-all --out 149toTZC.2allele.filtered

过滤missing rate 超过0.1和maf小于0.01的位点

vcftools --vcf 149toTZC.2allele.filtered.recode.vcf --max-missing 0.9 --maf 0.01 --recode --recode-INFO-all --out 149toTZC.2allele.filtered.missing0.1.maf0.01

四、get_vcf_stats.pl 脚本存放处

get_vcf_stats.pl 脚本

#usage: perl get_vcf_stats.pl Trapa_variant.raw.vcf > Trapa_rawvcf_par.txt#!/usr/bin/perl -w
use strict;my $infile=shift;
# open(IN, "$infile") or die "Cannot open $infile: $!";
open(IN, "gzip -c -d $infile |") or die "Cannot open $infile: $!";
print STDOUT "chr\tpos\ttype\tqual\tfilter\tBQR\tFS\tMQ\tMQR\tQD\tRPR\tSOR\tEH\tInb\tmiss_rate\tmean_depth\tmean_GQ\n";	while(<IN>){chomp;next if(/^#/);my @cols=split/\s+/;my ($chr, $pos, $ref, $alt, $qual, $filter, $info, $format)=@cols[0,1,3,4,5,6,7,8];$qual=0 if($qual eq '.');splice(@cols,0,9);my $type='SNP';if($alt eq '.'){$type='nonref';}elsif(length($ref)>1){ ### only deletion here $type='INDEL';}else{my @alt=split/,/,$alt;$type='MSNP' if($#alt>0);foreach (@alt){if(/\*/ or length($_)>1){ # deletion and insert$type='INDEL';}}}my ($BQR, $EH, $FS, $Inb, $MQ, $MQR, $QD, $RPR, $SOR)=get_info($info,  qw(BaseQRankSum ExcessHet FS InbreedingCoeff MQ MQRankSum QD ReadPosRankSum SOR));
# 	@cols=@cols[(0..7,10..17)];my ($miss_rate, $mean_depth, $mean_GQ)=summary_gt($format, \@cols);print STDOUT "$chr\t$pos\t$type\t$qual\t$filter\t$BQR\t$FS\t$MQ\t$MQR\t$QD\t$RPR\t$SOR\t$EH\t$Inb\t$miss_rate\t$mean_depth\t$mean_GQ\n";	
}
close(IN);sub get_info{my ($info, @fields)=@_;my @results=();foreach my $field (@fields){my ($value)=$info=~/$field=([+|\-|\.|e|0-9]+)/;if(defined $value){push @results, $value;}else{push @results, 'NA';}}return(@results);
}sub summary_gt{my ($format, $arr_ref)=@_;my ($miss, $dp_sum, $GQ_sum)=0;my @format=split/:/,$format;my @index=(undef, undef, undef);foreach (0..$#format){if($format[$_] eq 'GT'){$index[0]=$_;}elsif($format[$_] eq 'DP'){$index[1]=$_;}elsif($format[$_] eq 'GQ' or $format[$_] eq 'RGQ' ){$index[2]=$_;}}foreach my $ind (@$arr_ref){my @info=split/:/, $ind;my ($gt, $dp)=@info[@index[0,1]];my $GQ=0;$GQ=$info[$index[2]] if(defined $index[2]);if($gt=~/\./){$miss++;$dp=0;$GQ=0;	}else{$dp=0 unless(defined $dp and $dp ne '.');$GQ=0 unless(defined $GQ and $GQ ne '.');}die "$format $ind, $gt, $dp, $GQ, $index[0], $index[1], $index[2] ," if($dp =~ /\./ or $GQ =~ /\./);$dp_sum+=$dp;$GQ_sum+=$GQ;}my $num_inds=scalar @$arr_ref;my ($dp_mean, $GQ_mean)=(0,0);unless($num_inds == $miss){$dp_mean=sprintf("%.2f", $dp_sum/($num_inds-$miss));$GQ_mean=sprintf("%.2f", $GQ_sum/($num_inds-$miss));}$miss=sprintf("%.2f", $miss/$num_inds);return(($miss,$dp_mean, $GQ_mean));
}

总结

本文主要记录了对之前得到的原始的vcf文件进行SNP过滤后,保留过滤后的位点数据。
先用perl脚本统计位点信息,再用R脚本获得过滤后的位点位置信息,最后用vcftools保留过滤后的位点。

–2024/7/25

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APT UPDATE提示i386找不到错误的处理方法。

最近在ubuntu 22.04使用apt-mirror制作本地镜像源后&#xff0c;使用apt update提示,i386文件找不到。在很多网上提示&#xff0c;使用dpkg --remove-architecture i386&#xff0c;关闭i386来跳过这个错误&#xff0c;但是实际上&#xff0c;会遇到无法关闭的情况&#xff0c;…

如何查找下载安装安卓APK历史版本?

在安卓设备上&#xff0c;有时候我们可能希望安装某个软件的旧版本&#xff0c;可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过&#xff0c;通过一些第三方市场和网站&#xff0c;我们仍然可以找到并安装…

docker环境下的verdaccio设置权限并配置域名.md

权限配置 一个管理员叫admin,可以读也可以发布一个普通用户叫qiuye,只可以读,不可以发布添加账号就自行创建添加即可,只需要更改config文件的配置项即可 packages:*/*: access: admin qiuyepublish: admin unpublish: admin **:access: admin qiuyepublish: admin unpublish…

Linux——CPU占不上去的解决办法

一、将调节器升至performance&#xff1a; 1.1 查看当前的调节器&#xff1a; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor如果不是 performance &#xff0c;则进入root账户 1.2 进入root账户 先进入管理员账户输入命令&#xff1a; su root如果没有roo…

Web安全:Web体系架构存在的安全问题和解决方室

Web体系架构在提供丰富功能和高效服务的同时&#xff0c;也面临着诸多安全问题。这些问题可能涉及数据泄露、服务中断、系统被控制等多个方面&#xff0c;对企业和个人造成不可估量的损失。以下是对Web体系架构中存在的安全问题及解决方案的详细分析&#xff1a; Web体系架构存…

【小程序爬虫入门实战】使用Python爬取易题库

文章目录 1. 写在前面2. 抓包分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研…

学习java第一百四十三天

Spring中支持几种作用域 Spring容器中的bean可以分为5个范围&#xff1a; prototype&#xff1a;为每一个bean请求提供一个实例。 singleton&#xff1a;默认&#xff0c;每个容器中只有一个bean的实例&#xff0c;单例的模式由BeanFactory自身来维护。 request&#xff1a;为每…

iPhone 在 App Store 中推出的 PC 模拟器 UTM SE

PC 模拟器是什么&#xff1f;PC 模拟器是一种软件工具&#xff0c;它模拟不同硬件或操作系统环境&#xff0c;使得用户可以在一台 PC 上运行其他平台的应用程序或操作系统。通过 PC 模拟器&#xff0c;用户可以在 Windows 电脑上体验 Android 应用、在 Mac 电脑上运行 Windows …

科普文:详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

在高性能计算场景中&#xff0c;往往采用全闪存架构和内核态并行文件系统&#xff0c;以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加&#xff0c;全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS&#xff0c;是一款全用户态的云原生分布式文件…

SQL优化相关

文章目录 SQL优化1. 数据插入2. 主键优化页分裂页合并索引设计原则 3. order by 优化4. group by 优化5. limit优化6. count优化7. update 优化 SQL优化 1. 数据插入 当我们需要插入多条数据时候&#xff0c;建议使用批量插入&#xff0c;因为每次插入数据都会执行一条SQL&am…

【Linux】多线程4——线程同步/条件变量

1.Linux线程同步 1.1.同步概念与线程饥饿问题 先来理解同步的概念 什么是线程同步 在一般情况下&#xff0c;创建一个线程是不能提高程序的执行效率的&#xff0c;所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数&#xff0c;在多个线程同时对同一个内存地…

《雅思口语真经总纲1.0》话题实战训练笔记part1——4. Fruits and vegetables

《雅思口语真经总纲1.0》笔记——第四章&#xff1a;口语素材大全&#xff08;part1、part2、part3回答准则及练习方法&#xff0c;不包括范例答案&#xff09;★★★★★ 文章目录 Fruits and vegetablesWhat kind of fruit do you like?20240723答评价 范例答案 Did you lik…

centos stream 9安装 Kubernetes v1.30 集群

1、版本说明&#xff1a; 系统版本&#xff1a;centos stream 9 Kubernetes版本&#xff1a;最新版(v1.30) docker版本&#xff1a;27.1.1 节点主机名ip主节点k8s-master172.31.0.10节点1k8s-node1172.31.0.11节点2k8s-node2172.31.0.12 2、首先&#xff0c;使用Vagrant和Virt…

前端缓存问题(浏览器缓存和http缓存)- 解决办法

问题描述&#xff1a;前端代码更新&#xff0c;但因浏览器缓存问题&#xff0c;导致页面源代码并未更新 查看页面源代码的方法&#xff1a;鼠标右键&#xff0c;点击查看页面源代码 如图&#xff1a; 解决方法&#xff1a; 注&#xff1a;每执行一步&#xff0c;就检查一下浏览…

Apache Doris 2.1.5 版本正式发布

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.5 版本已于 2024 年 7 月 24 日正式发布。2.1.5 版本在湖仓一体、多表物化视图、半结构化数据分析等方面进行了全面更新及改进&#xff0c;同时在倒排索引、查询优化器、查询引擎、存储管理等 10 余方向上完成了若干问题修复&a…

elementplus菜单组件的那些事

在使用 elementplus 的菜单组件时&#xff0c;我发现有很多东西是官方没有提到但是需要注意的点 1. 菜单组件右侧会有一个边框 设置css .el-menu {border: 0 !important; } 2. 使用其他的 icon 文字内容一定要写在 这个 名字为 title 的插槽中 <el-menu-itemv-for"it…

@NotNull、@NotEmpty 和 @NotBlank 区别

NotNull、NotEmpty 和 NotBlank 是 Java Bean Validation (JSR 380) 规范中定义的注解&#xff0c;通常用于验证对象的属性是否满足特定的条件。这些注解常用于后端验证&#xff0c;确保接收到的数据符合预期。 NotNull 用途&#xff1a;验证一个对象是否不为null。 注意&#…

Ruby Socket 编程

Ruby Socket 编程 Socket编程是网络编程的一个基础部分,它允许程序通过网络进行通信。Ruby作为一种流行的编程语言,提供了丰富的库和接口来支持Socket编程。本文将详细介绍Ruby中Socket编程的基础知识,包括Socket的概念、如何在Ruby中创建和使用Socket,以及一些常见的Sock…

string indices must be integers

string indices must be integers 目录 string indices must be integers 【常见模块错误】 【解决方案】 常见原因及解决方法 具体案例分析 总结 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出…

Java1.1标准之重要特性及用法实例(十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…