Есть ли способ векторизовать вложенный цикл, который вычисляет корреляцию Спирмена и ее p-значения? - PullRequest
2 голосов
/ 26 июня 2019

У меня есть матрица m с 8300 столбцами и 18 строками. Каждый столбец представляет ген; и в каждой строке образец. Я хочу вычислить матрицу смежности (используя корреляцию Спирмена) и соответствующую матрицу р-значения.

Код, который я получил до сих пор:

W = np.zeros((n_genes, n_genes))
P = np.zeros((n_genes, n_genes))

for i in range(0, n_genes):
    for j in range(0, n_genes):
        W[i,j], P[i,j] = st.spearmanr(m[:,i], m[:,j])

Что удивительно неэффективно (для запуска в colab-google с использованием графического процессора требуется около 11 часов). Есть ли способ векторизовать это?

Большое спасибо!

1 Ответ

2 голосов
/ 26 июня 2019

https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.stats.spearmanr.html

Похоже, что с помощью этой функции вы можете передать всю свою матрицу m для обоих аргументов, и она будет выполнять корреляции и p-значения между всеми столбцами, которые она интерпретирует как переменные (строки, являющиеся образцами переменных). Затем он выводит p-значения и корреляции в матричных формах. Поэтому вы можете избавиться от циклов for и создать матрицы корреляции и p-значения за один раз. Даже не делая этого за один проход, похоже, что вы проходите все данные дважды, чтобы сформировать симметричную матрицу; Я бы сделал второй цикл как «для j в диапазоне (i, n_genes):», а затем заполнил две записи [i, j] и [j, i] в теле цикла.

...