我的26个数据文件(.txt)(每个染色体的估算基因型)如下所示:
CHR SNP1 SNP2 SNP3
1 3 1 2 3
1 3 0 2 1
1 0 0 1 0
1 0 3 3 1
1 1 1 0 2
CHR SNP1 SNP2 SNP3
2 1 1 2 2
2 0 3 1 1
2 0 0 1 0
2 0 3 3 2
2 3 2 0 1
如何以plink格式(.map和.ped)转换它们?
答案 0 :(得分:0)
我将在这里做一些假设。您没有指定基因型的“3”表示,因此我将其编码为Plink(0)的默认缺失基因型。我使用“R”和“A”作为“参考”和“替代”等位基因的简单缩写; plink可以很好地阅读这些字符。如果你需要它来做其他事情,你需要编辑下面的字典。
此脚本实质上转换输入的第一行以创建.map文件中所需的列。它读取第二行以获得染色体编号。第三列保留默认的虚拟值“0”,因为厘摩是未知的。
ped文件是通过将基因型从您的数值转换为我假设它们代表的(再次在python词典中定义)生成的,包括前六个必需列(有关详细信息,请参阅https://www.cog-genomics.org/plink2/formats#fam)。重要的是,FID只是重复IID,因为我不知道这里的相关性。 IID(个人ID)只是行号(第一行是ind_1,第二行是ind_2,等等。只要您的不同染色体文件的顺序相同,这就很好。表型设置为“缺失”值 - 9.下面显示的测试文件格式正常。
#!/usr/bin/env python
import sys
infile_name = sys.argv[1]
pedDict = {
"0" : "R R",
"1" : "R A",
"2" : "A A",
"3" : "0 0"
}
def convertToPlink(infile_name):
with open(infile_name, 'r') as infile:
header = infile.readline().rstrip().split()
chromosome = infile.readline().split()[0]
with open('chr_' + chromosome + '.map', 'w') as mapfile:
for POS in header[1:]:
mapfile.write("\t".join([chromosome, chromosome+"_"+POS+"_SNP", "0", POS])+"\n")
with open(infile_name, 'r') as infile:
with open('chr_' + chromosome + '.ped', 'w') as pedfile:
id_index = 0
for line in infile:
if not line.startswith("CHR"):
id_index += 1
IID = "ind_" + str(id_index)
line = line.rstrip().split()
pedfile.write(" ".join([IID, IID, "0", "0", "0", "-9"]+[pedDict[genotype] for genotype in line][1:])+ "\n")
convertToPlink(infile_name)
测试输入:chr_1.txt
CHR 59 100 130 165
1 3 1 2 3
1 3 0 2 1
1 0 0 1 0
1 0 3 3 1
1 1 1 0 2
执行
convertToPlink.py chr_1.txt
产生两个与plink兼容的文件:
chr_1.map
1 1_59_SNP 0 59
1 1_100_SNP 0 100
1 1_130_SNP 0 130
1 1_165_SNP 0 165
chr_1.ped
ind_1 ind_1 0 0 0 -9 0 0 R A A A 0 0
ind_2 ind_2 0 0 0 -9 0 0 R R A A R A
ind_3 ind_3 0 0 0 -9 R R R R R A R R
ind_4 ind_4 0 0 0 -9 R R 0 0 0 0 R A
ind_5 ind_5 0 0 0 -9 R A R A R R A A