首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批次计算调整p值

批次计算调整p值
EN

Data Science用户
提问于 2020-07-08 18:37:50
回答 1查看 272关注 0票数 2

数据

为了简单起见,我提出以下方案:

  1. 我有两个DataFrames,一个带有基因,另一个带有miRNA (这是一个简单的例子,DF不是这样的),数据是连续的:
代码语言:javascript
复制
             Gene_1    Gene_2    Gene_3                                        
Patient_1    220.43    12,959    12,311
Patient_2    270.27    12,870    13,234
代码语言:javascript
复制
             miRNA_1   miRNA_2    miRNA_3                                        
Patient_1    220.43    12,959     12,311
Patient_2    270.27    12,870     13,234
  1. 我必须将所有基因与所有miRNAs (使用Pearson、Kendall或Spearman相关,没关系)进行关联,最终建立以下结构:
代码语言:javascript
复制
Gene     miRNA      Correlation  P-value        Adjusted P-value
Gen_1    miRNA_1    0,959        0.00311        0.00014
Gen_1    miRNA_2    -0,039       0.00311        0.00014
Gen_1    miRNA_3    -0,344       0.00311        0.00014
Gen_2    miRNA_1    0,1333       0.00311        0.00014
Gen_2    miRNA_2    0,877        0.00311        0.00014
...

问题

交叉连接的结果(全部针对all)可能导致具有数十亿行的DataFrame。要给出所需空间的维数,撇开基因和miRNAs的列,考虑3亿行的小结果,需要300000000 *(浮动pt + 64位p值+ 64位调整后的p值)=5GB左右。

为了优化内存的使用,我分批进行计算,问题在于调整后的p值,因为我使用了Benjamini & Hochberg (1995)的方法,函数R的p.adjust (使用Python包装器)需要完整的p值数组,这使我的内存耗尽。

是否有任何方法,从另一个库或其他类似的统计方法,p-值调整成批?

我已经尝试过FastLSU技术来过滤掉一些没有意义的p值,但据我所知,当我得到每一行的调整p值时,我需要知道所有的p值。如果我能得到每一行调整后的p值,我的问题就会得到解决,因为我可以将批处理的结果下载到磁盘,告别复杂的情况。

如果有人能在这个问题上说点什么,我将非常感激。

EN

回答 1

Data Science用户

回答已采纳

发布于 2020-07-10 17:44:00

你能进一步解释一下你是如何成批计算的吗?整个p值数组本身不应该大到导致内存问题.因此,您的主要问题似乎是,您试图将交叉连接的DF保存在内存中,并进行所需的计算。因此,以下是我的想法:

  • 如果您能够访问具有更多内存的集群,您可能能够以当前的方式解决这个问题。
  • 另一种解决方法是减少内存,并且可以在本地工作,但使用嵌套循环需要很长时间(见下文)。您还可以以中间方式编写结果,而不是在每个循环的末尾执行联合操作。之后,您可以将初始的DFS从内存中取出,然后加载所有中间结果并创建最终的df。
  • 您可以使用集群中前面的项目点的方法,这样会更好一些。
  • 如果您可以使用一个集群并将其并行化,那就更好了。这个问题很适合火花。
  • 如果您没有访问群集的权限,您仍然可以在您自己的计算机上并行处理它,这可能有助于提高速度。再一次,我认为如果你使用星火并在你的电脑上并行它,它会更快一些。

在这里,我将解释第一个要点,我认为它至少可以让您在没有内存问题的情况下获得最终的数据帧:我首先尝试将这个问题变成一个嵌套的数据帧列循环,在这个循环中,您可以找到每个基因的get >所有miRNAs,然后在计算q值并使用截止值之后将其子集化。然后,您将只存储在内存中的对已达到您的Q值阈值。我不建议尝试使用所有这些数据创建一个联合的DF,因为这将占用太多的内存。我为下面的循环写了伪代码。我觉得这会帮助你耗尽记忆,但是它还是会很慢。如果内存仍然不足,是否有可用的群集?同时,并行化也会更好。你可以用python写它,但是你有火花吗?如果您将继续使用“大数据”,我将尝试访问您所在机构的集群,或者使用AWS或其他方式支付费用。

我要用基因来称呼你的DF : geneDF,DF和microRNA mirnaDF。请记住,这是python伪代码,而且非常混乱。如果你觉得对你有用的话,我可以把它清理干净。我写得更清楚了。

代码语言:javascript
复制
top_adjusted_pairs = pd.DataFrame(columns=['gene', 'miRNA', 'qval'])
for i in range(len(geneDF)):
    # initialize array for the distances between all microRNAs with just gene X
    miRNA_geneX_pvals = []*len(microRNAsDF)
    geneCol = geneDF[i]
    for j in range(len(mirnaDF)):
         mirnaCol = mirnaDF[j]
         # compute distances and write pvalue into array
         pval = dist(geneCol, mirnaCol).pval
         miRNA_geneX_pvals[j] = [miRNA.name, gene.name, pval]
    # now that you have the array of distances between gene X and all miRNAs you can use multiple hypothesis correction. 
    qvals = adjust(miRNA_geneX_pvals['pval'])
    # pick q-val cut off
    top_mirna_geneX = miRNA_geneX_pvals[qvals<0.1]

top_adjusted_pairs.union(top_mirna_geneX)
         
        
```
代码语言:javascript
复制
票数 2
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/77399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档