生成重合矩阵的有效方法

时间:2019-09-25 07:48:59

标签: r matrix cluster-analysis

我想生成一个简单的重合矩阵,我一直在寻找R包,但到目前为止找不到能进行这种计算的包,我不知道该矩阵的英文术语是否与葡萄牙语的术语不同。 ..所以,这就是我要做的。

我有一个矩阵:

Action

将计算出一个符合矩阵,逐行比较每个元素,以产生具有以下公式的相异距离:

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

因此,我得到的矩阵是一个对称的矩阵,其暗角为4x4,对角线元素等于0,因此在示例中,我的A(1,2)为:

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

依此类推...

我创建了一个函数来生成此矩阵:

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

该函数运行良好,但我的实际数据集对25个观测值的4个变量进行了观测,因此生成了2560 x 2560的重合矩阵,并且需要花费一些时间来进行计算。我想知道是否有一种更有效的方法来计算该距离,或者是否已经有一个可以计算这种相异距离的程序包。稍后将在聚类分析中使用此矩阵。

1 个答案:

答案 0 :(得分:1)

我认为您可以使用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))