【问题标题】:R : detect pattern at end of subject sequenceR:检测主题序列末尾的模式
【发布时间】:2017-11-07 11:26:53
【问题描述】:

我尝试检测 DNA 序列末端的模式。但我需要处理模式可能超出序列末尾的情况。

例子

pattern  : AATTGGCC
subject1 : AAAAAAATTGGCCATGCACAA
subject2 : ATGGGTGTAGTAATTG

所以这里 subject2 的模式在序列的末尾 结果:

subject1 : AAAAAAATTGGCCATGCACAA
                AATTGGCC
  start : 6
  end   : 13 

subject2 : ATGGGTGTAGTAATTG
                      AATTGGCC
  start : 12
  end   : 16

我的最终目标是删除模式之后的所有内容(包括模式)。

我的第一个想法是使用 Biostrings 包中的 matchPattern 函数来检查模式。如果未检测到,则从右侧逐渐修剪模式并重新执行匹配模式,例如:

pattern <- "AATTGGCC" 
subject <- "ATGGGTGTAGTAATTG"
i <- nchar(pattern)
m <- matchPattern(pattern=pattern,subject)
while(length(m)==0 && i>0){
  i <- i-1
  p <- substring(pattern,1,i)
  m <- matchPattern(pattern=p,subject)
}

结果:

    start end width
[1]    12  16     5 [AATTG] 

但我需要做这十万个序列,也许这不是最优化的方式......

谢谢

编辑:

它现在应该可以工作了。如果主题序列中有多个模式,它会在第一个模式的位置切割序列

trimRead <- function(pattern,subject){
  require(Biostrings)
  i <- nchar(pattern)
  m <- matchPattern(pattern=pattern,subject)
  while(length(m)==0 && i>1){
    i <- i-1
    p <- substring(pattern,1,i)
    subject.sub <- substring(subject,first = nchar(subject)-nchar(p)+1) 
    m <- matchPattern(pattern=p,subject.sub)
  }
  if(length(m)>0){
    s <- nchar(subject)-nchar(subject(m)) + start(m)[1]
    return(substring(subject,first=1,last=(s-1)))
  }else{
    return(subject)
  }
}

【问题讨论】:

    标签: r pattern-matching


    【解决方案1】:

    尝试Biostrings::pairwiseAlignment,使用本地(Smith-Waterman)对齐:

    require(Biostrings);
    pattern <- "AATTGGCC";
    subject <- "ATGGGTGTAGTAATTG";
    m <- pairwiseAlignment(pattern = pattern, subject = subject, type = "local");
    Views(m);
    #  Views on a 16-letter BString subject
    #subject: ATGGGTGTAGTAATTG
    #views:
    #    start end width
    #[1]    12  16     5 [AATTG]
    

    您也可以直接获取部分匹配的开始/结束位置(在subject 坐标中):

    start(subject(m));
    #[1] 12
    end(subject(m));
    #[1] 16
    

    无需手动修剪,这就是Smith-Waterman algorithm 的全部目的。

    【讨论】:

    • 当模式的子串位于主题序列的中间时,这种方法会导致错误的结果。示例:pattern &lt;- "AATTGGCC" and sequence
    • @NicolasRosewick 是的,当然,这是预期的。我很好奇。您希望在 cmets 的示例中发生什么
    • 最后一个CCs 没有模板化。因此,局部对齐只会匹配AATTGGsubject。您可以通过使用m &lt;- pairwiseAlignment(pattern = pattern, subject = sequence, type = "global-local") 来强制对齐不匹配,其中type = "global-local" 确保整个 pattern部分 @ 对齐987654333@。详情请见?pairwiseAlignment
    • @NicolasRosewick 对您的编辑的评论。我在本地(Smith-Waterman)序列比对的背景下解释您的问题,这是生物信息学中的标准问题(另请参见 Blast);它在基序搜索、基因鉴定和任何序列相似性分析的背景下都是相关的。我不确定您要做什么,但是修剪读取然后部分匹配子序列对我来说似乎是在重新发明轮子。 SW 算法已针对此任务进行了优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多