我正在使用巨大的微阵列表达式数据集。我有27000个探针的表达值,代表了14个不同数据点的5500个基因(变量:D1到D14)。在这5500个基因中,很少有基因被多个探针(即同一基因的不同探针)所代表。5500个基因的探针代表分布从1到5不等(意味着很少有基因有1个或2个或3个或4个或5个探针)。现在,我想计算跨14个不同数据点(14个变量)的同一基因的多个探针的所有可能组合的成对Pearson相关系数和相关p值,并以一维格式导出结果。CSV格式的输入数据表的一小部分如下所示
<表类>
ProbeName
基因
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
这里
D12
D13
D14
tbody><<tr>A1 9.1 6.6 8.2 9.3 9.0 8.8 9.9 7.5 10.8 9.0 8.3 11.6 9.3 10.9 A2 3.9 3.7 5.8 2.2 2.9 2.8 2.9 3.8 3.3 1.7 3.2 3.5 5.9 3.7 A3 4.6 4.8 6.8 2.8 4.3 3.5 4.2 5.3 4.5 3.3 4.0 4.3 6.9 4.7 A4 3.8 3.9 5.8 3.2 4.0 2.8 3.7 4.6 3.6 2.2 3.8 4.3 5.6 3.9 A5 6.3 6.6 7.7 5.9 5.9 5.6 6.2 6.4 5.8 4.9 5.4 6.1 7.7 6.9 B1 B 7.5 5.5 7.1 10.2 7.2 8.6 8.3 7.1 6.1 7.0 9.2 6.4 6.4 9.4 B2 B 4.6 4.8 5.6 4.3 4.7 4.3 4.0 5.5 4.0 3.3 3.8 5.0 5.7 4.7 B3 td> 5.1 3.9 5.1 6.5 5.0 5.4 4.9 5.3 4.5 4.5 5.9 5.0 4.6 5.6 B4 td> 7.6 6.1 7.5 10.9 8.0 9.2 8.5 7.1 6.3 7.4 10.0 6.9 6.9 10.2 C1 C 3.1 6.1 3.4 2.5 3.7 3.3 2.7 5.0 2.3 3.1 2.0 3.8 2.6 3.3 C2 C 3.8 7.1 4.8 4.1 4.9 4.5 3.8 5.9 4.0 4.7 4.4 5.1 2.9 4.8 C3 C 3.8 6.1 5.5 5.4 6.3 3.9 3.4 7.8 5.3 5.7 4.8 4.0 3.5 4.3 D1 D 12.2 11.7 11.4 10.5 11.5 11.4 10.7 12.0 11.3 10.5 9.9 11.7 10.5 10.2 D2 D 12.0 11.5 11.3 10.4 11.4 11.4 10.7 11.9 11.2 10.6 9.9 11.7 10.3 10.2 E1 E 2.4 3.3 7.5 3.4 5.8 3.6 1.2 3.5 0.9 2.2 3.1 4.7 7.5 4.0 表类>
假设您的输入数据在一个以制表符分隔的CSV文件中,并且基因样本都是连续的。考虑到这一点,这应该足够了。
from scipy.stats import pearsonr as P
import pandas as pd
def combos(n, s):
r = []
for i in range(n):
for j in range(i + 1, n):
r.append((i + s, j + s))
return r
def process(df, s, e, ad):
if (e - s) > 0:
_, c = df.shape
for r1, r2 in combos(e - s + 1, s):
r, p = P(df.iloc[r1, 2: c], df.iloc[r2, 2: c])
ad.append([df.iloc[r1, 0], df.iloc[r2, 0],
df.iloc[r1, 1], r, p])
def main(csvFile):
df = pd.read_csv(csvFile, sep='t')
r, _ = df.shape
gene = df.iloc[0, 1]
startRow = 0
endRow = 0
allData = []
for _r in range(1, r):
_g = df.iloc[_r, 1]
if _g == gene:
endRow = _r
else:
process(df, startRow, endRow, allData)
gene = _g
startRow = _r
process(df, startRow, r - 1, allData)
newDF = pd.DataFrame(data=allData, columns=[
'ProbeName_1', 'ProbeName_2', 'Gene', 'Pearson', 'Pvalue'])
with pd.option_context('display.float_format', '{:0.4f}'.format):
print(newDF)
if __name__ == '__main__':
main('genes.csv')