Создание верхней / нижней три angular корреляционной матрицы на основе значений из группы текстовых файлов? - PullRequest
0 голосов
/ 25 февраля 2020

Постараюсь не слишком усложнять мои объяснения, но я не совсем понимаю, как лучше go заполнить триангулированную матрицу корреляции без повторяющихся значений с существующими значениями корреляции, полученными из другого пакета. Это включает извлечение указанных c значений из списка текстовых файлов. Это то, что я сделал до сих пор:

# read in list of file names (they are named '1_1', '1_2' .. so on until '47_48' with no repeat values generated)
filenames <- read_table('/home/filenames.txt', col_names = 'file_id')
# create symmetrical matrix
M <- diag(48)
ct <- 1
for (sub in (filenames$file_id)) {
  subj <- read.table(paste0(dat_dir, '/ht_', sub, '.HEreg'), sep="", fill=TRUE)
  ht <- as.character(subj$V2[grep("rG",sub$V1)]) # wanting to extract the specific value in that column for each text file
  M[ct,] <- as.numeric(ht) #input this value into the appropriate location
ct <- ct + 1
}

Это, очевидно, не дает мне триангулированного вывода, который я мог бы себе представить - я знаю, что есть ошибка при вводе переменной 'ht' в матрицу, но я не уверен, как решить это движение вперед. В идеале, значение корреляции файла 1_1 должно быть вставлено в строку 1, столбец 1, файл 1_2 должен быть вставлен в строку 2, столбец 1 и т. Д., И избегать повторений (должно быть 0)

Должен ли я обратиться к вложенным циклам?

Большая помощь была бы оценена этим R newb ie здесь, я надеюсь, что я не усложнил вещи без необходимости!

1 Ответ

0 голосов
/ 25 февраля 2020

Я думаю, что самым простым способом было бы прочитать все ваши значения в вектор. Вы можете сделать это, используя вариацию вашего существующего l oop.

Давайте предположим, что ваша матрица корреляции желаемого размера равна 5x5 (я знаю, что у вас есть 48x48, судя по вашему коду, но для простоты примера я буду работать с меньшей матрицей).

Пусть мы предполагаем, что вы прочитали все свои значения корреляции в вектор x в главном порядке столбца (так же, как R использует), то есть первый элемент x - строка 2 столбца 1, второй элемент - строка 3 столбца 1 и т. д. c. Кроме того, я предполагаю, что вы создаете симметричную корреляционную матрицу c, то есть у вас есть матрицы на диагонали, поэтому индексирование начинается так, как оно происходит, благодаря использованию функции diag(). Давайте предположим, что ваш вектор x содержит следующие значения:

x <- 1:10

Я знаю, что это не корреляции, но они позволят легко увидеть, как мы заполняем матрицу, т.е. какой элемент вектора входит в какой положение в результирующей матрице.

Теперь давайте создадим единичную матрицу и нулевые матрицы для верхней и нижней корреляций tri angular (вне диагонали).

# Assuming 5x5 matrix
n_elements <- 5
m <- diag(n_elements)
m_upper <- m_lower <- matrix(0, n_elements, n_elements)

Чтобы быстро заполнить нижнюю матрицу tri angular, мы можем использовать lower.tri().

m_lower[lower.tri(m_lower, diag = FALSE)] <- x

Это даст следующий результат:


     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    1    0    0    0    0
[3,]    2    5    0    0    0
[4,]    3    6    8    0    0
[5,]    4    7    9   10    0

Как видите, мы успешно заполнили нижнюю тройку angular. Также обратите внимание на порядок, в котором элементы вектора заполняются в матрице. Это важно для правильности ваших результатов. Верхний три angular - это просто транспонирование нижнего три angular, и затем мы можем сложить наши три матрицы вместе, чтобы сформировать вашу симметричную c матрицу корреляции.

m_upper <- t(m_lower)
M <- m_lower + m + m_upper

Что дает желаемый результат:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    2    3    4
[2,]    1    1    5    6    7
[3,]    2    5    1    8    9
[4,]    3    6    8    1   10
[5,]    4    7    9   10    1

Как видите, нет необходимости работать с вложенными циклами для заполнения этих матриц. Единственное, что вам нужно * l oop, - это прочитать результаты из файлов (которые, похоже, у вас есть дескриптор) Если вам нужен только триангулированный выход, вы можете просто остановиться на нижней три angular матрице выше. Если ваш вектор оцененных корреляций (в моем примере x) включает в себя диагональные элементы, просто установите diag = TRUE в функции lower.tri(), и вам подходит go.

...