У меня есть большая разреженная матрица (назовем ее matrix
), в которой строки - это функции, а столбцы - образцы. Каждый столбец / образец принадлежит 1 из 6 групп. Я случайным образом отбираю некоторую сумму из каждой группы и сохраняю, какой индекс они принадлежат в исходной матрице. 6 групп для каждой функции. Большая проблема в том, что у меня есть более 30 000 функций для тестирования во всех комбинациях из 6 групп (так что получается 15 сравнений для каждой из 30 000+ функций).
Итак, у меня есть два текущих метода. первый использует функцию apply и делает это только для одного сравнения (здесь астро и группа нейронов). Недостатком этого метода является то, что я сталкиваюсь с проблемами памяти, и он выполняет только одно сравнение за раз. Мне пришлось бы написать это еще 14 раз, чтобы получить все возможные сравнения.
store_p <- apply(matrix,1,function(x) {wilcox.test(x[astro_index],x[neuron_index])$p.value })
Метод second использует от l oop до go для всех функций, но я Воспользуйтесь преимуществом комбинации и кадра данных, чтобы вычислить значение p для всех комбинаций, кроме одной функции за раз. Этот метод действительно медленный, но не дает sh.
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"
. В идеале мне хотелось бы получить лучшее из обоих методов и сделать более эффективный процесс для вычисления этих тестов. Кроме того, если есть предложение о разработке другого фрейма данных для решения этой задачи одним способом, я был бы признателен за это.
EDIT Я понял, что не сделал так ясно, но result
предназначен только для одной функции из всех комбинаций. У меня есть для l oop, так что он проходит все функции. По сути, для всех признаков и для всей комбинации должно быть рассчитано значение p.