Метод получения всех возможных комбинаций генотипов для группы SNP - PullRequest
0 голосов
/ 03 октября 2018

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

SNP      A1         A2
SNP1      A          T
SNP2      C          G
SNP3      T          A

Я хочу начать с создания списка всех возможных перестановок / комбинаций генотипа этих трех SNP, например:

SNP1 SNP2 SNP3
  AA   CC   TT
  AA   CC   TA
  AA   CC   AA
  AA   CG   TT
  AA   CG   TA
  AA   CG   AA
  AA   GG   TT
  AA   GG   TA
  AA   GG   AA
  ...

И так далее, так как я ожидаю, что будет 3 ^ 3 = 27 возможных комбинаций.

Здесь я надеюсь расширить это до моей полной группы из ~ 20 SNP.Какой хороший способ сделать это, в Python или даже в R?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вот решение в R для предоставленного вами примера:

# Alleles for each SNP
alleles <- data.frame(
  A1 = c("A", "C", "T"),
  A2 = c("T", "G", "A"),
  row.names = paste0("SNP", 1:3)
)

# Get the three possible genotypes for each SNP (diallelic loci)
genotypes <- apply(alleles, 1, function(x) {
  paste0(x[c(1, 1, 2)], x[c(1, 2, 2)])
})  

# Generate all possible combinations
expand.grid(as.data.frame(genotypes))

output

   SNP1 SNP2 SNP3
1    AA   CC   TT
2    AT   CC   TT
3    TT   CC   TT
4    AA   CG   TT
5    AT   CG   TT
6    TT   CG   TT
7    AA   GG   TT
8    AT   GG   TT
9    TT   GG   TT
10   AA   CC   TA
11   AT   CC   TA
12   TT   CC   TA
13   AA   CG   TA
14   AT   CG   TA
15   TT   CG   TA
16   AA   GG   TA
17   AT   GG   TA
18   TT   GG   TA
19   AA   CC   AA
20   AT   CC   AA
21   TT   CC   AA
22   AA   CG   AA
23   AT   CG   AA
24   TT   CG   AA
25   AA   GG   AA
26   AT   GG   AA
27   TT   GG   AA
0 голосов
/ 03 октября 2018

Мы можем использовать две функции из стандартного модуля itertools для генерации комбинаций.Мы используем combinations_with_replacement для построения 3 пар из SNP.

from itertools import combinations_with_replacement

def pairs(alleles):
    return [u + v for u, v in combinations_with_replacement(alleles, 2)]

print(pairs('TA'))

output

['TT', 'TA', 'AA']

Затем мы используем product для построения всех комбинаций из списка SNP.

from itertools import combinations_with_replacement, product

def pairs(alleles):
    return [u + v for u, v in combinations_with_replacement(alleles, 2)]

all_snps = ('AT', 'CG', 'TA')

for t in product(*[pairs(snp) for snp in all_snps]):
    print(t)

output

('AA', 'CC', 'TT')
('AA', 'CC', 'TA')
('AA', 'CC', 'AA')
('AA', 'CG', 'TT')
('AA', 'CG', 'TA')
('AA', 'CG', 'AA')
('AA', 'GG', 'TT')
('AA', 'GG', 'TA')
('AA', 'GG', 'AA')
('AT', 'CC', 'TT')
('AT', 'CC', 'TA')
('AT', 'CC', 'AA')
('AT', 'CG', 'TT')
('AT', 'CG', 'TA')
('AT', 'CG', 'AA')
('AT', 'GG', 'TT')
('AT', 'GG', 'TA')
('AT', 'GG', 'AA')
('TT', 'CC', 'TT')
('TT', 'CC', 'TA')
('TT', 'CC', 'AA')
('TT', 'CG', 'TT')
('TT', 'CG', 'TA')
('TT', 'CG', 'AA')
('TT', 'GG', 'TT')
('TT', 'GG', 'TA')
('TT', 'GG', 'AA')
...