2015-11-30 33 views
6

Tôi đang làm việc với tập dữ liệu sinh học lớn.Tính tương quan cặp giữa tất cả các cột

Tôi muốn tính PCC (hệ số tương quan Pearson) của tất cả các kết hợp 2 cột trong bảng dữ liệu của tôi và lưu kết quả dưới dạng tệp DataFrame hoặc CSV.

Bảng dữ liệu giống như dưới đây: cột là tên của các gen và các hàng là mã của tập dữ liệu. Các số phao có nghĩa là số lượng gen được kích hoạt trong tập dữ liệu.

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

Là một đầu ra, tôi muốn xây dựng bảng (DataFrame hoặc file csv) như dưới đây, vì scipy.stats.pearsonr trở về chức năng (PCC, p-value). Trong ví dụ của tôi, XX và YY là kết quả của pearsonr ([1.5, 5.5, 8.5], [2.5, 6.5, 8.5]). Trong cùng một cách, ZZ và AA có nghĩa là kết quả của pearsonr ([1.5, 5.5, 8.5], [3.5, 7.5, 8.5]). Tôi không cần dữ liệu thừa như GeneB_GeneA hoặc GeneC_GeneB trong bài kiểm tra của mình.

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

Vì số lượng cột và hàng nhiều (trên 100) và tên của chúng phức tạp, việc sử dụng tên cột hoặc tên hàng sẽ khó.

Nó có thể là một vấn đề đơn giản cho các chuyên gia, tôi không biết làm thế nào để đối phó với loại bảng này với thư viện python và gấu trúc. Đặc biệt làm cho DataFrame mới và thêm kết quả có vẻ là rất khó khăn.

Xin lỗi vì lời giải thích kém của tôi, nhưng tôi hy vọng ai đó có thể giúp tôi.

+0

Điều này được trả lời ở đây: [link] (http://stackoverflow.com/questions/3949226/calculating-pearson-correlation-and-significance-in-python) – Glostas

+0

Cảm ơn bạn đã bình luận của bạn. Tôi nghĩ tiêu đề không đủ tốt. Những gì tôi muốn biết không phải là làm thế nào để tính toán PCC, nhưng tính toán PCC của tất cả các cột cặp, và lưu kết quả như là một DataFrame mới. – z991

Trả lời

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

Tạo dữ liệu mẫu ngẫu nhiên:

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 
  • Nhận kết hợp độc đáo của DataFrame cột sử dụng itertools.combination(iterable, r)
  • Duyệt qua các kết hợp và tính toán hệ số tương quan cặp sử dụng scipy.stats.stats.personr
  • Thêm kết quả (PCC và giá trị p tuple) để dictionary
  • Build DataFrame từ dictionary

Sau đó bạn cũng có thể tiết kiệm result.to_csv(). Bạn có thể thấy thuận tiện khi sử dụng một số MultiIndex (hai cột có chứa tên của mỗi cột) thay vì tên được tạo cho các tương quan cặp đôi.

+0

Cảm ơn bạn rất nhiều!Như bạn và ChenZhongPu khuyên, sử dụng chức năng kết hợp có vẻ là một giải pháp tốt cho loại vấn đề này. Ngoài ra tôi muốn cảm ơn bạn một lần nữa cho các giải thích loại của bạn. Nó rất hữu ích vì tôi mới ở python. – z991

2

Để nhận cặp, đó là sự cố combinations. Bạn có thể concat tất cả các hàng vào một kết quả 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

Tôi không biết về 'kết hợp', nhưng có vẻ như rất hay khi thực hiện phép tính cặp này. Ngoài ra, tôi đã học được rằng làm cho DataFrame từ danh sách có thể dễ dàng được don bởi hàm concat. Cảm ơn nhiều! – z991

Các vấn đề liên quan