重测序基因组:Pi核酸多样性计算

如何计算核酸多样性 Pi

本期笔记分享关于核酸多样性pi计算的方法和相关技巧,主要包括原始数据整理、分组文件设置、计算原理、操作流程、可视化绘图等步骤。


alt

基因组Pi核酸多样性(Pi nucleic acid diversity)是一种遗传学研究中用来描述种群内核酸序列多样性的指标,通常用π(pi)符号表示。

它衡量了在一组生物个体的基因组中,不同核苷酸位置上的多态性水平,这种多样性是通过比较不同个体之间的DNA或RNA序列来测定的。

需要输入什么样的数据?

  • 样品分组数据

一般在计算pi的时候,需要根据不同亚群或分组来计算,比如高个子和矮个子分成两组,或者按照表性差异、起源地点等分成若干组。

需要将组的样品ID保存为一个txt文档,每行放一个样品ID,不同组的样品放在不同txt文件中。

cat pop1.txt
sample001
sample002
sample006
...
cat pop2.txt
sample012
sample054
sample269
  • 基因型数据

需要的基因型数据是VCF格式(常规存储变异信息的一种格式,通常由测序上游分析GATK标准流程获得),其中包含了区间内每个SNP在每个样品的基因型。

alt

如何进行计算?

# 首先加载所需要的R包
library(tidyverse)
library(vcfR)
library(scales)
# 备注:请提前安装vcftools并添加到环境变量

设置参数

# VCF <- "xxx.vcf"
# QTL <- "Gene1"
# SNP <- "MY_SNP_ID"
# mycol <- c("#eb6f51","#20b694","#3560a3","#f8c06f","#004b1c","#5c2d91")

mycol参数可以设置想要的颜色,最终绘图时会根据此参数调整折现颜色。VCF、QTL、SNP根据实际情况进行修改。

group_list <- c("pop1","pop2","pop...")

group_list列表存储亚群或者分组信息,每个亚群分别计算pi然后再合并绘图。

这里可以用任意分组规则,只要能把样品分成一堆一堆就可以,目的是为了研究不同分组之间的差异,还有同一组内的变化趋势。

计算Pi核酸多样性

for (i in group_list){
  shell_cmd <- str_c("vcftools",
                     "--vcf",VCF,
                     "--keep",str_c(i,".txt"), # 这里会自动读取每个分组文件
                     "--window-pi","100000"# 100kb窗口
                     "--window-pi-step","10000"# 10kb步长
                     "--out",str_c("out_pi/",i),
                     "",sep = " ")
  print(shell_cmd)
  system(shell_cmd)
}

这段R语言代码是一个循环,用于执行一系列的系统命令。以下是逐步解释:

for (i in group_list):

遍历名为group_list的列表中的每个元素,将当前元素赋值给变量i,然后执行循环体中的操作。

shell_cmd <- str_c(...):

在每次循环中,创建一个字符串变量shell_cmd,其中包括一系列参数依次进行调用,自动生成命令代码。

print(shell_cmd):

打印当前循环中生成的shell_cmd字符串,以便查看每次循环生成的命令。

system(shell_cmd):

使用system函数执行生成的shell_cmd命令,这将在系统上运行相应的vcftools命令,执行一些与VCF文件处理相关的任务,如计算窗口内的π值。

总之,这段代码的作用是循环遍历group_list中的元素,每次循环生成一个用于运行vcftools命令的字符串shell_cmd,然后执行该命令。

结果可视化

以下R语言代码的目的是创建一个包含数据框(data frame)的列表,并将一些数据加载到这些数据框中,最后将它们合并成一个大的数据框,用于ggplot绘图。

df_plot <- list()
# 创建空列表,并读取数据
for (i in group_list){
  df_plot[[i]] <- read_table(str_c("out_pi/",i,".windowed.pi"))
  df_plot[[i]][,2] <- df_plot[[i]][,2]/1000000 # 转换物理位置为MB
  df_plot[[i]][,6] <- i
  colnames(df_plot[[i]])[6] <- "Group"
}
df_plot_all <- bind_rows(df_plot)

以下是每行代码的具体解释信息:

df_plot <- list():首先创建一个空列表df_plot,用于存储数据框。

for (i in group_list):通过for循环遍历group_list中的元素,其中i代表当前循环的元素。

df_plot[[i]] <- read_table(...):在每次循环中,创建一个数据框,并将其存储在df_plot列表中的以i命名的位置。read_table函数用于读取数据文件,文件路径由str_c("out_pi/",i,".windowed.pi")构建,i是当前group_list中的元素。这个数据框包含了从指定文件中读取的数据。

df_plot[[i]][,2] <- df_plot[[i]][,2]/1000000:将df_plot列表中的第i个数据框的第2列数据(可能是物理位置)除以1000000,将其转换为兆字节(MB)。

df_plot[[i]][,6] <- i:在第i个数据框中添加一列,该列的所有值都设置为当前循环的i值,这列通常用于标识数据来源的组。

colnames(df_plot[[i]])[6] <- "Group":将第i个数据框的第6列的列名更改为"Group",以便更清晰地表示这一列的含义。

df_plot_all <- bind_rows(df_plot):最后,使用bind_rows函数将df_plot列表中的所有数据框合并成一个大的数据框df_plot_all,这个数据框包含了来自不同组的数据,每个组的数据位于不同的行中,且具有"Group"列来标识它们所属的组。
绘图

下面这段代码使用ggplot2包创建一个散点拟合曲线图并将图形保存为PDF文件。

p1 <- ggplot(df_plot_all)+
  geom_smooth(aes(BIN_START,PI,color=Group),
     method = "loess",span = 0.1 ,se = F,linewidth = 1 )+
  # geom_line(aes(BIN_START,PI,color=Group),linewidth=1)+
  scale_color_manual(values = mycol)+
  xlab(str_c("Physical Postion "))+
  ylab("Pi")+
  ylim(0,0.01)+
  theme_bw()+
  theme(legend.position = "none")
ggsave(filename = str_c("out_plot/pi_10MB/",QTL,"_",SNP,"_pi_BG_100kwindow_10kstep.pdf"),
       plot = p1,width = 8,height = 4)

以下是每行代码的详细解释:

p1 <- ggplot(df_plot_all) +:创建一个ggplot2的图形对象,基于数据框df_plot_all。

geom_smooth(aes(BIN_START, PI, color = Group), method = "loess", span = 0.1, se = F, linewidth = 1):在图形上添加平滑曲线。使用BIN_START列作为x轴,PI列作为y轴,根据不同的Group组别进行着色。曲线平滑方法为loess,span参数控制平滑度,se = F表示不要显示置信区间,linewidth = 1设置曲线的线宽。

scale_color_manual(values = mycol):自定义颜色映射,将mycol中的颜色赋予不同的组别。

xlab(str_c("Physical Position"):设置x轴标签为"Physical Position"

ylab("Pi"):设置y轴标签为"Pi"

ylim(0, 0.01):限制y轴的范围,从0到0.01。

theme_bw():应用白底主题,使图形背景为白色。

theme(legend.position = "none"):隐藏图例,因为legend.position设置为"none"

ggsave(filename = str_c("out_plot/pi_10MB/",QTL,"_",SNP,"_pi_BG_100kwindow_10kstep.pdf"), plot = p1, width = 8, height = 4):最后一行代码保存图形为PDF文件。文件名根据变量QTL和SNP动态生成,保存在指定路径下

以上就是计算核酸多样性并可视化的方法,欢迎您看到这里,如果感觉有用请转发收藏,以备不时之需。

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H5前端开发——BOM

H5前端开发——BOM BOM&#xff08;Browser Object Model&#xff09;是指浏览器对象模型&#xff0c;它提供了一组对象和方法&#xff0c;用于与浏览器窗口进行交互。 通过 BOM 对象&#xff0c;开发人员可以操作浏览器窗口的行为和状态&#xff0c;实现与用户的交互和数据传…

设计模式之命令模式

文章目录 一、介绍二、命令模式中的角色三、案例1. 命令的抽象接口Command2. 进攻AttackCommand3. 意大利炮cannonCommand4. 开炮FireCommand5. 李云龙LiYunLong6. 运行案例 四、优缺点 一、介绍 命令模式(Command Pattern)&#xff0c;属于行为型设计模式。指的是把方法调用封…

系统架构设计师之RUP软件开发生命周期

系统架构设计师之RUP软件开发生命周期

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例 在matlab中有自带的离散傅里叶变换程序&#xff0c;即fft程序&#xff0c;但该程序是封装的&#xff0c;无法看到源码。为了比较清楚的了解matlab自带的实现过程&#xff0c;本文通过自建程序实现matlab程序&…

IntelliJ IDEA 2023.2正式发布,新UI和Profiler转正

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 北京时间2023年7月26日&#xff0c;IntelliJ IDEA 2023.2正式发布。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这几碗汤干了&#xff0c;更有助于消化&#xff08;每篇都很顶哦…

排序-表排序

当我们需要对一个很大的结构体进行排序时&#xff0c;因为正常的排序需要大量的交换&#xff0c;这就会造成时间复杂度的浪费 因此&#xff0c;我们引入指针&#xff0c;通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路&#xff1a;通过开辟一个指针数组&…

十个最常用的计算机视觉数据集

如今&#xff0c;人工智能和机器学习领域中最振奋人心的一个分支是计算机视觉&#xff08;Computer Vision&#xff0c;简称CV&#xff09;。CV应用于多种场景&#xff0c;以改善我们的日常生活&#xff0c;并推进科学技术研究。其中包括&#xff1a; 自动驾驶自动生成图像描述…

重入漏洞EtherStore

重入漏洞 // SPDX-License-Identifier: MIT pragma solidity ^0.8.13;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;}function withdraw() public {uint bal balances[msg.sender]…

Linux 函数调用的用户态与内核态

在用户态中&#xff0c;程序的执行往往是一个函数调用另一个函数。函数调用都是通过栈来进行的。 在进程的内存空间里面&#xff0c;栈是一个从高地址到低地址&#xff0c;往下增长的结构&#xff0c;也就是上面是栈底&#xff0c;下面是栈顶&#xff0c;入栈和出栈的操作都是…

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关&#xff0c;在 Profinet 侧做为 Profinet 主站控制器&#xff0c;接 Profinet 设备&#xff0c;如伺服驱动器&#xff1b;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站&#xff0c;接 PLC、上位机、wincc 屏等。 拓…

k8s kubeadm配置

master 192.168.41.30 docker、kubeadm、kubelet、kubectl、flannel node01 192.168.41.31 docker、kubeadm、kubelet、kubectl、flannel node02 192.168.41.32 do…

python 字典dict和列表list的读取速度问题, range合并

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候&#xff0c;需要读取较大数据&#xff08;2.7G&#xff09;存入字典中&#xff0c; 然后对被处理数据进行字典key值的匹配&#xff0c;在被处理文件中每次…

Python:实现日历到excel文档

背景 日历是一种常见的工具,用于记录事件和显示日期。在编程中,可以使用Python编码来制作日历。 Python提供了一些内置的模块和函数,使得制作日历变得更加简单。 在本文,我们将探讨如何使用Python制作日历,并将日历输出到excel文档中。 效果展示 实现 在代码中会用到cale…

TypeScript学习 | 泛型

简介 泛型是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 作用 可以保证类型安全的前提下&#xff0c;让函数、接口或类与多种类型一起工作&#xff0c;从而实现复用 基本使用 举个例子&#xff1a; 创…

各品牌PLC存储器寻址的规则

在PLC编程时&#xff0c;字节或多字节的变量一般支持绝对地址寻址&#xff08;比如&#xff0c;IW0、MD4等&#xff09;。要想正确寻址&#xff0c;则必须要搞清楚寻址的规则。目前常见的规则有两种&#xff1a;字节寻址和字寻址。下图清晰地表达了两种规则的编号情况&#xff…

【C++】stackqueue

适配器是一种设计模式 &#xff0c; 该种模式是将一个类的接口转换成客户希望的另外一个接口 。 虽然 stack 和 queue 中也可以存放元素&#xff0c;但在 STL 中并没有将其划分在容器的行列&#xff0c;而是将其称为 容器适配 器 &#xff0c;这是因为 stack 和队列只是对其他容…

上传和下载文件到google drive/Local pc

1 上传 参考&#xff1a;使用 Python 将文件上传到 Google 云端硬盘_迹忆客 Upload file to google drive using Python - CodeSpeedy (没起作用&#xff0c;但可以参考一下) 第 1 步&#xff1a;Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Pla…

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…

出海路上离不开的Email营销,教你这样来优化!

随着互联网的不断发展&#xff0c;Email已经成为人们工作和生活中不可或缺的一部分。尤其是对于我们这些跨境企业而言&#xff0c;发送Email是一个促进销售和维护客户关系的良好渠道。而且邮件的价格也是比较低廉的&#xff0c;很适合用于日常推广营销&#xff0c;所以人手几个…

论文阅读 - Coordinated Behavior on Social Media in 2019 UK General Election

论文链接&#xff1a; https://arxiv.org/abs/2008.08370 目录 摘要&#xff1a; Introduction Contributions Related Work Dataset Method Overview Surfacing Coordination in 2019 UK GE Analysis of Coordinated Behaviors 摘要&#xff1a; 协调的在线行为是信息…