Как я могу выбрать наиболее подходящий шаблон (гаплотип) для моих данных? Python 2.7

Я работаю над фармакогенетическим профилометром для стажировки. Для этого профилировщика мне нужно определить наиболее вероятные гаплотипы пациента. Что у меня есть на данный момент:

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

  • Имя гаплотипа
  • список аллелей / SNP, составляющих гаплотип
  • * отдельно - Расположение (хромосома, старт, стоп) для каждого аллеля / SNP

Это немного похоже на:

...
['UGT1A1*16', 'T;A;T;C;G;A;G;C']
['UGT1A1*17', 'T;A;T;C>T;G;A;G;C']
...

где каждый аллель (например, каждый A, T, C или G) имеет такое расположение, как: [6, 18130687, 18130687], который представляет собой [chromosome, start, stop], и, например, C>G, означающий, что исходной позицией является C, но разница для этого определения гаплотипа состоит в том, что это G вместо C.

Затем я проверил все эти места, чтобы увидеть, какие аллели у пациента есть в этих местах. Поскольку у человека есть два аллеля для каждого местоположения, я получаю что-то вроде следующего:

UGT1A1 = ['T-T', 'A-A', 'T-T', 'C-T', 'C-G', 'A-A', 'G-G','C-C']

Формат: '<allele_1>-<allele_2>' и аллель_1 и аллель_2 могут быть заменены друг на друга. (Я не знаю, какие аллели принадлежат друг другу, так как у меня нет информации о фазах)

Теперь мне нужно наиболее оптимальным образом сопоставить аллели, которые я наблюдал у пациентов. Каждый аллель в каждой паре должен использоваться, и его можно использовать только один раз. В моем примере у меня разные аллели в 4-й и 5-й паре 'C-T' and 'C-G', и поэтому я могу создать 4 разных гаплотипа, например:

[T, A, T, C, C, A, G, C]
[T, A, T, C, G, A, G, C]
[T, A, T, T, C, A, G, C]
[T, A, T, T, G, A, G, C] <-- the same as UGT1A1*17

Скажем, теперь я бы выбрал один набор аллелей как TATTGAGC, другой должен быть TATCCAGC. Первый такой же, как гаплотип для UGT1A1 * 17, но другой, имеющий «только» 7 из 8 аллелей, перекрывается с любым другим гаплотипом. Фактический набор данных намного больше, а длина аллеля гаплотипа может составлять более 200 аллелей, плюс иметь от 10 до 100 различных определений и, наконец, что не менее важно, существует около 60 различных генов (с каждым из этих определений гаплотипа снова).

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

Подсказки о том, как это сделать, приветствуются, например: Используйте dicts таким образом, как ... или выгрузите определенную информацию в базу данных sql (для экономии памяти при работе с данными) или другие подобные вещи.

Спасибо, что нашли время прочитать все это!

Вы спрашиваете, как наиболее эффективно генерировать четыре комбинации (я знаю, что это больше) из этого списка ['T-T', 'A-A', 'T-T', 'C-T', 'C-G', 'A-A', 'G-G','C-C']? Вам нужно каким-то образом отфильтровать элементы этого списка, и вам нужен наиболее эффективный способ их фильтрации?

e.s. 01.05.2018 14:57

Я бы сказал и то, и другое, хотя я надеялся на хорошую третью стратегию, о которой я еще не думал.

Nulnulzeven 01.05.2018 15:16

вы ищете что-то вроде itertools.product? list(itertools.product('a', 'bc', 'de')) выведет [('a', 'c', 'd'), ('a', 'c', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e')]

e.s. 01.05.2018 18:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
111
2

Ответы 2

Не совсем понятно, о чем вы спрашиваете, но, надеюсь, это направит вас на правильный путь.

Расширяясь до комментарий e.s., Но с помощью вспомогательной функции, чтобы сделать код более понятным, способ генерации всех гаплотипов:

from itertools import product

alleles = ['T-T', 'A-A', 'T-T', 'C-T', 'C-G', 'A-A', 'G-G','C-C']

def normalize(pair):
    a, b = pair.split('-')
    if a == b:
        return a
    else:
        return a + b

normalized_alleles = [normalize(pair) for pair in alleles]
for haplotype in product(*normalized_alleles):
    print(haplotype)

Это печатает:

('T', 'A', 'T', 'C', 'C', 'A', 'G', 'C')
('T', 'A', 'T', 'C', 'G', 'A', 'G', 'C')
('T', 'A', 'T', 'T', 'C', 'A', 'G', 'C')
('T', 'A', 'T', 'T', 'G', 'A', 'G', 'C') 

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

Я хочу получить гаплотипы, наиболее подходящие для данных моих пациентов. Как бы то ни было. Но поскольку данные, как обычно, довольно большие, использование декартовой системы координат, вероятно, займет слишком много памяти и времени.

Nulnulzeven 03.05.2018 11:51

Я не могу дать вам полного решения, но вот общий план шагов, которые я бы предпринял, чтобы решить эту проблему:

Большинство людей предлагают способы создания всех возможных комбинаций аллелей, но на самом деле это не поможет вам выяснить, какие гаплотипы лучше всего соответствуют вашим аллелям. Я бы посоветовал составить список всех возможных пар эталонные гаплотипы, затем сопоставить свои аллели с каждой из этих пар и выбрать лучшую пару. Должно быть достаточно легко пройти через SNP и присвоить оценку, основанную на том, сколько аллелей в этой позиции соответствует паре гаплотипов, т.е. если оба гаплотипа имеют A в позиции, A/A будет соответствовать обоим, а A/C будет соответствовать только одному. Просуммируйте SNP для каждой пары гаплотипов, возьмите пару с наивысшей оценкой, и все готово.

Другие вопросы по теме