Я создал небольшую всемирную сеть с 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](https://i.stack.imgur.com/rYy9P.png)
В отдельном фрейме данных 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 или функция?