使用 numpy/h5py 的高效内存 Benjamini-Hochberg FDR 校正
Memory-efficient Benjamini-Hochberg FDR correction using numpy/h5py
我正在尝试使用 Benjamini & Hochberg 的方法计算一组经过 FDR 校正的 p 值。但是,我尝试 运行 这个矢量包含超过 100 亿个值。
给定数据量,正常 method from statsmodel's multicomp 模块很快 运行s 内存不足。查看该函数的源代码,它似乎在内存中创建了多个长度为 100 亿的向量,这显然是行不通的,即使在具有 100GB RAM 的机器上也是如此。
有没有办法做到这一点,理想情况下不必将整个向量保存在内存中?特别是我想知道是否有可能以允许它 运行 使用 h5py 数据结构在磁盘上的方式重新实现 BH。
或任何其他建议?
以防其他人偶然发现:
我解决这个问题的方法是首先提取所有有可能超过 FDR 校正阈值的 p 值(我使用 1e-5)。内存消耗不是问题,因为我可以遍历磁盘上的 p 值列表。
这给了我一组约 400k 的最低 p 值。然后我手动将 BH 过程应用于这些 p 值,但将原始测试数插入到公式中。由于 BH 是一个升压过程,这(据我所知)相当于将 BH 应用于整个向量,而不需要我对 100 亿个值进行排序。
我正在尝试使用 Benjamini & Hochberg 的方法计算一组经过 FDR 校正的 p 值。但是,我尝试 运行 这个矢量包含超过 100 亿个值。
给定数据量,正常 method from statsmodel's multicomp 模块很快 运行s 内存不足。查看该函数的源代码,它似乎在内存中创建了多个长度为 100 亿的向量,这显然是行不通的,即使在具有 100GB RAM 的机器上也是如此。
有没有办法做到这一点,理想情况下不必将整个向量保存在内存中?特别是我想知道是否有可能以允许它 运行 使用 h5py 数据结构在磁盘上的方式重新实现 BH。
或任何其他建议?
以防其他人偶然发现:
我解决这个问题的方法是首先提取所有有可能超过 FDR 校正阈值的 p 值(我使用 1e-5)。内存消耗不是问题,因为我可以遍历磁盘上的 p 值列表。
这给了我一组约 400k 的最低 p 值。然后我手动将 BH 过程应用于这些 p 值,但将原始测试数插入到公式中。由于 BH 是一个升压过程,这(据我所知)相当于将 BH 应用于整个向量,而不需要我对 100 亿个值进行排序。