R序列比对功能运行时间过长

时间:2013-12-03 23:50:07

标签: r performance alignment runtime bioinformatics

所以,我对R很新,我有一个运行时问题。我使用“Biostrings”包(biocLite)编写了以下嵌套的while循环,以便连接来自两个物种的蛋白质序列,如果它们具有> 90%的比对分数。

基本上,我输入两个蛋白质基因组,将SeqData1中的每个氨基酸序列与SeqData2中的每个氨基酸序列进行比较,计算比对分数,如果分数> 90%,我会连接一个匹配的蛋白质名称列表和SeqData2蛋白的序列。

该功能确实可以正常工作,唯一的问题是它必须扫描的蛋白质数量我预测整个运行时间大约是1.4个月。 Ť

有没有人对如何以指数方式加速此功能的运行时有任何建议?

谢谢!

R代码:

SeqScore <- function()
{

source("http://bioconductor.org/biocLite.R")
biocLite()
require("Biostrings")
data(BLOSUM100)


SeqData1 <- readDNAStringSet("SeqData1.fasta")
proNum1 = 84390     # number of proteins in Seq1

SeqData2 <- readDNAStringSet("SeqData2.fasta")
proNum2 = 15194     # number of proteins in Seq


#Create empty list to fill with percent scores and matching sequences:
DList=NULL
QueSeqList = NULL
TotList = NULL

#initiating the counters:
i=1
j=1
c=0

#Perform alignment and generate percent identity scores:
while(i<=proNum1)
  {
  while(j<=proNum2)
    {
  SeqAlign <- pairwiseAlignment(SeqData1[i], SeqData2[j], substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)
  PercAlign <- pid(SeqAlign)
  if(PercAlign>=90)
  {
    DList = c(DList, names(SeqData1[i]), names(SeqData2[j]))
    QueSeqList = c(QueSeqList, toString(SeqData2[j]))
    c=c+1
  }
  else{c=c+1; print(c)}
  j=j+1
  }
  i=i+1
  j=1 #to reset the inner while loop
  }
unlist<-t(sapply(DList, unlist));
outputMatrix<-cbind(DList,QueSeqList)
outputMatrix<-as.matrix(outputMatrix, ncol=3)
write.csv(outputMatrix, "outputMatrix.csv")
}

1 个答案:

答案 0 :(得分:1)

在帮助页面中,我认为pairwiseAlignment在第一个参数为任意长度的DNAStringSet时有效,因此外部循环可以替换为

SeqAlign <- pairwiseAlignment(SeqData1, SeqData2[j],
    substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)

我不会使用while循环,而是针对lapply,而不是

results <- lapply(SeqData2, function(elt_j) {
        SeqAlign <- pairwiseAlignment(SeqData1, elt_j,
            substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)
        pid(SeqAlign)
})
data.frame(toString(SeqData1), rep(toString(SeqData2), each=length(SeqData1)),
    unlist(pid, use.names=FALSE))

这可以使您远离R inferno的第二个圆圈,并且如果计算速度仍然很慢,还建议在非Windows上并行化这个简单的策略:

library(parallel)
options(mc.cores=detectCores())
results <- mclapply(seq_along(... ## as before

最好询问有关它长度的数据,而不是单独列出proNum1 = length(SeqData1)。另外,我希望你每次运行脚本时都不使用biocLite();只需一次将软件包安装到任何给定的R安装中。

您将在Bioconductor mailing list上获得更具权威性的答案 - 无需订阅。