Энтропия последовательностей

Могут ли мне помочь исправить мой код? У меня есть 3 последовательности

 seq1='AATC'
 seq2='GCCT'
 seq3='ATCA'

Я хочу вычислить энтропию трех последовательностей, ее формула:

Entropy (A[:][i])= - ∑  p_ia log( p_ia)
p_ia = C_ia /∑  C_ia'

где p_ia - это вероятность появления буквы a в столбце i, а C_ia - это номер буквы a в столбце A [:] [i]

пример: из трех приведенных выше последовательностей: первый столбец: a 'принимает значения C, A и C, здесь C_ia' = 3, если a = 'C' C_ia = 2, поэтому p_ia = 2/3,

if a='A' C_ia=1 so p_ia=1 /3

Entropy (A[:][0])=-(2/3 log (2/3)+1/3 log(1/3))

то же самое для остальных столбцов. Я пробовал это: эта функция вычисляет частоту появления каждой буквы в заданной строке, а l - длина строки, которая означает l=∑ C_ia'.

def occ(source):
    occ={}
    l=0
    for e in source:
        l +=1
        if e not in occ:
            occ[e]=0
        occ[e]+=1
    return (l,occ)

пример:

>>> source='aaazzzedc'
>>> occ(source)
(9, {'z': 3, 'c': 1, 'a': 3, 'd': 1, 'e': 1})

тогда это функция энтропии:

def entropy(occ,l):
    elist=[]
    for v in occ.values():
        c=v/l
        elist.append(-c *math.log(c, 2))
    return sum(elist)

пример:

>>> (l,h)=occ(source)
>>> entropy(h,l)
2.113283334294875

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

>>> source=[occ(t) for t in zip(seq1,seq2,seq3)]
>>> source
[(3, {'A': 2, 'G': 1}), (3, {'C': 1, 'A': 1, 'T': 1}), (3, {'C': 2, 'T': 1}), (3, {'C': 1, 'A': 1, 'T': 1})]

как я могу вычислить энтропию этих последовательностей? это дает по первому столбцу:

(3, {'A': 2, 'G': 1})
2/3 * log(2/3)+ 1/3 * log (1/3)

Как мне записать энтропию всех столбцов?


person user3184809    schedule 14.01.2014    source источник
comment
В чем твоя проблема? У вас есть функция для вычисления энтропии и (из предыдущих вопросов) у вас есть структура для итерации ваших данных. Какой частью вы не можете управлять?   -  person jonrsharpe    schedule 14.01.2014
comment
для этого: [(3, {'A': 2, 'G': 1}), (3, {'C': 1, 'A': 1, 'T': 1}), (3, { 'C': 2, 'T': 1}), (3, {'C': 1, 'A': 1, 'T': 1})]. как я могу рассчитать его энтропию?   -  person user3184809    schedule 14.01.2014
comment
Код в вашем вопросе демонстрирует, что вы можете выполнять итерацию, используя цикл for (for v in occ.values():), распаковывать кортежи ((l,h)=occ(source)) и вызывать функции (entropy(h,l)). Что еще нужно делать?   -  person jonrsharpe    schedule 14.01.2014
comment
Хорошо, я пробую свой код на простом примере. source = 'aaazzzedc', но я не знаю, как применить код к трем последовательностям.   -  person user3184809    schedule 14.01.2014
comment
Как вы можете не знать, как это сделать ?! Прочтите мои ответы на свои предыдущие вопросы. Там уже есть код, который выполняет итерацию по всем последовательностям. Вам просто нужно вставить вызовы ваших opp и entropy функций в нужное место и создать новые списки (например, entropies = [] для хранения результатов.   -  person jonrsharpe    schedule 14.01.2014
comment
ОК. Спасибо. Я пробую это, и все работает правильно .>> entropies=[]. >>> for position in zip(seq1,seq2,seq3): (l,h)=occ(position) m=entropy(h,l) entropies.append(m)   -  person user3184809    schedule 14.01.2014
comment
Вот так! Проблема: если у вас есть аргументы для entropy в том же порядке, что и возвращаемые значения из occ, вы можете сократить три строки до одной (entropies.append(entropy(*occ(position))) - обратите внимание на *).   -  person jonrsharpe    schedule 14.01.2014