使用 R 或 python 计算多个变量与 p 值的成对 Pearson 相关性
Compute pairwise Pearson correlation with p value for multiple variables using R or python
我正在处理庞大的微阵列表达数据集。我有 27000 个探针的表达值,代表 14 个不同数据点的 5500 个基因(变量:D1 到 D14)。在这 5500 个基因中,很少有基因由多个探针表示(即,同一基因的不同探针)。 5500 个基因的探针表示分布从 1 到 5 不等(这意味着很少有基因具有 1 或 2 或 3 或 4 或 5 个探针)。现在,我想为跨 14 个不同数据点(14 个变量)的同一基因的多个探针的所有可能组合计算 Pairwise Pearson 相关系数和相关的 P 值,并以一维格式导出结果。我输入的一小部分 CSV 格式的数据 table 如下所示
ProbeName
Gene
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
A1
A
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
A
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
A
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
A
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
A
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
B
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
B
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
ProbeName列代表A1到E1的探针名称,Gene列代表A到E的基因名称,D1到D14列(变量)代表不同数据点的表达值。行代表代表特定基因在 14 个不同数据点中的探针的表达值(即,特定基因在 14 个不同数据点中被相应探针激活的程度)。 A1、A2、A3、A4 和 A5 代表同一基因 A 的多个探针,其他基因 B、C、D 和 E 也是如此。在这个 Table 中,我想计算可能的成对 Pearson 相关性跨越 14 个数据点(D1 到 D14)的同一基因的多个探针。例如,基因 C 计算 14 个数据点的 Pearson 相关性的可能探针组合是
- C1 (D1:3.1, D2:6.1, D3:3.4, D4:2.5, D5:3.7, D6:3.3 , D7:2.7, D8:5.0,
D9:2.3, D10:3.1, D11:2.0, D12:3.8, D13:2.6, D14:3.3) 对比 C2 (D1:3.8,
D2:7.1, D3:4.8, D4:4.1, D5:4.9, D6:4.5, D7:3.8, D8:5.9, D9:4.0,
D10:4.7, D11:4.4, D12:5.1, D13:2.9, D14:4.8),
- C1 (D1:3.1, D2:6.1, D3:3.4, D4:2.5, D5:3.7, D6:3.3 , D7:2.7, D8:5.0,
D9:2.3, D10:3.1, D11:2.0, D12:3.8, D13:2.6, D14:3.3) 对比 C3 (D1:3.8,
D2:6.1, D3:5.5, D4:5.4, D5:6.3, D6:3.9, D7:3.4, D8:7.8, D9:5.3,
D10:5.7, D11:4.8, D12:4.0, D13:3.5, D14:4.3),
- C2 (D1:3.8, D2:7.1, D3:4.8, D4:4.1, D5:4.9, D6:4.5 , D7:3.8, D8:5.9,
D9:4.0, D10:4.7, D11:4.4, D12:5.1, D13:2.9, D14:4.8) 对比 C3 (D1:3.8,
D2:6.1, D3:5.5, D4:5.4, D5:6.3, D6:3.9, D7:3.4, D8:7.8, D9:5.3,
D10:5.7, D11:4.8, D12:4.0, D13:3.5, D14:4.3)
在跨 14 个数据点为同一基因生成多个探针的可能成对组合的相关矩阵后,我只想展平上三角或下三角相关矩阵,并生成 CSV 格式的输出,如下所述。
ProbeName_1
ProbeName_2
Gene
PearonCorrelationValue
Pvalue
A1
A2
A
-0.129
0.661
A1
A3
A
-0.176
0.547
A1
A4
A
-0.106
0.718
A1
A5
A
-0.084
0.776
A2
A3
A
0.963
0.000
A2
A4
A
0.932
0.000
A2
A5
A
0.914
0.000
A3
A4
A
0.922
0.000
A3
A5
A
0.883
0.000
A4
A5
A
0.882
0.000
B1
B2
B
-0.328
0.253
B1
B3
B
0.900
0.000
B1
B4
B
0.987
0.000
B2
B3
B
-0.084
0.774
B2
B4
B
-0.322
0.261
B3
B4
B
0.882
0.000
C1
C2
C
0.888
0.000
C1
C3
C
0.542
0.045
C2
C3
C
0.658
0.011
D1
D2
D
0.993
0.000
我不知道如何用 R 或 Python 处理这些复杂的数据。恳请高手帮我解决这个问题
注意:我不想要相同探头组合的相关值,即 A1 Vs A1 或 A2 Vs A2 或 A3 Vs A3 或 A4 Vs A4 或 A5 Vs A5。我也不想将一个基因的探针与另一个不同基因的探针进行成对组合。即,A1 与 B1、B2、B3、B4 或 A1 与 C1、C2、C3 或 A1 与 D1、D2 和/或 A1 与 E1。
假设您的输入数据位于制表符分隔的 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')
我正在处理庞大的微阵列表达数据集。我有 27000 个探针的表达值,代表 14 个不同数据点的 5500 个基因(变量:D1 到 D14)。在这 5500 个基因中,很少有基因由多个探针表示(即,同一基因的不同探针)。 5500 个基因的探针表示分布从 1 到 5 不等(这意味着很少有基因具有 1 或 2 或 3 或 4 或 5 个探针)。现在,我想为跨 14 个不同数据点(14 个变量)的同一基因的多个探针的所有可能组合计算 Pairwise Pearson 相关系数和相关的 P 值,并以一维格式导出结果。我输入的一小部分 CSV 格式的数据 table 如下所示
ProbeName | Gene | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | D11 | D12 | D13 | D14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1 | A | 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 | A | 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 | A | 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 | A | 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 | A | 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 | B | 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 | B | 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 |
ProbeName列代表A1到E1的探针名称,Gene列代表A到E的基因名称,D1到D14列(变量)代表不同数据点的表达值。行代表代表特定基因在 14 个不同数据点中的探针的表达值(即,特定基因在 14 个不同数据点中被相应探针激活的程度)。 A1、A2、A3、A4 和 A5 代表同一基因 A 的多个探针,其他基因 B、C、D 和 E 也是如此。在这个 Table 中,我想计算可能的成对 Pearson 相关性跨越 14 个数据点(D1 到 D14)的同一基因的多个探针。例如,基因 C 计算 14 个数据点的 Pearson 相关性的可能探针组合是
- C1 (D1:3.1, D2:6.1, D3:3.4, D4:2.5, D5:3.7, D6:3.3 , D7:2.7, D8:5.0, D9:2.3, D10:3.1, D11:2.0, D12:3.8, D13:2.6, D14:3.3) 对比 C2 (D1:3.8, D2:7.1, D3:4.8, D4:4.1, D5:4.9, D6:4.5, D7:3.8, D8:5.9, D9:4.0, D10:4.7, D11:4.4, D12:5.1, D13:2.9, D14:4.8),
- C1 (D1:3.1, D2:6.1, D3:3.4, D4:2.5, D5:3.7, D6:3.3 , D7:2.7, D8:5.0, D9:2.3, D10:3.1, D11:2.0, D12:3.8, D13:2.6, D14:3.3) 对比 C3 (D1:3.8, D2:6.1, D3:5.5, D4:5.4, D5:6.3, D6:3.9, D7:3.4, D8:7.8, D9:5.3, D10:5.7, D11:4.8, D12:4.0, D13:3.5, D14:4.3),
- C2 (D1:3.8, D2:7.1, D3:4.8, D4:4.1, D5:4.9, D6:4.5 , D7:3.8, D8:5.9, D9:4.0, D10:4.7, D11:4.4, D12:5.1, D13:2.9, D14:4.8) 对比 C3 (D1:3.8, D2:6.1, D3:5.5, D4:5.4, D5:6.3, D6:3.9, D7:3.4, D8:7.8, D9:5.3, D10:5.7, D11:4.8, D12:4.0, D13:3.5, D14:4.3)
在跨 14 个数据点为同一基因生成多个探针的可能成对组合的相关矩阵后,我只想展平上三角或下三角相关矩阵,并生成 CSV 格式的输出,如下所述。
ProbeName_1 | ProbeName_2 | Gene | PearonCorrelationValue | Pvalue |
---|---|---|---|---|
A1 | A2 | A | -0.129 | 0.661 |
A1 | A3 | A | -0.176 | 0.547 |
A1 | A4 | A | -0.106 | 0.718 |
A1 | A5 | A | -0.084 | 0.776 |
A2 | A3 | A | 0.963 | 0.000 |
A2 | A4 | A | 0.932 | 0.000 |
A2 | A5 | A | 0.914 | 0.000 |
A3 | A4 | A | 0.922 | 0.000 |
A3 | A5 | A | 0.883 | 0.000 |
A4 | A5 | A | 0.882 | 0.000 |
B1 | B2 | B | -0.328 | 0.253 |
B1 | B3 | B | 0.900 | 0.000 |
B1 | B4 | B | 0.987 | 0.000 |
B2 | B3 | B | -0.084 | 0.774 |
B2 | B4 | B | -0.322 | 0.261 |
B3 | B4 | B | 0.882 | 0.000 |
C1 | C2 | C | 0.888 | 0.000 |
C1 | C3 | C | 0.542 | 0.045 |
C2 | C3 | C | 0.658 | 0.011 |
D1 | D2 | D | 0.993 | 0.000 |
我不知道如何用 R 或 Python 处理这些复杂的数据。恳请高手帮我解决这个问题
注意:我不想要相同探头组合的相关值,即 A1 Vs A1 或 A2 Vs A2 或 A3 Vs A3 或 A4 Vs A4 或 A5 Vs A5。我也不想将一个基因的探针与另一个不同基因的探针进行成对组合。即,A1 与 B1、B2、B3、B4 或 A1 与 C1、C2、C3 或 A1 与 D1、D2 和/或 A1 与 E1。
假设您的输入数据位于制表符分隔的 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')