我有一个p.value数据框,每列都有变量名。
我的代码是sapply(pval,p.adjust,method="fdr")
。
此代码返回每列的qvalue调整基数,这意味着基于每列的p等级然后进行调整。
如何针对整个数据框执行fdr
,这意味着p在所有数据中排名?
答案 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))