使用 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 相关性的可能探针组合是

  1. 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),
  2. 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),
  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')