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,一经查实,立即删除!

相关文章

如何查找下载安装安卓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…

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

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

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;在多个线程同时对同一个内存地…

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;就检查一下浏览…

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工程师进阶系列…

kafka高性能的底层原理分析

目录 1.磁盘顺序写 2.零拷贝 3.数据压缩 4.消息批量处理 5.pageCache 6.稀疏索引 总结 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。那么他是如何做到高性能的呢&#xff0c;本篇文章从宏观上分析一下&#xff…

C++——初识模板

前言 模板是C中的重大板块&#xff0c;是使C真正超越C语言的工具&#xff0c;在C模板没有设计出来之前其实C是没有那么被行业和社会所认可的&#xff0c;本节我们将初步了解C中的模板&#xff08;仅作大致讲解&#xff0c;具体的细枝末节将会再过几节讲解&#xff09;&#xf…

Linuxnat网络配置

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

一维数组--最长平台

这道题目挺简单的&#xff0c;那你还想这么久&#xff01; 直接看代码&#xff01; #include<cstdio> long long n,a[100002],sum,b[100002],max-99999,j; int main(){scanf("%d",&n);scanf("%d",&a[1]);sum1;for(int i2;i<n;i){j;scan…

【ESP32 IDF 定时器Timer】

目录 TIM定时器介绍硬件定时器和软件定时器硬件定时器基本参数硬件定时器的操作流程初始化硬件定时器设置报警注册回调函数使能和禁用定时器启动和停止定时器硬件定时器驱动代码调试 软件定时器使用软件定时器代码编写 TIM定时器 介绍 定时器是单片机内部集成&#xff0c;可以…

鸿蒙HarmonyOS开发:多种内置弹窗及自定义弹窗的详细使用指南

文章目录 一、消息提示框&#xff08;showToast&#xff09;1、导入模块2、语法3、参数4、示例5、效果 二、对话框&#xff08;showDialog&#xff09;1、导入模块2、语法3、参数4、示例5、效果 三、警告弹窗&#xff08;AlertDialog&#xff09;1、语法2、参数3、AlertDialogP…

STM32的GPIO输入输出方式设置示例

1、GPIO口做基本的输入/输出口使用时&#xff0c;输入有上拉输入、下拉输入、浮空输入&#xff08;既无上拉电阻也无下拉电阻&#xff09;3种输入方式&#xff1b;输出有开漏输出、推挽输出2种输出方式。 2、示例 &#xff08;1&#xff09;示例1&#xff1a;GPIO做输出的设置…

项目比赛经验分享:如何让即兴发言出彩

项目比赛经验分享&#xff1a;如何让即兴发言出彩 前言1. 顺势趁便法2. 词语撮要法3. 起承转合法4. 数字串连法结语 在项目管理和比赛的激烈竞争中&#xff0c;即兴发言往往成为展示个人魅力和团队精神的重要环节。如何在短时间内组织语言&#xff0c;表达清晰、有力的观点&…