我正在尝试为数据帧计算Spearman相关性和p值。为了获得更好的p值近似值,我必须坚持使用pspearman软件包。我期望得到与rcorr()
函数相似的结果。但是在逐行执行pspearman:spearman.test()
时遇到问题。
我的数据框包含5000行(基因)和200列(点)。我想获得这5000 * 5000个基因-基因对的相关矩阵和p值矩阵。仅当两个基因在两个以上的点都不是NA时,才计算相关性。
我可以通过循环来实现,但是对于我的大数据集来说太慢了。尝试使用apply(),sapply(),mapply()
来提高速度时遇到问题。
这是我尝试过的:
data = data.frame(matrix(rbinom(10*100000, 50, .5), ncol=200))
dim(data) #5000, 200
rownames(data) <- paste("gene", 1:5000, sep="")
colnames(data) <- paste("spot",1:200,sep='')
library(pspearman)
spearFunc = function(x,y=data) {
df = rbind(x,y)
# Check the number of complete spots.There are no NAs in this set.
complete = sum(!(is.na(x)) & !(is.na(y)))
if (complete >=2 ) {
pspearman::spearman.test(as.numeric(x),as.numeric(y))
# This function returns a list containing 8 values, like pvalue,correlation
}}
pair.all1 = mapply(spearFunc,data,data)
dim(pair.all1)
# 8 200, 200 is the number of columns
pair.all2 = apply(data,1,spearFunc)
哪个会导致错误:
pspearman :: spearman.test(as.numeric(x),as.numeric(y))中的错误: (列表)对象不能强制输入“ double”
我希望通过apply()对每个基因对使用spearman.test
spearman.test(data[gene1],data[gene1])
spearman.test(data[gene1],data[gene2])
....
spearman.test(data[gene1],data[gene5000])
...
spearman.test(data[gene5000],data[gene5000])
它应返回8行和25,000,000列(5000 * 5000个基因对)的数据框。
是否可以在apply()中使用apply()达到我的目的?
谢谢!
答案 0 :(得分:0)
请考虑从java.util.concurrent.ForkJoinTask#status
和row.names
创建基因的成对组合,然后通过定义的函数遍历成对列表。确保从combn
逻辑返回NA
结构,以避免矩阵输出中出现if
。
但是,请注意,5,000个基因(NULL
)的成对排列结果非常高,达到12,497,500个元素!因此,choose(5000, 2)
(循环本身)的性能可能与sapply
没什么不同。研究并行化迭代。
for
测试
上面已使用少量数据集样本(50个观测点,20个变量)对gene_combns <- combn(row.names(data), 2, simplify = FALSE)
spear_func <- function(x) {
# EXTRACT ROWS BY ROW NAMES
row1 <- as.numeric(data[x[1],])
row2 <- as.numeric(data[x[2],])
# Check the number of complete spots.There are no NAs in this set.
complete = sum(!(is.na(x)) & !(is.na(y)))
if (complete >=2 ) {
pspearman::spearman.test(row1, row2)
} else {
c(statistic=NA, parameter=NA, p.value=NA, estimate=NA,
null.value=NA, alternative=NA, method=NA, data.name=NA)
}
}
pair.all2 <- sapply(gene_combns, spear_func)
(与spearman.test完全相同的输入参数和输出列表,但更准确的cor.test
)进行了测试:
p-value