Эффективный способ генерировать матрицу совпадений - PullRequest
1 голос
/ 25 сентября 2019

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

У меня есть матрица:

     [,1] [,2] [,3] [,4]
[1,]  1    1    2     1
[2,]  1    2    3     1
[3,]  2    3    1     2
[4,]  1    2    3     3

Матрица совпадений будет рассчитана путем сравнения каждого элемента строка за строкой, чтобы создать расстояние различий сформула:

Diss = 1 - (Coincidences / (Coincidences + Discordance)) 

Итак, моя результирующая матрица является симметричной с dim 4x4 и диагональными элементами, равными 0, поэтому в моем примере A (1,2) будет:

A(1,2) = 1 - (2 / 4) = 0.5
A(1,3) = 1 - (0/4) = 1.0

И так далее ...

Я создал функцию для генерации этой матрицы:

cs_matrix <- function (x) {

  cs.mat <- matrix(rep(0,dim(x)[1]^2), ncol = dim(x)[1])

  for (i in 1:dim(x)[1]){

    for (j in 1:dim(x)[1]){

      cs.mat[i,j] <- 1 - (sum(x[i,] == x[j,]) / dim(x)[2])
    }
  } 
  return(cs.mat)
}

Функция работает нормально, но мой фактический набор данных содержит 2560 наблюдений 4 переменных,таким образом, генерируется матрица совпадений 2560 x 2560, и для расчета требуется довольно много времени.Интересно, есть ли более эффективный способ расчета этого или даже если уже есть пакет, который может рассчитать это расстояние различий.Эта матрица будет позже использована в кластерном анализе.

1 Ответ

1 голос
/ 25 сентября 2019

Я думаю, что вы можете использовать outer

add <- function(x, y) sum(mat[x, ] == mat[y,])
nr <- seq_len(nrow(mat))
mat1 <- 1 - outer(nr, nr, Vectorize(add))/ncol(mat)
mat1

#     [,1] [,2] [,3] [,4]
#[1,] 0.00 0.50    1 0.75
#[2,] 0.50 0.00    1 0.25
#[3,] 1.00 1.00    0 1.00
#[4,] 0.75 0.25    1 0.00

Если диагональные элементы должны быть 1 сделать diag(mat1) <- 1.

данные

mat <- structure(c(1, 1, 2, 1, 1, 2, 3, 2, 2, 3, 1, 3, 1, 1, 2, 3), .Dim = c(4L,4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...