Получите корреляции для всех комбинаций двух разных размеров - PullRequest
0 голосов
/ 14 октября 2019

Существует ли функция R для расчета всех возможных корреляций и предоставления значений p между строками в двух кадрах данных (с одинаковым количеством столбцов, но с разными строками), аналогично функции cor() в R?

Я нашел cor.test(), но он принимает только кадр данных аналогичного размера.

1 Ответ

1 голос
/ 14 октября 2019

Насколько мне известно, функция cor.test принимает только векторы числовых значений одинаковой длины.

Вы можете достичь того, что ищете, например, с помощью функции corrplot::cor.mtest.

Вот воспроизводимый пример. Сначала загрузите библиотеку и создайте поддельные данные ...

library(corrplot)

nbgene1 <- 100
nbgene2 <- 200
n <- 10

df1 <- matrix(rnorm(nbgene1 * n), nbgene1, n)
rownames(df1) <- paste0("Df1_gene", 1:nbgene1)
colnames(df1) <- paste0("Subject", 1:n)

df2 <- matrix(rnorm(nbgene2 * n), nbgene2, n)
rownames(df2) <- paste0("Df2_gene", 1:nbgene2)
colnames(df2) <- paste0("Subject", 1:n)

Функция cor.mtest принимает только один единственный фрейм данных с отдельными лицами в виде строк и переменных в виде столбцов, поэтомувам нужно объединить два фрейма данных ...

df_combined <- rbind(df1, df2)

... и ввести транспонированный фрейм данных в cor.mtest (потому что в вашем случае строки - это гены, а столбцы - отдельные лица).

res_cortest <- cor.mtest(t(df_combined))

Тогда все, что вам нужно сделать, это извлечь правильные значения p из результата.

pval <- res_cortest$p[1:nbgene1, (nbgene1+1):(nbgene1+nbgene2)]

Возможно, вы захотите переименовать строки и столбцы этой матрицы для более понятного результата.

dimnames(pval) <- list(rownames(df1), rownames(df2))

Кроме того, не забудьте исправить для множественного тестирования!

# For example with Banjamini and Hochberg's method
padj <- matrix(p.adjust(pval, "BH"), nbgene1, nbgene2, dimnames = dimnames(pval))

Что еще интереснее, чем использовать cor.mtest, это посмотреть, что внутри!

> corrplot::cor.mtest
function (mat, ...) 
{
    mat <- as.matrix(mat)
    n <- ncol(mat)
    p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
    diag(p.mat) <- 0
    diag(lowCI.mat) <- diag(uppCI.mat) <- 1
    for (i in 1:(n - 1)) {
        for (j in (i + 1):n) {
            tmp <- cor.test(x = mat[, i], y = mat[, j], ...)
            p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
            if (!is.null(tmp$conf.int)) {
                lowCI.mat[i, j] <- lowCI.mat[j, i] <- tmp$conf.int[1]
                uppCI.mat[i, j] <- uppCI.mat[j, i] <- tmp$conf.int[2]
            }
        }
    }
    list(p = p.mat, lowCI = lowCI.mat, uppCI = uppCI.mat)
}

Это простая for петля!

Anэквивалент этого цикла в контексте нашего воспроизводимого примера будет ...

pval <- matrix(NA, nbgene1, nbgene2,
               dimnames = list(rownames(df1),
                               rownames(df2)))
for (i in 1:nbgene1) {
  for (j in 1:nbgene2) {
    pval[i, j] <- cor.test(df1[i, ], df2[j, ])$p.value
  }
}

Шаг множественной коррекции одинаков.

...