Как установить граничный атрибут для сети, используя statnet в R? - PullRequest
0 голосов
/ 31 марта 2019

Я готовлю некоторые сетевые данные для запуска ERGM в R с использованием библиотеки statnet.Я хочу назначить атрибут для ребер, который я буду использовать при запуске ERGM.В матрицу входят числа от 0 до 1 для каждой связи в сети.Я получаю сообщение об ошибке, когда использую set.edge.attribute, который говорит: «недопустимое значение, указанное в set.edge.attribute».

Сначала я подумал, что может быть проблема со значениями в матрице, содержащей атрибут, который я хотел бы добавить.Чтобы проверить это, я создал матрицу со случайными числами и снова запустил код set.edge.attribute, но все равно получил ошибку.

Я импортировал сеть и атрибут edge в виде файлов CSV, преобразовал сетевой файл в сетевой объект и преобразовал атрибут edge в матрицу.Атрибут ребра имеет то же количество ребер, что и сеть.

library(statnet)
NetworkGraph = network(NetworkData,type="adjacency", directed=FALSE)
EdgeInfo = as.matrix(EdgeInfo) 
NetworkGraph<-set.edge.attribute(NetworkGraph,"edge_attribute", EdgeInfo)

Чтобы сгенерировать матрицу атрибутов для проверки этого, я использовал runif для создания новой матрицы, но у меня все еще была та же ошибка):

Test = matrix(runif(23*23), nrow=23, ncol=23)
NetworkGraph<-set.edge.attribute(NetworkGraph,"edge_attribute", Test)

Что может сделатьэто работа?

1 Ответ

0 голосов
/ 16 мая 2019

Один из способов сделать это - создать сеть из матрицы значений:

> library(network)

# create a small test matrix
> gvalues<-matrix(runif(5*5),nrow=5,ncol=5)
> gvalues
          [,1]       [,2]      [,3]       [,4]       [,5]
[1,] 0.6456140 0.88881086 0.2855281 0.79027269 0.01526509
[2,] 0.4825466 0.64184675 0.4456986 0.44277690 0.27018424
[3,] 0.5276330 0.04742485 0.7675878 0.05453299 0.36940432
[4,] 0.3188620 0.52574674 0.1642077 0.07034616 0.60229633
[5,] 0.3741370 0.22432400 0.8093938 0.24704229 0.29042967

# convert to network object, telling it to *not* ignore edge values
# and also name the edge values 'testValue'
> g <- as.network(gvalues,ignore.eval = FALSE, loops=TRUE, names.eval='testValue')

# check that the edge value was added. since it was a full matrix, it should be a 'complete' network with 25 edges connecting all nodes
> g
 Network attributes:
  vertices = 5 
  directed = TRUE 
  hyper = FALSE 
  loops = TRUE 
  multiple = FALSE 
  bipartite = FALSE 
  total edges= 25 
    missing edges= 0 
    non-missing edges= 25 

 Vertex attribute names: 
    vertex.names 

 Edge attribute names: 
    testValue 

# convert network back to a matrix to check if it worked
> as.matrix(g,attrname = 'testValue')
          1          2         3          4          5
1 0.6456140 0.88881086 0.2855281 0.79027269 0.01526509
2 0.4825466 0.64184675 0.4456986 0.44277690 0.27018424
3 0.5276330 0.04742485 0.7675878 0.05453299 0.36940432
4 0.3188620 0.52574674 0.1642077 0.07034616 0.60229633
5 0.3741370 0.22432400 0.8093938 0.24704229 0.29042967

Я включил аргумент loops=TRUE, потому что входная матрица имеет значения по диагонали, в противном случаеэто не нужноЕсли вы добавляете атрибуты ребер в существующую сеть из matrix, вам нужно использовать set.edge.value() вместо set.edge.attribute().Это плохо документировано.

...