Как включить матрицу смежности в уравнение (сетевое моделирование) - PullRequest
0 голосов
/ 15 января 2020

Я создал небольшую всемирную сеть с 16 агентами с igraph:

myNetwork <- sample_smallworld(dim = 1, nei = 1, size = 16, p = 0.1) #generate small world
plot(myNetwork, vertex.size=20, vertex.label=c(1:16), layout=layout_in_circle) #inspect the network

this is myNetwork

В отдельном фрейме данных stack, У меня есть мнение каждого из этих агентов (opinion1):

> stack
   agent   opinion1
1      1 0.71979146
2      2 0.25040406
3      3 0.50866647
4      4 0.53713674
5      5 0.53954982
6      6 0.23903034
7      7 0.03989347
8      8 0.29350197
9      9 0.85441826
10    10 0.44565889
11    11 0.28223782
12    12 0.39748249
13    13 0.17488017
14    14 0.08804374
15    15 0.61174168
16    16 0.30949636

Теперь я хочу вычислить обновленное мнение каждого agent (назовем его opinion2), применяя это уравнение где networkNeighborsOpinion1 относится к opinion1 агентам, которые подключены в myNetwork:

opinion2 <- 0.5 * opinion1 * 0.5 * (mean(networkNeighborsOpinion1))

С учетом myNetwork и DF$opinion1, как я могу эффективно применить это уравнение для каждого агента?


Вот мои мысли до сих пор ...

Из myNetwork, соответствующая матрица смежности может быть получена следующим образом:

adjMatrix <- as.matrix(as_adjacency_matrix(myNetwork, names = TRUE, edges = FALSE))
adjMatrix[adjMatrix == 0] <- NA #turn all 0s into NAs 
> adjMatrix
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,]   NA    1   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [2,]    1   NA    1   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [3,]   NA    1   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA     1    NA
 [4,]   NA   NA   NA   NA    1   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [5,]   NA   NA   NA    1   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [6,]   NA   NA   NA   NA   NA   NA    1   NA   NA    NA    NA    NA    NA     1    NA
 [7,]   NA   NA   NA   NA   NA    1   NA    1   NA    NA    NA    NA    NA    NA    NA
 [8,]   NA   NA   NA   NA   NA   NA    1   NA    1    NA    NA    NA    NA    NA    NA
 [9,]   NA   NA   NA   NA   NA   NA   NA    1   NA     1    NA    NA    NA    NA    NA
[10,]   NA   NA   NA   NA   NA   NA   NA   NA    1    NA     1    NA    NA    NA    NA
[11,]   NA   NA   NA   NA   NA   NA   NA   NA   NA     1    NA     1    NA    NA    NA
[12,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA     1    NA     1    NA    NA
[13,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA     1    NA     1    NA
[14,]   NA   NA    1   NA   NA    1   NA   NA   NA    NA    NA    NA     1    NA     1
[15,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA     1    NA
[16,]    1   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA     1

Каждый agent представлен строкой в ​​adjMatrix, а каждое сетевое соединение обозначено значением 1.

Тогда, похоже, должно быть способ использования каждой строки adjMatrix для вызова соответствующих значений из stack$opinion1 и генерации вектора networkNeighborsOpinion1, который затем можно использовать для вычисления opinion2 для каждого агента , Обратите внимание, что я изменил 0 в adjMatrix на NA, что следует из моего мнения, что каждая строка может быть умножена на соответствующие значения в stack$opinion1 (т.е. каждый opinion1 либо умножается на 1, либо NA, что может затем введите как mean(networkNeighborsOpinion1, na.rm = TRUE))

Любое направление по этому вопросу будет оценено. Возможно for l oop или функция?

1 Ответ

1 голос
/ 15 января 2020

Умножьте матрицу смежности на opinion1 и разделите на сумму соответствующих строк в матрице смежности. Затем усредните, что с opinion1.

adjMatrix <- as.matrix(as_adjacency_matrix(myNetwork, names = TRUE, edges = FALSE))
0.5 * stack$opinion1 + 0.5 * (adjMatrix %*% stack$opinion1) / rowSums(adjMatrix)

Примечание

stack воспроизводимой формы составляет:

Lines <- "   agent   opinion1
1      1 0.71979146
2      2 0.25040406
3      3 0.50866647
4      4 0.53713674
5      5 0.53954982
6      6 0.23903034
7      7 0.03989347
8      8 0.29350197
9      9 0.85441826
10    10 0.44565889
11    11 0.28223782
12    12 0.39748249
13    13 0.17488017
14    14 0.08804374
15    15 0.61174168
16    16 0.30949636"
stack <- read.table(text = Lines)
...