Как рассчитать частоту элементов для попарных сравнений списков в Python?

#python #list #for-loop #dictionary #frequency

#python #Список #for-цикл #словарь #частота

Вопрос:

У меня есть образец, сохраненный в следующем списке

  sample = [AAAA,CGCG,TTTT,AT-T,CATC]
 

.. Чтобы проиллюстрировать проблему, я обозначил их как «Наборы» ниже

 Set1 AAAA
Set2 CGCG
Set3 TTTT
Set4 AT-T
Set5 CATC
 
  1. Исключите все наборы, где каждый элемент в наборе идентичен самому себе.

Вывод:

  Set2 CGCG
 Set4 AT-T
 Set5 CATC
 
  1. Выполните попарное сравнение между наборами. (Set2 v Set4, Set 2v Set5, Set4 v Set5)
  2. Каждое попарное сравнение может иметь только два типа комбинаций, если нет, то эти попарные сравнения исключаются. например,
     Set2    Set5
    C       C
    G       A
    C       T 
    G       C
     

Здесь существует более двух типов пар (CC), (GA), (CT) и (GC). Таким образом, это попарное сравнение не может произойти.

Каждое сравнение может иметь только 2 комбинации из (AA, GG, CC, TT, AT, TA, AC, CA, AG, GA, GC, CG, GT, TG, CT, TC) … в основном все возможные комбинации ACGT, где порядок имеет значение.

В приведенном примере найдено более 2 таких комбинаций.

Следовательно, Set2 и Set4; Set4 и Set5 не могут быть рассмотрены.Таким образом, остаются только пары:

 Output
Set2 CGCG
Set4 AT-T
 
  1. В этом попарном сравнении удалите любой элемент с «-» и соответствующий ему элемент в другой паре
     Output    
    Set2 CGG
    Set4 ATT
     
  2. Вычислите частоту элементов в Set2 и Set4. Рассчитать частоту встречаемости типов пар в наборах (пары CA и GT)
     Output
    Set2 (C = 1/3, G = 2/3)
    Set4 (A = 1/3, T = 2/3)
    Pairs (CA = 1/3, GT = 2/3)
     
  3. Вычислить float(a) = (Пары) — (Set2) * (Set4) для соответствующего элемента (достаточно любой пары)
     eg. For CA pairs, float (a) = (freq of CA pairs) - (freq of C) * (freq of A)
     

ПРИМЕЧАНИЕ: если пара представляет собой AAAC и CCCA, частота C будет равна 1/4, т.Е. Это частота базы по одной из пар

  1. Вычислить
     float (b) = float(a)/ (freq of C in CGG) * (freq G in CGG) * (freq A in ATT) * (ATT==> freq of T in ATT)
     
  2. Повторите это для всех попарных сравнений

например.

 Set2 CGCG
Set4 AT-T
Set6 GCGC
 

Set2 v Set4, Set2 v Set6, Set4 v Set6

Мой незаконченный код до сих пор: ** Я бы предпочел, чтобы все предлагаемые коды были в стандартном формате for-loop, а не в понимании **

 #Step 1
for i in sample: 
    for j in range(i):
        if j = j 1    #This needs to be corrected to if all elements in i identical to each other i.e. if all "j's" are the same
                        del i 
    #insert line of code where sample1 = new sample with deletions as above

#Step 2
    for i,i 1 in enumerate(sample):
    #Step 3
    for j in range(i):
        for k in range (i 1):
        #insert line of code to say only two types of pairs can be included, if yes continue else skip
            #Step 4
            if j = "-" or k = "-":
                #Delete j/k and the corresponding element in the other pair
                #Step 5
                count_dict = {}
                    square_dict = {}
                for base in list(i):
                    if base in count_dict:
                            count_dict[base]  = 1
                    else:
                            count_dict[base] = 1
                    for allele in count_dict:
                    freq = (count_dict[allele] / len(i)) #frequencies of individual alleles
                    #Calculate frequency of pairs 
                #Step 6
                No code yet
 

Комментарии:

1. Я не понимаю шаг # 3. Как сделать CGCG и AT-T получить эти пары?

2. Каждое сравнение может иметь только 2 комбинации из (AA, GG, CC, TT, AT, TA, AC, CA, AG, GA, GC, CG, GT, TG, CT, TC) … в основном все возможные комбинации ACGT, где порядок имеет значение. В приведенном примере найдено более 2 таких комбинаций. Следовательно, Set2 и Set4; Set4 и Set5 не могут быть рассмотрены.

3. Не могли бы вы, пожалуйста, привести пример того, что вы подразумеваете под «частотой c» на шаге для пары AAAC и CCCA? Будет ли это 1/4 или 1/2? То есть, это частота базы по одной паре или обеим парам?

4. Каким должен быть base1? Также, как совпадают set2 и set4, учитывая, что у них нет совпадающих букв?

5. Я исправил оператор «base1». Set2 и Set4 считаются совпадающими, поскольку они соответствуют критериям, что, у него есть только 2 уникальные комбинации CA и GT ..в то время как Set2 v Set5 имеют (CC), (GA), (CT) и (GC) (более 2 уникальных пар)

Ответ №1:

Я думаю, это то, что вы хотите:

 from collections import Counter

# Remove elements where all nucleobases are the same.
for index in range(len(sample) - 1, -1, -1):
    if sample[index][:1] * len(sample[index]) == sample[index]:
        del sample[index]

for indexA, setA in enumerate(sample):
    for indexB, setB in enumerate(sample):
        # Don't compare samples with themselves nor compare same pair twice.
        if indexA <= indexB:
            continue

        # Calculate number of unique pairs
        pair_count = Counter()
        for pair in zip(setA, setB):
            if '-' not in pair:
                pair_count[pair]  = 1

        # Only analyse pairs of sets with 2 unique pairs.
        if len(pair_count) != 2:
            continue

        # Count individual bases.
        base_counter = Counter()
        for pair, count in pair_count.items():
            base_counter[pair[0]]  = count
            base_counter[pair[1]]  = count

        # Get the length of one of each item in the pair.
        sequence_length = sum(pair_count.values())

        # Convert counts to frequencies.
        base_freq = {}
        for base, count in base_counter.items():
            base_freq[base] = count / float(sequence_length)

        # Examine a pair from the two unique pairs to calculate float_a.
        pair = list(pair_count)[0]
        float_a = (pair_count[pair] / float(sequence_length)) - base_freq[pair[0]] * base_freq[pair[1]]

        # Step 7!
        float_b = float_a / float(base_freq.get('A', 0) * base_freq.get('T', 0) * base_freq.get('C', 0) * base_freq.get('G', 0))
 

Или, более питонически (с пониманием списка / dict, которое вам не нужно):

 from collections import Counter

BASES = 'ATCG'

# Remove elements where all nucleobases are the same.
sample = [item for item in sample if item[:1] * len(item) != item]

for indexA, setA in enumerate(sample):
    for indexB, setB in enumerate(sample):
        # Don't compare samples with themselves nor compare same pair twice.
        if indexA <= indexB:
            continue

        # Calculate number of unique pairs
        relevant_pairs = [(elA, elB) for (elA, elB) in zip(setA, setB) if elA != '-' and elB != '-']
        pair_count = Counter(relevant_pairs)

        # Only analyse pairs of sets with 2 unique pairs.
        if len(pair_count) != 2:
            continue

        # setA and setB as tuples with pairs involving '-' removed.
        setA, setB = zip(*relevant_pairs)

        # Get the total for each base.
        seq_length = len(setA)

        # Convert counts to frequencies.
        base_freq = {base : count / float(seq_length) for (base, count) in (Counter(setA)   Counter(setB)).items()}

        # Examine a pair from the two unique pairs to calculate float_a.
        pair = list(pair_count)[0]
        float_a = (pair_count[pair] / float(seq_length)) - base_freq[pair[0]] * base_freq[pair[1]]

        # Step 7!
        denominator = 1
        for base in BASES:
            denominator *= base_freq.get(base, 0)

        float_b = float_a / denominator
 

Комментарии:

1. В # Remove elements, где все нуклеиновые основания одинаковы, вы предполагаете, что образец будет иметь одинаковую структуру только из 4 оснований. Он может иметь n количество оснований. Я думаю, было бы лучше добавить этот sample1 = [] для i в sample: if len(set(i)) > 1: sample1.append(i)

2. (2) Я крайне сожалею о путанице, но что касается вашего более раннего вопроса, когда есть AAAC и CCCA, Он должен быть 1/4, т.Е. Частота над одной парой.

3. Кроме того, я получаю эту ошибку при компиляции float_b = float_a / (base_freq.get(‘A’, 0) * base_freq.get(‘T’, 0) * base_freq.get(‘C’, 0) * base_freq.get(‘G’, 0)) Ошибка нулевого разделения: целое числоделение или по модулю на ноль

4. Комментарий 1: Я почти уверен, что правильно понял — если вся строка состоит из первого символа (если он существует — код работает для строк нулевой длины), удалите его.

5. Комментарий # 3: У меня это как инициализатор для sample : sample = ['AAAA', 'CGCG', 'TTTT', 'AT-T', 'CATC'] . Возможно, у вас есть что-то другое?