R语言算法丨批量查找SNP位点连锁区内对应的QTL以及基因

news/2024/11/29 1:47:43/

批量查找SNP位点连锁区内对应的QTL以及基因

如果已知SNP位点的物理位置和其LDblock区间的端点,想要快速找到该区间内的QTL,之后根据参考基因组找到与连锁区域存在交集的基因,最终得到与SNP和QTL相匹配的基因集

通常的做法是在Excel中先对每个SNP计算出相应区间,然后找到对应的QTL,然后打开全部基因的参考信息,寻找有关基因。

上述方法较复杂,如果有成千上万条SNP或者基因将会非常耗费时间和精力,而且操作过程中容易出错,以下介绍一种快速实现的算法。

运行方法

  • 安装R4.2.3,并加载tidyverse
  • 将SNP和基因数据保存在data目录
  • 运行run.R,结果将输出在out目录

算法原理

总体的思路是先对SNP进行区间进行合并,由于一个QTL可能对应多个SNP,因此要将这些位点扩展为一个区间,保证每个QTL都独立映射一个区间范围。然后从参考基因组找到最优的匹配项,与QTL合并保存。

数据读取

### 本算法用于批量查找snp位点对应的LDblock区间内QTL和基因 ============================================
library(tidyverse)
## QTL和SNP信息文件
f <- "./data/xxx.csv"
df <- read_csv(f)
## gene参考文件
f_ref <- "./data/ref.txt"
df_ref <- read_tsv(f_ref)

SNP和QTL数据整理

df <- df %>% arrange(QTL)
add_list <- list()
for (i in 1:nrow(df)){
  #取出一行进行添加信息
  snp <- df$target_SNP[i]
  atom <- str_split(snp,"_")
  snp_chr <- str_sub(atom[[1]][1],-2,-1)
  snp_loc <- as.numeric(atom[[1]][2])
  loc_L <- df$L_region[i]
  loc_R <- df$R_region[i]
  name_QTL <- df$QTL[i]
   
  # i=1单独处理
  if (i==1){
    add_list[[`name_QTL`]][1] <- name_QTL
    add_list[[`name_QTL`]][4] <- loc_L
    add_list[[`name_QTL`]][3] <- loc_R
    add_list[[`name_QTL`]][2] <- snp_chr
    next
  }
   
  # 存在多个连续QTL时,扩展右侧端点进行合并
  if (df$QTL[i]!=df$QTL[i-1]){
    add_list[[`name_QTL`]][1] <- name_QTL
    add_list[[`name_QTL`]][4] <- loc_L
    add_list[[`name_QTL`]][3] <- loc_R
    add_list[[`name_QTL`]][2] <- snp_chr
  }else{
    add_list[[`name_QTL`]][3] <- loc_R
  }
}

上面的算法对每个SNP进行迭代,将SNP切分成染色体和物理位置元素,然后记录左右区间端点,对于连续存在的QTL将右侧端点处的值进行扩展,实现了每个QTL对应位置区间的整理。

筛选QTL区间内的基因

首先创建一个空数据框,第一列是QTL名称,第二列是染色体位置,第三列是提取到的基因,并对参考基因组进行过滤,剔除NA值,用于后续迭代搜索。

out <- matrix(ncol = 3)
colnames(out) <- c("QTL","chr","gene")
out <- as.data.frame(out)
out <- out[-1,]
df_ref <- df_ref %>% drop_na()

然后对每个QTL进行搜索,在保证染色体一致的情况下,假如某基因的起始和终止位点都小于QTL区间左端点,代表该基因在QTL上游,如果都大于QTL区间右端点,则在下游。否则出现三种情况:基因在QTL区域内部、QTL在基因区域内部、QTL区间与基因区间有交集,这三种情况的基因就是目标基因集。

### 筛选处于QTL区间内的基因 ================================================================
for (QTL in add_list){
  print(QTL) 
  for (i in 1:nrow(df_ref)){
    if (df_ref$chr[i]==QTL[2]){
      if (df_ref$start[i]<QTL[3]|df_ref$end[i]<QTL[3]){
        next
      }else{
        if (df_ref$start[i]>QTL[4]|df_ref$end[i]>QTL[4]){
          next
        }else{
          tem <- c(QTL[1],df_ref$chr[i],df_ref$gene[i])
          out <- rbind(out,tem)
        }
      }
    }
  }
}

结果保存

write.csv(out,"./out/QTL_chr_gene.csv",quote = F,row.names = F)

本文由 mdnice 多平台发布


http://www.ppmy.cn/news/42020.html

相关文章

ASP.NET 记录 HttpRequest HttpResponse HttpServerUtility

纯属个人记录,会有错误 HttpRequest Browser是获取客户端浏览器的信息 Cookies是获取客户端的Cookies QueryString是获取客户端提交的数据 ServerVariables是获取服务器端或客户端的环境变量信息 Browser 语法格式: Request.Browser[“浏览器特性名”] 常见的特性名 名称说…

【Linux】Centos安装mvn命令(maven)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录一、下载maven包方法一&#xff1a;官…

Flink 优化 (三) --------- 反压处理

目录一、概述1. 反压的理解2. 反压的危害二、定位反压节点1. 利用 Flink Web UI 定位2. 利用 Metrics 定位三、反压的原因及处理1. 查看是否数据倾斜2. 使用火焰图分析3. 分析 GC 情况4. 外部组件交互一、概述 Flink 网络流控及反压的介绍&#xff1a;https://flink-learning.…

[2019.01.24]JNI经验积累

[1 jobject<--->jclass|jstring](1)jobject向上转型jclass|jstring:jclass jcls static_cast<jclass>(jobject);jstring jstr static_cast<jclass>(jobject);(2)jclass|jstring向下转型jobject:默认情况下是自动转换的[2 jstring<--->const char*](1…

(排序6)快速排序(小区间优化,非递归实现)

TIPS 快速排序本质上是一个分治递归的一个排序。快速排序的时间复杂度是NlogN&#xff0c;这是在理想的情况之下&#xff0c;但是它最坏可以到达N^2。决定快速排序的效率是在单趟排序之后这个key最终落在的位置&#xff0c;越落在中间就越接近二分&#xff0c;越接近2分就越接…

手写vuex4源码(六)命名空间实现

一、命名空间使用 在子模块对象中添加 namespaced&#xff1a;true&#xff0c;为模块开启命名空间功能&#xff1b; 开启命名空间功能&#xff0c;相当于为每个模块添加独立的作用域&#xff0c;实现模块间状态和事件的隔离&#xff1b; 二、命名空间实现逻辑 在模块注册阶…

【神经网络】tensorflow实验5--数字图像基础

目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; ① 代码 ② 实验结果 题目二&#xff1a; ① 代码 ② 实验结果 4. 实验小结&讨论题 1. 实验目的 ①了解数字图像基本属性&#xff1b; ②掌握Pillow图像处理库的基本操作。 2. 实验内容 ①使用Pill…

BGP与OSPF混合组网

如图。R1和R2之间是OSPF Area 0,R23和R4之间是OSPF Area 1,R5和R6之间是OSPF Area2。除了R1和R2之间的cost是100,其余链路的cost都是10. AR1/2/3/4/5/6之间通过Loopback口建立IBGP全互联邻居关系,并且都是AS11520,和外部建立EBGP邻居访问100.100.100.1的网络。(不确定图中…