我想生成一个简单的重合矩阵,我一直在寻找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的重合矩阵,并且需要花费一些时间来进行计算。我想知道是否有一种更有效的方法来计算该距离,或者是否已经有一个可以计算这种相异距离的程序包。稍后将在聚类分析中使用此矩阵。
答案 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))