前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >评估 beagle 基因型填充的准确率

评估 beagle 基因型填充的准确率

作者头像
用户7010445
发布2024-05-29 14:16:06
1010
发布2024-05-29 14:16:06
举报

最简单的一个思路,只保留vcf文件中不包含任何缺失数据的位点。然后随机把某些样本的部分位点替换成缺失,用beagle做基因型填充,比较填充后和填充前的一致性。

使用 Nature tomato 这篇论文里SNP的数据

Graph pangenome captures missing heritability and empowers tomato breeding

https://www.nature.com/articles/s41586-022-04808-9

只用3号染色体的数据

首先是把含有缺失基因型的位点过滤掉

代码语言:javascript
复制
time vcftools --gzvcf ../chr3.vcf.gz \
--keep ../332.samples \
--max-missing 1 \
--min-alleles 2 \
--max-alleles 2 \
--recode --recode-INFO-all --out chr3.snp.332
## 7m42.853s

随机把位点替换成缺失

这里每个位点被选中的概率是10%

每个样本被选中的概率是20%

代码语言:javascript
复制
python randomvcf2NA.py chr3.snp.332.recode.vcf output.snp.vcf truth.snp.sites

randomvcf2NA.py脚本的内容

代码语言:javascript
复制
# 1 input vcf
# 2 output vcf
# 3 truth sites

import sys
import random

fr = open(sys.argv[1],'r')
fw = open(sys.argv[2],'w')
fw02 = open(sys.argv[3],'w')

row = 0
col = 0

for line in fr:
    if line.startswith("#"):
        fw.write(line)
    else:
        row += 1
        temp_list = line.strip().split("\t")
        
        if random.random() <= 0.1:
            new_list = []
            for i in range(0,len(temp_list)):
                if i < 9:
                    new_list.append(temp_list[i])
                elif i >= 9:
                    if random.random() <= 0.2:
                        new_list.append("./.")
                        GT = temp_list[i][0:3]
                        
                        fw02.write("%d\t%d\t%s\n"%(row,i+1,GT))
                    else:
                        new_list.append(temp_list[i])
            
            fw.write('%s\n'%("\t".join(new_list)))
            
            
            
        else:
            fw.write('%s\n'%("\t".join(temp_list)))
            
fw.close()
fw02.close()
fr.close()

三个位置参数是 输入vcf 输出vcf 和随机选中位点的基因型 truth.sites文件的内容

image.png

每列的内容 位点行 样本列 基因型

基因型填充

代码语言:javascript
复制
time java -Xmx96g -jar \
~/anaconda3/envs/syri/share/beagle-5.2_21Apr21.304-0/beagle.jar  \
gt=output.snp.vcf \
out=output.snp.impute \
nthreads=48

这个填充我之前印象里运行是非常慢的。但实际是很快的。一条染色体50万个位点2分钟左右。不知道这个运行很慢的印象是怎么来的了

提取填充过后的基因型

代码语言:javascript
复制
python getImputeSites.py output.snp.impute.vcf.gz truth.snp.sites call.snp.sites

getImputeSites.py脚本的内容是

代码语言:javascript
复制
# 1 impute vcf gz
# 2 truth.sites
# 3 output

import sys
import pandas as pd

df = pd.read_csv(sys.argv[1],comment="#",sep="\t",header=None)

fw = open(sys.argv[3],'w')

with open(sys.argv[2],'r') as fr:
    for line in fr:
        row = int(line.strip().split()[0])
        col = int(line.strip().split()[1])
        trueGT =  line.strip().split()[2]
        imputeGT = df.iloc[row-1,col-1]
        
        fw.write("%d\t%d\t%s\t%s\n"%(row,col,trueGT,imputeGT))
        
fw.close()

三个参数 输入填充后的vcf文件 上一步输出的三列真实基因型数据,输出数据

输出数据的内容

image.png

第三类是真实基因型,第四列是填充后的基因型

统计错误率

代码语言:javascript
复制
library(tidyverse)
read_tsv("call.snp.sites",col_names = FALSE) %>% 
  mutate(X5=str_count(X3,'1'),
         X6=str_count(X4,'1')) %>% 
  mutate(X7=case_when(
    X5 == X6 ~ "TRUE",
    TRUE ~ "FALSE"
  )) %>% 
  pull(X7) %>% table() -> x

x

x[1]/sum(x)

可以用snakemake把这个流程穿起来,然后多重复几次统计个平均值

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先是把含有缺失基因型的位点过滤掉
  • 随机把位点替换成缺失
  • 基因型填充
  • 提取填充过后的基因型
  • 统计错误率
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档