如何根据双模网络的匹配创建单模网络(邻接矩阵)

How to create a one-mode network (adjacency matrix) based on matches from two-mode network

我正在处理调查数据(行=受访者;列=意见)并尝试在受访者之间创建一个单模邻接矩阵,以衡量他们对每个二元网络给出相同答案的次数。具体来说,

affiliation_matrix <- matrix(c(
  0,1,0,
  1,0,0,
  0,1,1
)
,nrow=3
,ncol=3,
byrow=TRUE)

dimnames(affiliation_matrix) <- list(
  c("Alyssa", "Brad", "Carla"),
  c("opinion1", "opinion2", "opinion3")
)

affiliation_matrix

在上面的 3x3 矩阵示例中,我想创建一个看起来像

的矩阵
ideal_matrix <- matrix(c(
  1,1,2,
  1,1,0,
  2,0,2
)
,nrow=3
,ncol=3,
byrow=TRUE)

dimnames(ideal_matrix) <- list(
  c("Alyssa", "Brad", "Carla"),
  c("Alyssa", "Brad", "Carla")
)

所以在 Alyssa 和 Carla 之间,他们的联系得到了 2,因为他们对意见 1 和意见 2 的回答相同。同样,Alyssa 和 Brad 之间的联系得到 1,因为他们在意见 3 中都回答了 0。

我正在查找代码 get.adjacency() 和 bipartite.projection,但这似乎只处理人事网络,其中只有值 1 被视为匹配项。是否有 R 包可以让我这样做,或者我是否需要手动创建自己的循环(如果是这样......如何??)?

谢谢!!

可能有我不知道的现成解决方案。然而,在这种特殊的(二进制)情况下,可以重新编码矩阵,将每个矩阵乘以其转置,最后将它们相加:

affiliation_matrix_recoded <- affiliation_matrix
affiliation_matrix_recoded[] <- ifelse(affiliation_matrix_recoded > 0, 0, 1)

a <- tcrossprod(affiliation_matrix)
b <- tcrossprod(affiliation_matrix_recoded )

r <- a + b
diag(r) <- 0
r

结果:

       Alyssa Brad Carla
Alyssa      0    1     2
Brad        1    0     0
Carla       2    0     0