길이 k의 유전자 문자열 부분 문자열은 일반적으로 k-mer라고합니다. 길이 n의 유전자 문자열은 n-k + 1개의 중첩 k-mer로 구성될 수 있습니다. 유전자 문자열의 k-mer 구성은 문자열에서 각 가능한 k-mer가 발생하는 횟수를 인코딩합니다. 예를 들면 아래와 같이 말이죠.
1-mer 구성은 DNA의 GC-content를 정량화 할 수 있고, DNA 문자열의 2-mer, 3-mer 및 4-mer 구성은 이중핵산, 삼중핵산 및 사중핵산 구성으로 k-mer 구성을 정량화 합니다.
k-mer 구성의 생물학적 의의는 다양합니다. GC-content는 알려지지 않은 DNA 조각을 식별하는 데 도움이되는 것뿐만 아니라, 전체 게놈과 비교하여 높은 GC-content를 가진 유전자 영역은 엑손에 속할 가능성이 있음을 나타냅니다. k-mer 구성 분석은 Genome Assembly에 꼭 필요하기도 합니다.
k가 큰 값에 대해 k-mer 구성은 단일 기호의 분석 대신 부분 문자열 (즉, 단어)의 규모에서 분석을 제공하기 때문에 문자열의 정체성에 대한 더 robost한 fingerprint를 제공합니다. 비교 기준으로, 언어 분석에서 텍스트의 k-mer 구성은 언어를 정확히 파악하는 데만 아니라 종종 작가를 파악하는 데도 사용될 수 있습니다.
4-mer DNA sequence의 구성을 구하여라. 구성의 순서는 4-mer의 lexicographical 순서이다.(알파벳 순서대로)
Given : A DNA string in FASTA format (having length at most 100kbp)
Return : The 4-mer composition of
from Bio import SeqIO
from io import StringIO
from toolz.curried import *
from itertools import product
fasta = StringIO(""">Rosalind_6431
CTTCGAAAGTTTGGGCCGAGTCTTACAGTCGGTCTTGAAGCAAAGTAACGAACTCCACGG
CCCTGACTACCGAACCAGTTGTGAGTACTCAACTGGGTGAGAGTGCAGTCCCTATTGAGT
TTCCGAGACTCACCGGGATTTTCGATCCAGCCTCAGTCCAGTCTTGTGGCCAACTCACCA
AATGACGTTGGAATATCCCTGTCTAGCTCACGCAGTACTTAGTAAGAGGTCGCTGCAGCG
GGGCAAGGAGATCGGAAAATGTGCTCTATATGCGACTAAAGCTCCTAACTTACACGTAGA
CTTGCCCGTGTTAAAAACTCGGCTCACATGCTGTCTGCGGCTGGCTGTATACAGTATCTA
CCTAATACCCTTCAGTTCGCCGCACAAAAGCTGGGAGTTACCGCGGAAATCACAG""")
SeqIO를 StringIO를 이용하면 fastq string을 파일 없이도 읽어 낼 수 있다.
seqs = SeqIO.parse(fasta, "fasta")
# A C G T 로 알파벳 순서에 맞게 composition을 dict를 만든다.
compositions = {
''.join(k):0 for k in product(['A',"C", "G", "T"], repeat=4)
}
for seq in seqs:
# 4-mer sliding windows를 toolz 툴로 만든다.
windows = sliding_window(4, seq.seq)
# window를 돌며 각 window가 몇번 나오는지를 계산한다.
for window in windows:
window = ''.join(window)
compositions[window] += 1
# 출력한다.
for val in compositions.values():
print(val, end=" ")
풀이는 github 전체 코드는 github에 올려놨습니다.(github는 코드가 조금 다름)