1

如果我有 3 个 DNA 序列并且我想通过一些函数来评估它们:

 seq1='AG_CT'
 seq2='AG_CT'
 seq3='ACT_T'

如何在python中计算这三个DNA序列的共识分数和加权对分数(WSP分数)?

共识得分是序列和共识序列之间的成对得分之和,共识(A)=sum{l}^{i=1}d(i)l是序列的长度,d是两个碱基之间的距离,例如:d(A,B)=2 代表 A!=B,d(A,-)=d(-,A)=1 代表 A!='-',否则为 0。对于上述示例,A 和 B 可能是“A 或 C 或 G 或 T”

     we calculate distance between seq1 and seq2 then seq1 and seq3 then seq2 and seq3

**seq1 and seq2:**
d(A,A)=0, d(G,G)=0, d(-,-)=0, d(c,c)=0, d(t,t)=0
**seq1 and seq3**:
d(A,A)=0, d(G,C)=2, d(-,T)=1, d(c,-)=1, d(t,t)=0
**seq2 and seq3**:
d(A,A)=0, d(G,C)=2, d(-,T)=1, d(c,-)=1, d(t,t)=0


         seq1= A  G  _  C  T
         seq2= A  G  _  C  T
         seq3= A  C  T  _  T
               0  0  0  0  0
               0  2  1  1  0
               0  2  1  1  0
               ++++++++++++++
               0+ 4+ 2+ 2+ 0= 8

共识(A)=8

WSP (A) = \ sum_ {i=1}^{k-1} \sum_{j=i+l}^k \sum_{h=1}^lw ij * s( A[ i, h ], [ j,h ] l : 序列长度, k 序列数, w ij序列 i 和 j 的权重

s(A,B)=2 for A!=B, s(A,-)=d(-,A)=-1 for A!='-',3 else.all 权重因子为 1。

             seq1= A  G  _  C  T
             seq2= A  G  _  C  T
             seq3= A  C  T  _  T
                   3  3  3  3  3
                   3  2 -1 -1  3
                   3  2 -1 -1  3
                   ++++++++++++++
                  (3+3+3)*1+(3+2+2)*1+(3-1-1)*1+(3-1-1)*1+(3+3+3)*1=9*1+7*1+1*1+1*1+9*1
                   9+7+1+1+9=27

因此,三个序列的 WSP 得分为27

4

1 回答 1

0

我将按如下方式处理。首先,创建函数来计算各个距离和加权和:

def distance(a, b):
    """Distance between two bases a and b."""
    if a == b:
        return 0
    elif a == "_" or b == "_":
        return 1
    else:
        return 2

def w_sum(a, b, w=1):
    """Calculate the pair sum of bases a and b with weighting w."""
    if a == b:
        return 3 * w
    elif a == "_" or b == "_":
        return -1 * w
    else:
        return 2 * w

zip其次,使用函数在相同位置创建碱基集:

list(zip(seq1, seq2, seq3)) == [('A', 'A', 'A'), 
                                ('G', 'G', 'C'), 
                                ('_', '_', 'T'), 
                                ('C', 'C', '_'), 
                                ('T', 'T', 'T')]

第三,使用 生成每个位置内的对itertools.combinations

list(combinations(('G', 'G', 'C'), 2)) == [('G', 'G'), 
                                           ('G', 'C'), 
                                           ('G', 'C')]

最后,将距离和总和相加:

from itertools import combinations

consensus = 0
wsp = 0
for position in zip(seq1, seq2, seq3): # sets at same position
    for pair in combinations(position, 2): # pairs within set
        consensus+= distance(*pair) # calculate distance
        wsp += w_sum(*pair) # calculate pair sum

请注意使用 将*pair碱基对的 2 元组解包到计算函数的两个参数中。

于 2014-01-13T14:12:23.350 回答