Я пытаюсь вычислить корреляцию Спирмена и значение p для фрейма данных. Для лучшего приближения p-значения я должен придерживаться пакета pspearman. Я ожидаю результата, аналогичного функции rcorr()
. Но у меня проблема при выполнении pspearman:spearman.test()
строка за строкой.
Мой фрейм данных содержит 5000 строк (генов) и 200 столбцов (пятен). И я хочу получить матрицу корреляции и матрицу р-значений для этих 5000 * 5000 пар генов-генов. Корреляция рассчитывается только тогда, когда оба гена не являются 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'
Я надеюсь использовать spearman.test для каждой пары генов с apply (), чтобы сделать
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 () для достижения моей цели?
Thx!