Как создать однорежимную сеть (матрицу смежности) на основе совпадений из двухрежимной сети - PullRequest
1 голос
/ 09 февраля 2020

Я работаю с данными опроса (строка = респонденты; col = мнение) и пытаюсь создать однорежимную матрицу смежности среди респондентов, которая измеряет количество раз, когда они давали одинаковые ответы для каждой сети диад. В частности,

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")
)

Так что между Алиссой и Карлой их связь получает 2 потому что они оба ответили одинаково для мнения1 и мнения2. Точно так же связь между Алиссой и Брэдом получает 1, потому что они оба ответили 0 по мнению3.

Я искал код get.adjacency () и bipartite.projection, но, похоже, он имеет дело только с сетью человек-событие, где только значение 1 рассматривается как совпадение. Есть ли пакет R, который позволяет мне сделать это, или мне нужно создать свой собственный l oop вручную (если так ... как ??)?

Спасибо !!

1 Ответ

0 голосов
/ 09 февраля 2020

Возможно, существует готовое решение, о котором я не знаю. Однако в этом конкретном (двоичном) случае можно перекодировать матрицу, умножить каждую на ее транспонирование и, наконец, сложить их вместе:

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
...