【发布时间】:2020-06-18 18:24:36
【问题描述】:
我有一个大的稀疏矩阵(我们称之为matrix),其中行是特征,列是样本。每列/样本属于 6 个组中的 1 个。我从每个组中随机抽取一些样本,并将它们所属的索引存储在原始矩阵中。
astro_index <- Map(sample,row_index, num_sample)[1]
endo_index <- Map(sample,row_index, num_sample)[2]
micro_index <- Map(sample,row_index, num_sample)[3]
neuron_index <- Map(sample,row_index, num_sample)[4]
oligo_index <- Map(sample,row_index, num_sample)[5]
opc_index <- Map(sample,row_index, num_sample)[6]
目标是能够执行 Wilcox 检验并获得每个特征的 6 个组的所有组合的 p 值。最大的问题是我有超过 30,000 个功能要测试 6 个组的所有组合(因此对 30,000 多个功能中的每一个进行 15 次比较)。
所以我有两种当前的方法。 第一个使用 apply 函数,并且只进行一次比较(这里是 astro 和神经元组)。这种方法的缺点是我遇到了内存问题,它一次只能进行 1 次比较。我必须再写 14 次才能得到所有可能的比较。
store_p <- apply(matrix,1,function(x) {wilcox.test(x[astro_index],x[neuron_index])$p.value })
second 方法使用 for 循环遍历所有特征,但我利用组合和数据框来计算所有组合的 p 值,但一次只有一个特征。这种方法确实很慢但是不会崩溃。
for (i in features){
df <- data.frame('Astro' = matrix[i,astro_index], 'Endo' = matrix[i,endo_index], 'Micro' = matrix[i,micro_index], 'Neuron' = matrix[i,neuron_index], 'Oligo' = matrix[i,oligo_index], 'OPC' = matrix[i,opc_index])
result <- combn(names(df), 2, FUN = function(x) paste(paste(x, collapse='-'), wilcox.test(df[,x[1]], df[,x[2]], paired = TRUE)$p.value, sep=" : "))
hold_list <- append(hold_list, list(result))
}
让您了解result 的外观。这是result的示例输出
> result
[1] "Astro-Endo : 0.115331575924872" "Astro-Micro : 0.935664046257304" "Astro-Neuron : 0.0271849565394441"
[4] "Astro-Oligo : 0.00147694402781699" "Astro-OPC : 0.0476580762532988" "Endo-Micro : 0.297672151508384"
[7] "Endo-Neuron : 2.38134038927696e-06" "Endo-Oligo : 0.0323129112432441" "Endo-OPC : 0.451258974150342"
[10] "Micro-Neuron : 0.000143621746738224" "Micro-Oligo : 0.0178171887595787" "Micro-OPC : 0.0692129715131915"
[13] "Neuron-Oligo : 6.68255453156116e-10" "Neuron-OPC : 6.201108273594e-07" "Oligo-OPC : 0.142213241936393"
理想情况下,我希望这两种方法中的两全其美,并采用更高效的流程来计算这些测试。此外,如果有人建议设计一个不同的数据框以一种方式解决此任务,我也将不胜感激。
编辑
我意识到我没有说清楚,但result 仅适用于所有组合的一个功能。我有一个 for 循环,以便它遍历所有功能。本质上,应该为所有特征和所有组合计算一个 p 值。
【问题讨论】:
标签: r dataframe optimization statistics memory-efficient