Перебираем большую матрицу, содержащую 3000 строк, и вычисляем соотношение - PullRequest
2 голосов
/ 30 июля 2010

Я пытаюсь перебрать матрицу, сделать коэффициент корреляции для каждой строки и распечатать матрицу корреляции.

ID A B C D E F G H I
Row01 0.08 0.47 0.94 0.33 0.08 0.93 0.72 0.51 0.55
Row02 0.37 0.87 0.72 0.96 0.20 0.55 0.35 0.73 0.44
Row03 0.19 0.71 0.52 0.73 0.03 0.18 0.13 0.13 0.30
Row04 0.08 0.77 0.89 0.12 0.39 0.18 0.74 0.61 0.57
Row05 0.09 0.60 0.73 0.65 0.43 0.21 0.27 0.52 0.60
Row06 0.60 0.54 0.70 0.56 0.49 0.94 0.23 0.80 0.63
Row07 0.02 0.33 0.05 0.90 0.48 0.47 0.51 0.36 0.26
Row08 0.34 0.96 0.37 0.06 0.20 0.14 0.84 0.28 0.47
........
(30000 rows!)

Я хочу вывод корреляции Пирсона как:

 Row01
Row01 1.000
Row02 0.012
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

выводится как Row01.txt

Row02
Row01 0.012
Row02 1.000
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

выводится как Row02.txt. , , , .

выходных файлов будет 30000!

Мне известно, что этот алгоритм выглядит глупо, что matrix<-cor(T(data)) сделает все, и половины матрицы corr достаточно, поскольку результат corr симметричен по диагонали.

Но мои проблемы

  1. мои данные слишком велики для обработки R 30000x30000.
  2. Трудно получить конкретные корреляции конкретной строки с остальными.
  3. Используя мой "глупый алгоритм", я легко могу получить интересующий меня результат из папки.

Ответы [ 3 ]

1 голос
/ 31 июля 2010

Спасибо, Нико!Почти попал туда после того, как исправил мелкие ошибки.Здесь я прилагаю свой сценарий:

datamatrix=read.table("ref.txt",sep="\t",header=T,row.names=1)
correl <- NULL
for (i in 1:nrow(datamatrix)) {
  correl <- apply(datamatrix, 1, function(x){cor(t(datamatrix[,i]))})
  write.table(correl, paste(row.names(datamatrix)[i], ".txt", sep=""))
}

Но я боюсь, что часть функции (x) имеет проблемы, которая выглядит как t(datamatrix[i,j]), которая будет вычислять corr любых двух строк.

На самом деле мне нужно перебрать матрицу.сначала cor(row01, row02) получить одну корреляцию между rwo01 и row02;затем cor(row01, row03), чтобы получить корреляцию между row01 и rwo03, .... и до корреляции между row01 row30000. Теперь я получил первый столбец для

      row01
Row01 **1.000**
Row02 0.012
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

и сохранил его в файл row01.txt;

Аналогичным образом получите

      Row02
Row01 0.012
Row02 **1.000**
Row03 0.023
Row04 0.820
Row05 0.165
Row06 0.230
Row07 0.376
Row08 0.870

и сохраните его в файле row02.txt.

Всего я получу 30000 файлов.Это глупо, но это может пропустить ограничение памяти и может быть легко обработано для корреляции определенной строки.

1 голос
/ 30 июля 2010

Не проверено, но что-то вроде этого должно работать, я думаю

РЕДАКТИРОВАТЬ : исправлен код, чтобы избежать огромной матрицы

correl <- NULL
for (i in 1:nrow(datamatrix))
    {
    correl <- apply(datamatrix, 1, function(x){cor(datamatrix[,i], x)})
    write.table(correl, paste("col", i, ".txt", sep="")
    }
0 голосов
/ 03 ноября 2011

Я бы порекомендовал взглянуть на пакет bigmemory и пакет foreach, чтобы выполнить эти вычисления в больших отображенных в память файлах (т. Е. Входная матрица - это один файл, корреляционная матрица - другой). Таким образом, вы можете использовать несколько ядер и не хранить много в оперативной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...