Я работаю над фармакогенетическим профилометром для стажировки. Для этого профилировщика мне нужно определить наиболее вероятные гаплотипы пациента. Что у меня есть на данный момент:
Определения гаплотипов из базы данных, содержащие следующее:
Это немного похоже на:
...
['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 (для экономии памяти при работе с данными) или другие подобные вещи.
Спасибо, что нашли время прочитать все это!
Я бы сказал и то, и другое, хотя я надеялся на хорошую третью стратегию, о которой я еще не думал.
вы ищете что-то вроде itertools.product? list(itertools.product('a', 'bc', 'de')) выведет [('a', 'c', 'd'), ('a', 'c', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e')]






Не совсем понятно, о чем вы спрашиваете, но, надеюсь, это направит вас на правильный путь.
Расширяясь до комментарий 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')
Непонятно, что вы имеете в виду под «получением всех комбинаций аллелей, составляющих гаплотипы, с минимальным количеством несовпадений», поэтому я не могу сказать, является ли это наиболее эффективным способом.
Я хочу получить гаплотипы, наиболее подходящие для данных моих пациентов. Как бы то ни было. Но поскольку данные, как обычно, довольно большие, использование декартовой системы координат, вероятно, займет слишком много памяти и времени.
Я не могу дать вам полного решения, но вот общий план шагов, которые я бы предпринял, чтобы решить эту проблему:
Большинство людей предлагают способы создания всех возможных комбинаций аллелей, но на самом деле это не поможет вам выяснить, какие гаплотипы лучше всего соответствуют вашим аллелям. Я бы посоветовал составить список всех возможных пар эталонные гаплотипы, затем сопоставить свои аллели с каждой из этих пар и выбрать лучшую пару. Должно быть достаточно легко пройти через SNP и присвоить оценку, основанную на том, сколько аллелей в этой позиции соответствует паре гаплотипов, т.е. если оба гаплотипа имеют A в позиции, A/A будет соответствовать обоим, а A/C будет соответствовать только одному. Просуммируйте SNP для каждой пары гаплотипов, возьмите пару с наивысшей оценкой, и все готово.
Вы спрашиваете, как наиболее эффективно генерировать четыре комбинации (я знаю, что это больше) из этого списка
['T-T', 'A-A', 'T-T', 'C-T', 'C-G', 'A-A', 'G-G','C-C']? Вам нужно каким-то образом отфильтровать элементы этого списка, и вам нужен наиболее эффективный способ их фильтрации?