2015-11-30 11 views
6

Sto lavorando con un set di dati biologico di grandi dimensioni.Calcolo della correlazione a coppie tra tutte le colonne

Desidero calcolare PCC (coefficiente di correlazione di Pearson) di tutte le combinazioni di 2 colonne nella tabella dei dati e salvare il risultato come file DataFrame o CSV.

La tabella dei dati è la seguente: le colonne sono il nome dei geni e le righe sono il codice del set di dati. I numeri float indicano quanto il gene è attivato nel set di dati.

 GeneA GeneB GeneC ... 
DataA 1.5 2.5 3.5 ... 
DataB 5.5 6.5 7.5 ... 
DataC 8.5 8.5 8.5 ... 
... 

come uscita, voglio costruire il tavolo (dataframe o CSV) come qui di seguito, a causa scipy.stats.pearsonr funzione restituisce (PCC, p-value). Nel mio esempio, XX e YY indicano i risultati di pearsonr ([1.5, 5.5, 8.5], [2.5, 6.5, 8.5]). Allo stesso modo, ZZ e AA significano il risultato di pearsonr ([1.5, 5.5, 8.5], [3.5, 7.5, 8.5]). Non ho bisogno dei dati ridondanti come GeneB_GeneA o GeneC_GeneB nel mio test.

   PCC P-value 
GeneA_GeneB XX YY 
GeneA_GeneC ZZ AA 
GeneB_GeneC BB CC 
... 

Poiché il numero di colonne e righe sono molti (oltre 100) ei loro nomi sono complicate, utilizzando i nomi di colonna o nomi di riga sarà difficile.

Potrebbe essere un semplice problema per gli esperti, non so come affrontare questo tipo di tabella con la libreria Python e Panda. Soprattutto creare nuovi DataFrame e aggiungere risultati sembra essere molto difficile.

Scusa per la mia scarsa spiegazione, ma spero che qualcuno possa aiutarmi.

+0

Questa risposta è qui: [collegamento] (http://stackoverflow.com/questions/3949226/calculating-pearson-correlation-and-significance-in-python) – Glostas

+0

Grazie per il tuo commento. Penso che il titolo non fosse abbastanza buono. Quello che voglio sapere non è come calcolare PCC, ma calcolare il PCC di tutte le coppie di colonne e salvare i risultati come un nuovo DataFrame. – z991

risposta

8
from pandas import * 
import numpy as np 
from libraries.settings import * 
from scipy.stats.stats import pearsonr 
import itertools 

Creazione di dati campione casuale:

df = DataFrame(np.random.random((5, 5)), columns=['gene_' + chr(i + ord('a')) for i in range(5)]) 
print(df) 

    gene_a gene_b gene_c gene_d gene_e 
0 0.471257 0.854139 0.781204 0.678567 0.697993 
1 0.292909 0.046159 0.250902 0.064004 0.307537 
2 0.422265 0.646988 0.084983 0.822375 0.713397 
3 0.113963 0.016122 0.227566 0.206324 0.792048 
4 0.357331 0.980479 0.157124 0.560889 0.973161 

correlations = {} 
columns = df.columns.tolist() 

for col_a, col_b in itertools.combinations(columns, 2): 
    correlations[col_a + '__' + col_b] = pearsonr(df.loc[:, col_a], df.loc[:, col_b]) 

result = DataFrame.from_dict(correlations, orient='index') 
result.columns = ['PCC', 'p-value'] 

print(result.sort_index()) 

        PCC p-value 
gene_a__gene_b 0.461357 0.434142 
gene_a__gene_c 0.177936 0.774646 
gene_a__gene_d -0.854884 0.064896 
gene_a__gene_e -0.155440 0.802887 
gene_b__gene_c -0.575056 0.310455 
gene_b__gene_d -0.097054 0.876621 
gene_b__gene_e 0.061175 0.922159 
gene_c__gene_d -0.633302 0.251381 
gene_c__gene_e -0.771120 0.126836 
gene_d__gene_e 0.531805 0.356315 
  • Diventa combinazioni uniche di DataFrame colonne utilizzando itertools.combination(iterable, r)
  • Scorrere queste combinazioni e calcolare le correlazioni a coppie usando scipy.stats.stats.personr
  • Aggiungi risultati (PCC e p-value tuple) per dictionary
  • Corporatura DataFrame da dictionary

È quindi possibile anche salvare result.to_csv(). Potrebbe essere conveniente utilizzare MultiIndex (due colonne contenenti i nomi di ciascuna colonna) anziché i nomi creati per le correlazioni a coppie.

+0

Grazie mille!Come consigliato da te e ChenZhongPu, l'uso della funzione di combinazione sembra essere una buona soluzione per questo tipo di problema. Inoltre vorrei ringraziarti ancora per le tue gentili spiegazioni. È stato molto utile perché sono nuovo in Python. – z991

2

Per ottenere coppie, si tratta di un problema combinations. È possibile concat tutte le righe in uno il risultato dataframe.

from pandas import * 
from itertools import combinations 
df = pandas.read_csv('gene.csv') 
# get the column names as list, which are gene names 
column_list = df.columns.values.tolist() 
result = [] 
for c in combinations(column_list, 2): 
    firstGene, secondGene = c 
    firstGeneData = df[firstGene].tolist() 
    secondGeneData = df[secondGene].tolist() 
    # now to get the PCC, P-value using scipy 
    pcc = ... 
    p-value = ... 
    result.append(pandas.DataFrame([{'PCC': pcc, 'P-value': p-value}], index=str(firstGene)+ '_' + str(secondGene), columns=['PCC', 'P-value']) 

result_df = pandas.concat(result) 
#result_df.to_csv(...) 
+0

Non conoscevo le "combinazioni", ma mi sembra carino quando faccio questo tipo di calcolo della coppia. Inoltre, ho imparato che rendere DataFrame dall'elenco può essere facilmente donato dalla funzione concat. Grazie mille! – z991

Problemi correlati