将PLINK二进制文件转换为python数据帧



我正在使用一个遗传数据集(大约23000个样本和300000个SNPs作为特征(。我得到了PLINK二进制格式的文件(.bed,.bim,.fam(。下面列出了它们的大小:

  • .床文件:1.6G
  • .bim文件=9.3M
  • .fam文件=737K

我的目标是将它们转换为(panda(数据帧,然后用Python开始我的预测分析(这是一个机器学习项目(。

有人建议我将所有3个二进制文件合并为一个vcf(变体调用格式(文件。结果(vcf文件(是使用PLINK软件的26G文件。有一些python包和代码可以将vcf文件转换为panda数据帧,但我的远程系统内存有限(15Gi(。由于数据集的性质,我只能使用大学的计算机。

我的问题是,考虑到我的所有限制,我如何将数据集转换为可用于机器学习的数据帧?如果你需要更多细节,请告诉我。

为什么要将其转换为VCF?

不幸的是,我认为您无法将整个数据集加载到Python中。如果每个基因型为2位,则300000个变体的23000个样本约为1.7GB;然而,我怀疑你的机器学习算法会期望32位或64位的浮点数字。使用64位浮点,您将需要55 GB。

您可以尝试使用Python库Hail(免责声明:我是Hail的维护者(。您可以逐行流式传输数据。

import hail as hl
mt = hl.import_plink(bed='...bed', bim='...bim', fam='...fam')
mt.show()

你可以使用Hail过滤到一组较小的有用变体,然后将它们转储到你的机器学习系统中。例如,您可以过滤到相对罕见的变体:

mt = hl.variant_qc(mt)
mt = mt.filter_rows(
(mt.variant_qc.AF[0] < 0.1) | (mt.variant_qc.AF[0] > 0.9)
)
import numpy as np
dataset = np.array(hl.float(mt.GT.n_alt_alleles()).collect())

最新更新