【问题标题】:comparing/extracting data from matrices using python (2.6.1)使用 python (2.6.1) 从矩阵中比较/提取数据
【发布时间】:2012-02-13 17:55:46
【问题描述】:

我有两个 .csv 文件,其中包含从 R 导出的相关矩阵。一个文件包含 P 值,一个文件包含 r 值。行和列标题在两个文件之间完全匹配。

我试图仅在 P 值

            Species1                 Species2
Species1      1                       0.9
Species2      0.9                     1

P 值输入文件是相同的,除了包含 P 值代替 r 值。

我对 Python 比较陌生,不知道如何处理这种类型的文件。我尝试了一些策略,包括使用 csv 库来遍历文件。我研究过使用 numpy,但它似乎对我不起作用(?)。我还研究了使用 scipy 在 Python 中计算 r 值和 P 值(Pearsons),但似乎这只适用于比较两个一维数组(我有 1700 多列数据要关联)。

我开始使用的代码,向您展示我导入的内容:

import csv
infileP = open('AllcorrP.csv', 'rU')
infileR = open('AllcorrR.csv', 'rU')

问题 任何人都可以根据我的 p 值文件中的显着 (

直接使用 Python 计算多列数据之间所有可能相关性的 r 值和 P 值,并仅提取具有显着 P 值的结果?

最后,我想输出两个文件。
第一个文件:

Species1   Species2   Species4  ...
Species2   Species1   Species7  ...

等...(其中“Species1”是第一个具有显着相关性的物种,下一行是与它显着相关的物种(Species2、Species4 等)

第二个文件:

Species1 (corr) Species2 = 0.87
Species2 (corr) Species7 = 0.72
...

等等。它显示了每个成对相关性和与之相关的 r 值

此时,我很高兴能够提取我想要的 r 值和物种的列表,并在稍后找出最后的两个文件格式。谢谢!

【问题讨论】:

    标签: python matrix correlation


    【解决方案1】:

    要读取数据,您应该能够使用 numpy.genfromtext。请参阅文档,此功能中有大量功能。要阅读上面的示例,您可以这样做:

    from numpy import genfromtxt
    rdata = genfromtxt('AllcorrR.csv', skip_header=1)[:,1:]
    Pdata = genfromtxt('AllcorrP.csv', skip_header=1)[:,1:]
    

    [:,1:] 是在读入时忽略第一列数据。该函数没有像对行那样“忽略前 x 列”的输入(通过 skip_header)。不知道他们为什么不实现这个,它总是困扰着我。

    这只会读取 P 的数据(也可以为 r 执行此操作)。然后你可以很容易地过滤数据。您可以阅读分开的第一行和第一列以获取标题。或者,如果您看到 genfromtxt 文档,您也可以为它们命名(创建一个 recarray)。

    要查找 r 小于 0.50 的索引(值),您可以简单地进行比较,然后 numpy 会自动为您创建一个布尔数组:

    print Pdata < 0.05
    

    这可以用作 rdata 的索引(确保有相同数量的行/列):

    print rdata[Pdata < 0.05]
    

    【讨论】:

    • 谢谢! Numpy 确实工作得很好。很抱歉没有尽快给您回信。
    【解决方案2】:

    您可以执行以下操作来获取元组列表,其中包含行和列标题,以及您感兴趣的数据元素的 r 和 P 值:

    infile_r = open('AllcorrR.csv', 'r')
    infile_p = open('AllcorrP.csv', 'r')
    
    # Read the first line of each file.
    line_r = infile_r.readline()
    line_p = infile_p.readline()
    
    # Set the separator depending on the file format.
    SEPARATOR = None  # Elements separated by whitespace.
    column_headers = line_r.split(SEPARATOR)
    
    significant = []
    
    # Read the rest of the lines.
    for line_r in infile_r:
        line_p = infile_p.readline()
        tokens_r = line_r.split(SEPARATOR)
        tokens_p = line_p.split(SEPARATOR)
        row_header = tokens_r[0]
        values_r = [float(v) for v in tokens_r[1:]]
        values_p = [float(v) for v in tokens_p[1:]]
        significant.extend([(row_header, column_header, r, p) for column_header, r, p in zip(column_headers, values_r, values_p) if p < 0.05])
    
    print significant
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多