Tengo una matriz m con 8300 columnas y 18 filas. Cada columna representa un gen; y cada fila, una muestra. Quiero calcular la matriz de adyacencia (usando la correlación de Spearman) y la matriz de valor p correspondiente.

El código que tengo hasta ahora es:

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])

Lo cual es sorprendentemente ineficiente (se tarda alrededor de 11 horas en ejecutarse en colab-google usando GPU). ¿Hay alguna manera de vectorizar esto?

¡Muchas gracias!

2
Rodrigo Guinea Ordóñez 26 jun. 2019 a las 19:33

1 respuesta

La mejor respuesta

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

Parece que con esta función puede pasar toda su matriz m para ambos argumentos y hará correlaciones y valores p entre todas las columnas, que interpreta como las variables (las filas son muestras de las variables). Luego genera los valores p y las correlaciones en formas matriciales. Por lo tanto, puede deshacerse de los bucles for y producir las correlaciones y las matrices de valor p de una sola vez. Incluso sin hacer esto en una sola pasada, parece que está revisando todos los datos dos veces para formar una matriz simétrica; Hubiera hecho el segundo bucle como "para j en rango (i, n_genes):" y luego completé dos entradas [i, j] y [j, i] en el cuerpo del bucle.

2
Zach Favakeh 26 jun. 2019 a las 19:25