【问题标题】:Compute pairwise Pearson correlation with p value for multiple variables using R or python使用 R 或 python 计算多个变量的 p 值成对 Pearson 相关性
【发布时间】:2021-10-30 00:35:57
【问题描述】:

我正在处理庞大的微阵列表达数据集。我有 27000 个探针的表达值,代表 14 个不同数据点的 5500 个基因(变量:D1 到 D14)。在这 5500 个基因中,很少有基因由多个探针(即同一基因的不同探针)表示。 5500 个基因的探针表示分布从 1 到 5 不等(意味着很少有基因具有 1 或 2 或 3 或 4 或 5 个探针)。现在,我想计算跨 14 个不同数据点(14 个变量)的同一基因的多个探针的所有可能组合的成对 Pearson 相关系数和相关 P 值,并以一维格式导出结果。我的一小部分 CSV 格式的输入数据表如下所示

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 也是如此。在此表中,我想计算多个探针的可能成对 Pearson 相关性跨 14 个数据点(D1 到 D14)的相同基因。例如,用于计算 14 个数据点的 Pearson 相关性的基因 C 的可能探针组合是

  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 Vs B1、B2、B3、B4 或 A1 Vs C1、C2、C3 或 A1 Vs D1、D2 和/或 A1 Vs E1。

【问题讨论】:

  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 您的输入数据采用什么形式?您是否从数据库、CSV 文件或其他文件格式中获取它?另外,您可以在输出样本中添加一些预期值吗?这样,如果有人创建了一个解决方案,他们可以检查这些值是否符合预期。同一个基因是否总是正好有 3 个探针?
  • 嗨,我的输入数据是 CSV 格式。每个基因并不总是有 3 个探针。基因的探针表示从 1 到 5 不等。根据要求,我已将预期输出值包括在内以供参考。事实上,我已经详细编辑了我的问题。请看一看。

标签: python r pearson-correlation


【解决方案1】:

假设您的输入数据位于制表符分隔的 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')

【讨论】:

  • 您好,感谢您的回复。每个基因并不总是有 3 个探针。基因的探针表示从 1 到 5 不等。我已经编辑了我的问题。请看一看。
  • 您好 DarkKnight,感谢您的回复。我是 python 的初学者,发现很难以 CSV 格式编写输出。你能在这方面帮助我吗?
  • 您会发现 pandas 文档在这方面很有帮助
  • 谢谢,想出了如何编写输出。再次感谢您帮助解决我的问题。
猜你喜欢
  • 2022-11-27
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2011-04-26
  • 2014-06-23
  • 2018-06-11
相关资源
最近更新 更多