如何比较多个矩阵并计算 R 中的百分比差异

psy*_*sky 4 r matrix

假设这是我的数据示例

nrow<-4
ncol<-5
m1 <- matrix(rbinom(nrow*ncol,1,.5),nrow,ncol)
m2 <- matrix(rbinom(nrow*ncol,1,.5),nrow,ncol)
m3 <- matrix(rbinom(nrow*ncol,1,.5),nrow,ncol)
Run Code Online (Sandbox Code Playgroud)

我需要依次比较 3 个矩阵。根据这个原则。例如

米1

[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 0 1
[2,] 1 1 1 0 1
[3,] 1 0 0 1 1
[4,] 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)

平方米

[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 1
[2,] 0 1 1 0 0
[3,] 1 0 0 0 0
[4,] 0 1 0 1 0
Run Code Online (Sandbox Code Playgroud)

。现在计算矩阵每列中的匹配数。取两个矩阵的第一列

    m1 m2

    1 1 matched values
    1 0 values did not match
    1 1 matched values
    0 0 matched values
Run Code Online (Sandbox Code Playgroud)

总共,矩阵m1和的第一列中的 4 个值中有m23 个一致。事实证明,75% 的值是一致的。

然后取第二列

 m1   m2
[,2] [,2] 
0     0 matched values
1     1 matched values
0     0 values did not match
0     1 values did not match
Run Code Online (Sandbox Code Playgroud)

这里还有一个类似的情况,其中 3 个值重合

换句话说,作为所需的输出,必须有类似的东西

[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 0 1
[2,] 1 1 1 0 1
[3,] 1 0 0 1 1
[4,] 0 0 0 1 0


    [,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 1
[2,] 0 1 1 0 0
[3,] 1 0 0 0 0
[4,] 0 1 0 1 0
    75 75 75 75 50 
Run Code Online (Sandbox Code Playgroud)

现在让我们计算收到的百分比的平均值。= 70%

(75+75+75+75+50)/5=70
Run Code Online (Sandbox Code Playgroud)

计算所有矩阵之间的百分比差异的最简单方法是什么?首先在m1和 之间m2,然后在m1和 之间m3,最后在m2和 之间m3

感谢您的帮助

Tho*_*ing 7

这是两个基本 R 选项

  • combn+mean

combn生成组合对,并mean给出共现的平均值。

combn(
    lst,
    2,
    \(x) mean(do.call(`==`,x))
)
Run Code Online (Sandbox Code Playgroud)

你将获得

[1] 0.5 0.4 0.5
Run Code Online (Sandbox Code Playgroud)
  • adist+toString

这种方法生成一个描述共现的矩阵。

> 1 - adist(unlist(lapply(lst, toString))) / lengths(lst)
     [,1] [,2] [,3]
[1,]  1.0  0.5  0.4
[2,]  0.5  1.0  0.5
[3,]  0.4  0.5  1.0
Run Code Online (Sandbox Code Playgroud)

数据

set.seed(0)
nrow <- 4
ncol <- 5
m1 <- matrix(rbinom(nrow * ncol, 1, .5), nrow, ncol)
m2 <- matrix(rbinom(nrow * ncol, 1, .5), nrow, ncol)
m3 <- matrix(rbinom(nrow * ncol, 1, .5), nrow, ncol)

lst <- list(m1, m2, m3)
Run Code Online (Sandbox Code Playgroud)