【问题标题】:How to incorporate adjacency matrix into equation (network simulation)如何将邻接矩阵并入方程(网络模拟)
【发布时间】:2023-12-25 08:41:01
【问题描述】:

我用igraph 生成了一个包含 16 个代理的小型世界网络:

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

在单独的数据框中,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 指的是myNetwork 中连接的代理的opinion1s :

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

给定 myNetworkDF$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

每个agentadjMatrix中的一行表示,每个网络连接用1的值表示。

然后,似乎应该有办法使用adjMatrix 的每一行从stack$opinion1 调用适当的值并生成networkNeighborsOpinion1 的向量,然后可以使用该向量计算opinion2每个代理。请注意,我已将 adjMatrix 中的 0 更改为 NA,这遵循了我的想法,即每一行都可以乘以 stack$opinion1 中的相应值(即,每个 opinion1 要么乘以 1,要么乘以 NA,这可以然后输入为mean(networkNeighborsOpinion1, na.rm = TRUE))

对此的任何指导将不胜感激。也许是for 循环或函数?

【问题讨论】:

    标签: r simulation igraph


    【解决方案1】:

    将邻接矩阵乘以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)
    

    【讨论】:

      最近更新 更多