Поиск мотивов с помощью пробоотборника Гиббса

Я новичок как в программировании, так и в биоинформатике. Поэтому я был бы признателен Вам за понимание. Я попытался разработать скрипт python для поиска мотивов с использованием выборки Гиббса, как описано в классе Coursera, "поиск скрытых сообщений в ДНК". Псевдокод, предоставленный в курсе:

GIBBSSAMPLER(Dna, k, t, N)
    randomly select k-mers Motifs = (Motif1, …, Motift) in each string
        from Dna
    BestMotifs ← Motifs
    for j ← 1 to N
        i ← Random(t)
        Profile ← profile matrix constructed from all strings in Motifs
                   except for Motifi
        Motifi ← Profile-randomly generated k-mer in the i-th sequence
        if Score(Motifs) < Score(BestMotifs)
            BestMotifs ← Motifs
    return BestMotifs

описание проблемы:

вызов кода: реализовать GIBBSSAMPLER.

вход: целые числа k, t и N, за которыми следует коллекция строк ДНК. Вывод: строки BestMotifs в результате запуска GIBBSSAMPLER (Dna, k, t, N) с 20 случайных стартов. Не забудьте использовать pseudocounts!

Пример Ввода:

 8 5 100
 CGCCCCTCTCGGGGGTGTTCAGTAACCGGCCA
 GGGCGAGGTATGTGTAAGTGCCAAGGTGCCAG
 TAGTACCGAGACCGAAAGAAGTATACAGGCGT
 TAGATCAAGTTTCAGGTGCACGTCGGTGAACC
 AATCCACCAGCTCCACGTGCAATGTTGGCCTA

Пример Вывода:

 TCTCGGGG
 CCAAGGTG
 TACAGGCG
 TTCAGGTG
 TCCACGTG

я следовал псевдокоду, насколько мне было известно. Вот мой код:

def BuildProfileMatrix(dnamatrix):
    ProfileMatrix = [[1 for x in xrange(len(dnamatrix[0]))] for x in xrange(4)]
    indices = {'A':0, 'C':1, 'G': 2, 'T':3}
    for seq in dnamatrix:
    for i in xrange(len(dnamatrix[0])):            
        ProfileMatrix[indices[seq[i]]][i] += 1
    ProbMatrix = [[float(x)/sum(zip(*ProfileMatrix)[0]) for x in y] for y in ProfileMatrix]
    return ProbMatrix
def ProfileRandomGenerator(profile, dna, k, i):
    indices = {'A':0, 'C':1, 'G': 2, 'T':3}
    score_list = []
    for x in xrange(len(dna[i]) - k + 1):
        probability = 1
        window = dna[i][x : k + x]
    for y in xrange(k):
        probability *= profile[indices[window[y]]][y]
    score_list.append(probability)
    rnd = uniform(0, sum(score_list))
    current = 0
    for z, bias in enumerate(score_list):
        current += bias
        if rnd <= current:
            return dna[i][z : k + z]
def score(motifs):
    ProfileMatrix = [[0 for x in xrange(len(motifs[0]))] for x in xrange(4)]
    indices = {'A':0, 'C':1, 'G': 2, 'T':3}
    for seq in motifs:
        for i in xrange(len(motifs[0])):            
            ProfileMatrix[indices[seq[i]]][i] += 1
    score = len(motifs)*len(motifs[0]) - sum([max(x) for x in zip(*ProfileMatrix)])
    return score
from random import randint, uniform    
def GibbsSampler(k, t, N):
     dna = ['CGCCCCTCTCGGGGGTGTTCAGTAACCGGCCA',
    'GGGCGAGGTATGTGTAAGTGCCAAGGTGCCAG',
    'TAGTACCGAGACCGAAAGAAGTATACAGGCGT',
    'TAGATCAAGTTTCAGGTGCACGTCGGTGAACC',
    'AATCCACCAGCTCCACGTGCAATGTTGGCCTA']
    Motifs = []
    for i in [randint(0, len(dna[0])-k) for x in range(len(dna))]:
        j = 0
        kmer = dna[j][i : k+i]
        j += 1
        Motifs.append(kmer)
    BestMotifs = []
    s_best = float('inf')
    for i in xrange(N):
        x = randint(0, t-1)
    Motifs.pop(x)
    profile = BuildProfileMatrix(Motifs)
    Motif = ProfileRandomGenerator(profile, dna, k, x)
    Motifs.append(Motif)
    s_motifs = score(Motifs)
    if s_motifs < s_best:
        s_best = s_motifs
        BestMotifs = Motifs
return [s_best, BestMotifs]

k, t, N =8, 5, 100            
best_motifs = [float('inf'), None]

# Repeat the Gibbs sampler search 20 times.
for repeat in xrange(20):
    current_motifs = GibbsSampler(k, t, N)
    if current_motifs[0] < best_motifs[0]:
        best_motifs = current_motifs
# Print and save the answer.
print 'n'.join(best_motifs[1])            

к сожалению, мой код никогда не дает тот же результат, что и решенный пример. Кроме того, при попытке отладки код я обнаружил, что получаю странные оценки, которые определяют несоответствия между мотивами. Однако, когда я попытался запустить функцию score отдельно, она работала отлично.

каждый раз, когда я запускаю скрипт, выходные данные меняются, но в любом случае вот пример одного из выходов для ввода, присутствующего в коде:

пример вывода моего кода

TATGTGTA
TATGTGTA
TATGTGTA
GGTGTTCA
TATACAGG

не могли бы вы помочь мне отладить этот код?!! Я провел целый день, пытаясь понять, что не так. с ним, хотя я знаю, что это может быть какая-то глупая ошибка, которую я сделал, но мой глаз не смог уловить ее.

спасибо всем!!

1 ответов


наконец, я узнал, что было не так в моем коде! Это было в строке 54:

Motifs.append(Motif)

после случайного удаления одного из мотивов, а затем создания профиля из этих мотивов, а затем случайного выбора нового мотива на основе этого профиля, я должен был добавить выбранный мотив в том же положении перед удалением не добавляется в конец списка мотивов.

теперь правильный код:

Motifs.insert(x, Motif)

новый код работал так, как ожидалось.