p.adjust尊重整个数据框架

时间:2015-10-04 14:25:50

标签: r

我有一个p.value数据框,每列都有变量名。

enter image description here

我的代码是sapply(pval,p.adjust,method="fdr")

此代码返回每列的qvalue调整基数,这意味着基于每列的p等级然后进行调整。

如何针对整个数据框执行fdr,这意味着p在所有数据中排名?

3 个答案:

答案 0 :(得分:5)

这可能不是最有效的方式,因为它需要大量的转换,但对于小型data.frames应该没问题:

示例数据(假设p值的数据帧):

set.seed(100)
pval <- data.frame(a=runif(100), b=runif(100))

现在,为了计算调整后的p值,我使用magrittr包只是为了让它更容易阅读。你基本上可以使用嵌套函数:

library(magrittr)
pval %>% 
     as.matrix %>% 
     as.vector %>% 
     p.adjust(method='fdr') %>% 
     matrix(ncol=2)

基本上,通过上述方法,您可以将data.frame转换为矩阵,然后转换为矢量,然后根据所有值调整p值,然后重新构建矩阵。

上述内容可以用基数R写成:

matrix(p.adjust(as.vector(as.matrix(pval)), method='fdr'),ncol=2)

答案 1 :(得分:0)

保留行名和列名的另一种方法是将平方矩阵转换为长矩阵,计算padj,然后将其转换回来:

longPVal=t(data.frame(row.names = c('G1','G2','R','P'), stringsAsFactors = F))

for(rr in rownames(pval)){ #Convert to long format (maybe MELT helps here?)
  for(cc in colnames(pval)){
    longPVal=rbind(fullSpear,c(rr,cc,dat1[rr,cc],pval[rr,cc]))
  }
}
longPVal[,'ADJP']=p.adjust(longPVal[,'P'], method = 'BH') #Correction

out=data.frame(stringsAsFactors = F) #Rebuild the squared matrix of adjP
for(rr in rownames(pval)){
  for(cc in rownames(pval)){
    rowdat=longPVal[which(longPVal[,'G1']==rr & fullSpear[,'G2']==cc),]
    out[rr,cc]=rowpos['ADJP']
  }
}

答案 2 :(得分:-2)

我遇到过这个问题。

检查p.adjust的用法,如下所示 p.adjust(p, method = p.adjust.methods, n = length(p))

实际上,我们可以将“n”更改为矩阵的长度,因此,一个简单的应用应该以这种方式工作:

pvalue_adjusted_matrix <- apply(pvalue,2,p.adjust,method="fdr", n = length(pvalue))