Needleman-Wunsch实现在cogent和skbio中给出了不同的对齐方式

时间:2014-08-15 19:22:00

标签: python numpy skbio

skbio中的实现与pycogent中的实现结果相比给出了奇怪的结果。

from cogent.align.algorithm import nw_align as nw_align_cogent
from skbio.alignment import global_pairwise_align_nucleotide as nw_align_scikit

seq_1 = 'ATCGATCGATCG'
seq_2 = 'ATCGATATCGATCG'

print "Sequences: "
print "     %s" % seq_1
print "     %s" % seq_2
print

alignment = nw_align_scikit(seq_1, seq_2)
al_1, al_2 = [alignment.get_seq(_id).__str__() for _id in alignment.ids()]

print "    nw alignment using scikit:"
print "        %s" % al_1
print "        %s" % al_2
print

al_1, al_2 = nw_align_cogent(seq_1, seq_2)

print "    nw alignment using cogent:"
print "        %s" % al_1
print "        %s" % al_2
print

输出如下:

nw alignment using scikit:
    ------ATCGATCGATCG
    ATCGATATCGATCG----

nw alignment using cogent:
    ATCGAT--CGATCG
    ATCGATATCGATCG

1 个答案:

答案 0 :(得分:4)

这是一个很好的问题,与scikit-bio和PyCogent中的比对得分有关。默认情况下,在scikit-bio中,终端间隙不会受到惩罚,因为这会导致一些非常奇怪的对齐。这个issue was briefly discussed here和插图here(参见笔记本的最后一个单元格)。

如果您想要获得更类似于PyCogent中的解决方案,您可以将penalize_terminal_gaps=True传递给global_pairwise_align_nucleotide,如下所示:

alignment = nw_align_scikit(seq_1, seq_2, penalize_terminal_gaps=True)
al_1, al_2 = [alignment.get_seq(_id).__str__() for _id in alignment.ids()]

print "    nw alignment using scikit:"
print "        %s" % al_1
print "        %s" % al_2

输出:

nw alignment using scikit:
        ATCG--ATCGATCG
        ATCGATATCGATCG

您会注意到对齐仍然与您从PyCogent获得的对齐方式不同,但这是一个小的实现差异:两个结果对齐具有相同的分数(区别在于--AT重复中的第一个AT或第二个ATAT对齐,这两个实现在如何打破这种关系方面做出了不同的选择。

如果你回到你发布的对齐方式(scikit-bio的默认值),你会注意到返回的对齐方式非常好 - 事实上,如果不惩罚,那么这是最佳的得分对齐方式终端间隙(根据定义,因为最佳评分对齐是它返回的)。然而,你是对的,这很奇怪,因为scikit-bio在这种特定情况下返回的对齐可能不是最具生物学相关性的对齐。如果您知道您的序列都从相同位置开始并在同一位置结束,则可以传递penalize_terminal_gaps=True。但是,你的是一个玩具示例,在大多数情况下是真实的序列,我认为最生物学相关的对齐将返回默认参数。