如何使用 igraph/tidygraph 创建用于更新节点属性的时间循环?

How to create a time loop for updating node attribute using igraph/tidygraph?

我是 R 的新手。

我正在尝试创建一个时间循环,如果没有通知节点,节点属性的值会随着时间的推移而更新。到目前为止,我有如下内容:

#loading required packages 
library(igraph)
library(tidyverse)
library(ggraph)
library(ggnetwork)
library(tidygraph)

g <- play_erdos_renyi(10, .2)    
M<-matrix(0:1, nrow = 10, ncol = 10)
Periods=10
seeds=c(1,3)

#Seeds are informed 
V(g)$informed <- F
V(g)[seeds]$informed=T
#Seeds have prob 0.5 (just treat prob as any variable here)
V(g)$prob=0
V(g)[seeds]$prob=0.5

#Time loop for creating prob over time
#prob at [t+1]=M*prob at [t]
#calculate prob for vertex v in time t+1 by multiplying 10X10 matrix M with 10X1 vector V(g)$prob
#then considering the v-th row

for (t in 1:Periods) {
  for(v in V(g)) {
    if(!V(g)[v]$informed) {
      V(g)[v]$prob[t+1]= M %*% V(g)$prob[t][v]
    }}}

我收到了

Error in M %*% V(g)$prob[t][v] : non-conformable arguments

我想知道如何解决这个问题。

我认为你应该使用

for (t in 1:Periods) {
  V(g)$prob <- M %*% matrix(V(g)$prob)
}

如果想跟踪动态,可以用Reduce

Reduce(
  function(x, A) A %*% x, 
  rep(list(M), Periods),
  init = matrix(V(g)$prob), 
  accumulate = TRUE
)

这给了你 V(g)$prob 随着时间从 0length(Periods)

的演变
[[1]]
      [,1]
 [1,]  0.5
 [2,]  0.0
 [3,]  0.5
 [4,]  0.0
 [5,]  0.0
 [6,]  0.0
 [7,]  0.0
 [8,]  0.0
 [9,]  0.0
[10,]  0.0

[[2]]
      [,1]
 [1,]    1
 [2,]    2
 [3,]    3
 [4,]    4
 [5,]    5
 [6,]    6
 [7,]    7
 [8,]    8
 [9,]    9
[10,]   10

[[3]]
      [,1]
 [1,]   55
 [2,]  110
 [3,]  165
 [4,]  220
 [5,]  275
 [6,]  330
 [7,]  385
 [8,]  440
 [9,]  495
[10,]  550

[[4]]
       [,1]
 [1,]  3025
 [2,]  6050
 [3,]  9075
 [4,] 12100
 [5,] 15125
 [6,] 18150
 [7,] 21175
 [8,] 24200
 [9,] 27225
[10,] 30250

[[5]]
         [,1]
 [1,]  166375
 [2,]  332750
 [3,]  499125
 [4,]  665500
 [5,]  831875
 [6,]  998250
 [7,] 1164625
 [8,] 1331000
 [9,] 1497375
[10,] 1663750

[[6]]
          [,1]
 [1,]  9150625
 [2,] 18301250
 [3,] 27451875
 [4,] 36602500
 [5,] 45753125
 [6,] 54903750
 [7,] 64054375
 [8,] 73205000
 [9,] 82355625
[10,] 91506250

[[7]]
            [,1]
 [1,]  503284375
 [2,] 1006568750
 [3,] 1509853125
 [4,] 2013137500
 [5,] 2516421875
 [6,] 3019706250
 [7,] 3522990625
 [8,] 4026275000
 [9,] 4529559375
[10,] 5032843750

[[8]]
              [,1]
 [1,]  27680640625
 [2,]  55361281250
 [3,]  83041921875
 [4,] 110722562500
 [5,] 138403203125
 [6,] 166083843750
 [7,] 193764484375
 [8,] 221445125000
 [9,] 249125765625
[10,] 276806406250

[[9]]
              [,1]
 [1,] 1.522435e+12
 [2,] 3.044870e+12
 [3,] 4.567306e+12
 [4,] 6.089741e+12
 [5,] 7.612176e+12
 [6,] 9.134611e+12
 [7,] 1.065705e+13
 [8,] 1.217948e+13
 [9,] 1.370192e+13
[10,] 1.522435e+13

[[10]]
              [,1]
 [1,] 8.373394e+13
 [2,] 1.674679e+14
 [3,] 2.512018e+14
 [4,] 3.349358e+14
 [5,] 4.186697e+14
 [6,] 5.024036e+14
 [7,] 5.861376e+14
 [8,] 6.698715e+14
 [9,] 7.536054e+14
[10,] 8.373394e+14

[[11]]
              [,1]
 [1,] 4.605367e+15
 [2,] 9.210733e+15
 [3,] 1.381610e+16
 [4,] 1.842147e+16
 [5,] 2.302683e+16
 [6,] 2.763220e+16
 [7,] 3.223757e+16
 [8,] 3.684293e+16
 [9,] 4.144830e+16
[10,] 4.605367e+16

只是一个更新,我已经解决了这个问题。答案如下:

#loading required packages 
library(igraph)
library(tidyverse)
library(ggraph)
library(ggnetwork)
library(tidygraph)

g <- play_erdos_renyi(10, .2)    
M<-matrix(0:1, nrow = 10, ncol = 10)
Periods=10
seeds=c(1,2)

#Seeds are informed 
V(g)$informed <- F
V(g)[seeds]$informed=T
#Seeds have prob 0.5 (just treat prob as any variable here)
V(g)$prob=0
V(g)[seeds]$prob=0.5


#Time loop for creating prob over time
#prob at [t+1]=M*prob at [t]
#calculate prob for vertex v in time t+1 by multiplying 10X10 matrix M with 10X1 vector V(g)$prob
#then considering the v-th row

#extract the probs that were just created 
prob <- V(g)$prob

#declare an initial matrix of simulated prob (called sim.prob) 
sim.prob <- matrix(nrow=10 , ncol = Periods+1) #Create empty matrix
sim.prob[,1] <- diag(ncol(M)) %*% c(1:10) #First column is just the id's

for (t in 2:Periods) {
  sim.prob[,t] <- diag(ncol(M)) %*% prob
  sim.prob[,t+1] <- M %*% sim.prob[,t]
  for(v in V(g)) {
    if(!V(g)[v]$informed) {
      V(g)$prob[v]= sim.prob[,t+1][v]
      prob <- V(g)$prob
    }}}