Transitions and Transversions

pDestiny·2021년 11월 28일
0

Rosalind-Solution

목록 보기
8/14
post-thumbnail

문제배경

점변이(Point Mutation)는 두가지 방식으로 일어날 수 있습니다.

  1. transition : purin → purin, phyrimidine -> pyrimidine

  2. trasversion : purin → pyrimidine, phyrimidine -> purin

transition의 경우 같은 퓨린간( A ↔ G ),혹은 피리미딘간( C ↔ T )간 발생하는 점변이라를 뜻합니다. 반면에 transversion의 경우 퓨린에서 피리미딘, 혹은 피리미딘에서 퓨린으로 변이가 발생하는 것을 의미합니다.( A ↔ T, A ↔ C. G ↔ C, G ↔ T).

transition의 경우 염기의 화학적 구조를 크게 변경하지는 않습니다. 반면이 transversion의 경우 그 반대로 염기 구조에 transition에 비해 큰 영향을 끼칩니다. 그래서 transition에 비해 transversion의 비율이 더 적습니다. 전체 유전체(genome)에서 transition 의 비율은 transversion에 비해 두배가량입니다. 반면에 단백질이 코딩되는 CDS(CoDing Sequence)에서는 transversion의 비율이 더 적습니다. 보통 3:1 입니다.

점변이가 발생한 CDS 에서, 만야 그 점변이가 변경되어도, codon table상에서 같은 단백질이 만들어진다면 그 변이를 silent substitution이라고 합니다.

문제해설

원본

For DNA strings s1 and s2 having the same length, their transition/transversion ratio R(s1,s2) is the ratio of the total number of transitions to the total number of transversions, where symbol substitutions are inferred from mismatched corresponding symbols as when calculating Hamming distance (see “Counting Point Mutations”).

Given : Two DNA strings s1 and s2 of equal length (at most 1 kbp).
Return : The transition/transversion ratio R(s1,s2).

해설

두개의 DNA sequence(s1,s2s_1, s_2)가 주어졌을 때, s1s_1s2s_2 간의 transition과 transversion의 비율을 구하는 R(s1,s2)R(s_1, s_2)를 구하여라.

sample data

>Rosalind_0209
GCAACGCACAACGAAAACCCTTAGGGACTGGATTATTTCGTGATCGTTGTAGTTATTGGA
AGTACGGGCATCAACCCAGTT
>Rosalind_2200
TTATCTGACAAAGAAAGCCGTCAACGGCTGGATAATTTCGCGATCGTGCTGGTTACTGGC
GGTACGAGTGTTCCTTTGGGT

문제해결

transition과 transversion의 차이만 이해하고 있으면 풀수 있는 문제입니다.
transition은 A와 G, C와 T 간에 발생하는 변이이고, transversion은 A와 T,C 그리고 G와 T,C간의 변이입니다.
제가 한 방식은 A, C, G, T를 0, 1, 2, 3으로 바꾼 다음 계산하는 것이었습니다.
염기서열을 숫자로 바꾸면 두 변이가 존재하는 염기를 가져왔을 때, transition의 경우 둘을 더한 값의 mod 2는 반드시 0이 됩니다. 반면에 transversion의 경우 둘을 더한 값의 mod 2가 반드시 1이 됨으로 transition과 trsnversion의 개수를 셀 수 있고, 따라서 R(s1,s2)R(s_1, s_2)의 결과를 얻을 수 있습니다.

def convert_seqs(seqs):
    replace = {
        "A": 0, "C":1, "G": 2, "T": 3
    }
    return [[replace[x] for x in seq] for seq in seqs]

def get_ratio(num_seqs):
    transition = 0
    transversion = 0
    for i in range(count(first(num_seqs))):
        nt_1 = get(i, first(num_seqs))
        nt_2 = get(i, last(num_seqs))
        if nt_1 != nt_2:
            if (nt_1 + nt_2) % 2 == 0:
                transition += 1
            else:
                transversion += 1
    return transition / transversion

전체 코드는 github 에 올려놨습니다.

profile
Bioinformatician

2개의 댓글

comment-user-thumbnail
2021년 11월 28일

잘 보고 갑니다~

1개의 답글