(五)R语言入门生物信息学——ORF和序列分析

注:本博客旨在分享个人学习心得,有不规范之处请多多包涵!

概念介绍

在人体内,为了表达DNA上的基因,这个基因包含的DNA在被转录为pre-mRNA后经过进一步处理成为成熟的mRNA,mRNA紧接着会被核糖体用来合成蛋白质,从而控制生物体的反应。在mRNA上,每三个碱基组成一个密码子,对应一种氨基酸。下图为密码子与氨基酸的对照表:
对照表
要合成一个正常的蛋白质,mRNA序列上的两端需要分别有一个起始密码子(图上标为start)和一个终止密码子(图上标为stop)。但在DNA上有许多这样子的起始和终止密码子,产生很多种不同的序列组合。为了在DNA上找到所有可能的能用来制作某种蛋白质的序列组合,我们用开放阅读框(ORF,Open Reading Frame)来找到所有具有编码蛋白质潜能的序列。

找ORF的代码实现

在R语言中找ORF的程序流程如下:
流程图
下面是具体代码:

findORF <- function(seq){
    
     #传入参数为DNA序列,注意方向一定要是5'到3'

  findStartCodons <- function(seq){
    
     #找起始密码子的函数
   startcodons <- numeric(0) #创建空函数
   k <- 1
   for(i in 1:(length(seq)-5)){
    
     #以密码子的第一位碱基位置计算,最后五位无需检查,因为长度过短
      if(seq[i] == "a" && seq[i+1] == "t" && seq[i+2] == "g"){
    
     #ATG对应起始密码子
        startcodons[k] <- i #记录位置
        k <- k + 1 #位置下标加一
      }
    }
    return(startcodons) #返回结果
  }

  findStopCodons <- function(seq){
    
     #找终止密码子的函数
    stopcodons <- numeric(0) #创建空函数
    k <- 1
    for(i in 1:(length(seq)-2)){
    
     #以密码子的第一位碱基位置计算
      if((seq[i] == "t" && seq[i+1] == "a" && seq[i+2] == "a") || (seq[i] == "t" && seq[i+1] == "a" && seq[i+2] == "g") || (seq[i] == "t" && seq[i+1] == "g" && seq[i+2] == "a")){
    
     #TAA TAG TGA对应终止密码子
        stopcodons[k] <- i #记录位置
        k <- k + 1 #位置下标加一
      }
    }
    return(stopcodons) #返回结果
  }
  
  startcodon <- findStartCodons(seq) #找到所有的起始密码子
  stopcodon <- findStopCodons(seq) #找到所有的终止密码子
  usedStop <- numeric(0) #记录用过的终止密码子
  ORFs <- character(0) #记录有效开放阅读框
  k <- 1
  for(i in startcodon){
    
     #遍历所有起始密码子
    for(j in stopcodon){
    
     #遍历所有终止密码子
      if((j-i)%%3==0 && j > i){
    
     #如果在一个阅读框内,即两个密码子之间的位置为3的整数
        if(j %in% usedStop){
    
     #如果终止密码子被用过
          break #跳出这次循环,到下一个起始密码子
        }else if(j-i < 300){
    
     #如果密码子之间的序列长度过短
          break #同上
        }else{
    
    
          ORFs[k] <- paste(i, "to", j) #生成字符串,记录的结果如"1 to 3001"
          usedStop[k] <- j #记录用过的终止密码子
          k <- k + 1 #位置下标加一
          break #跳出本次循环,到下一个起始密码子
        }
      }
    }
  }
  return(ORFs) #返回结果
} 

这种找ORF的算法比较简单快速,但相应地准确度会有所下降。在NCBI官网有更准确的算法。

结束语

在找到ORF后,就能将该ORF与数据库中的已知序列进行比对,从而预测该物种基因的组成与功能等有用信息。下次将会介绍Needleman-Wunsch这一序列全局比对算法,敬请期待!和有任何问题或想法欢迎留言和评论!

猜你喜欢

转载自blog.csdn.net/EricFrenzy/article/details/119447588