Сравнение / извлечение данных из матриц с использованием Python (2.6.1) - PullRequest
1 голос
/ 13 февраля 2012

У меня есть два файла .csv, содержащие матрицы корреляции, экспортированные из R. Один файл содержит P-значения, а другой - r-значения.Заголовки строк и столбцов точно совпадают между двумя файлами.

Я пытаюсь извлечь значения r и соответствующий заголовок строки и столбца для пар, только когда значение P <0,05.Вот пример того, как выглядят данные во входном файле r-значения (у меня 1700+ коррелированных элементов, а не только два показанных): </p>

            Species1                 Species2
Species1      1                       0.9
Species2      0.9                     1

Входной файл P-значения идентиченЗа исключением того, что вместо значений r содержатся значения P.

Я относительно новичок в Python и не уверен, как обращаться с файлами этого типа.Я попробовал несколько стратегий, в том числе использование библиотеки csv для перебора файлов.Я посмотрел на использование NumPy, но не похоже, что это будет работать для меня (?).Я также изучил использование scipy для вычисления r- и P-значений (Pearsons) в Python, но, похоже, это работает только для сравнения двух одномерных массивов (у меня есть 1700+ столбцов данных для корреляции).

Код, с которого я начинаю, чтобы показать вам, что я импортировал:

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

Вопрос Может ли кто-нибудь помочь мне извлечь заголовки столбцов и строк и значения r из моего r-файл значений, основанный на значимых (<0,05) P-значениях из моего файла p-значений? </p>

ИЛИ

Рассчитать r- и P-значения для всех возможных корреляциймежду многими столбцами данных напрямую с использованием Python и извлекать только результаты со значительными P-значениями?

В конце я хотел бы получить вывод в двух файлах.
Первый файл:

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

и т. Д. (Где «Вид 1» - это первый вид со значительными корреляциями, а следующие элементы в строке - это виды, с которыми он значительно коррелирует (Виды 2, Виды 4 и т. Д.)

Второй файл:

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

и т. Д.,которая показывает каждую попарную корреляцию и значение r, которое идет с ней

На данный момент, я был бы рад просто иметь возможность извлечь список значений r и видов, которые я хочу, и выяснить,окончательное форматирование двух файлов позже.Спасибо!

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Чтобы прочитать данные, вы должны использовать 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, вы можете также назвать их (создать повторный массив).

Чтобы найти индексы (значения), где r меньше 0,50, вы можете просто сделать сравнение, и numpy автоматически создаст для вас логический массив:

print Pdata < 0.05

Это можно использовать как индекс для rdata (убедитесь, что количество строк / столбцов одинаковое):

print rdata[Pdata < 0.05]
0 голосов
/ 14 февраля 2012

Вы можете сделать что-то вроде этого, чтобы получить список кортежей, содержащий заголовки строк и столбцов и значения 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
...