Не удается получить веса ребер для учета в оценках центральности временной сети.

Подмножество моих данных для временной сети, как показано ниже:

edge <- data.frame(onset = c(1968, 1968, 2007),
               terminus = c(1968, 1968, 2007),
               id_from = c(1, 1, 2),
               id_to = c(3, 2, 4),
               weight = c(1, 3, 2))

vert <- data.frame(onset = c(1968, 1968, 1980, 1978),
               terminus = c(2017, 2017, 2017, 2017),
               vertex_id = c(1, 2, 3, 4),
               abb.name = c("UK", "US", "Germany", "Pakistan"))

# Create networkDynamic object
netd <- networkDynamic(vertex.spells = vert[,c(1,2,3,4)],
                   edge.spells = edge[,c(1,2,3,4,5)],
                   create.TEAs = TRUE,
                   edge.TEA.names = "weight")

vert$abb.name <- as.character(vert$abb.name)

# Set vertex attributes
set.vertex.attribute(netd, "abb.name", as.vector(vert$abb.name))
network.vertex.names(netd)<-vert$abb.name

# Collapse network to look at 1968 network
net68 <- network.collapse(netd,
                      at = 1968, 
                      rm.time.info = FALSE,
                      rule = "latest")
# Get centrality score
degree(net68)

Однако это возвращает оценки центральности, которые не учитывают веса.

[1] 1 1

Как я могу убедиться, что networkDynamic учитывает, что (1) веса в год значительны, поэтому он не рассчитывает множественные связи между одними и теми же двумя странами как одно ребро в агрегированной сети, (2) веса подсчитываются в центральности набирает правильные баллы и (3) получить вывод degree(), включающий название страны? В идеале я хотел бы получить оценки центральности для каждой страны в каждом сегменте сети с 1968 по 2017 год.


person 1984    schedule 21.11.2017    source источник


Ответы (2)


Кажется, это ошибка или отсутствие документации. Спасибо за сообщение. Это должно работать на данный момент:

degree(as.edgelist.sna(net68, "weight"))
person Michał    schedule 13.12.2017
comment
чтобы дать больше фона degree в пакете sna в основном ожидает матрицу в качестве входных данных, поэтому вы должны указать, как должен быть преобразован объект network: должен ли он просто считать ребра? какой атрибут следует использовать для весов ребер? так что это также работает с тем же результатом: degree(as.matrix(net68,attrname='weight')) - person skyebend; 16.05.2019

Чтобы частично ответить на вашу часть (3), пакет tsna предоставляет функцию tSnaStats() как способ применения метрик из пакета sna в несколько моментов времени к объекту networkDynamic и получения результата в виде временного ряда.

> library(tsna)
> tSnaStats(netd,'degree')
Time Series:
Start = 1968 
End = 2017 
Frequency = 1 
     UK US Germany Pakistan
1968  1  1       1        1
1969  0  0       0        0
1970  0  0       0        0
1971  0  0       0        0
1972  0  0       0        0
1973  0  0       0        0
1974  0  0       0        0
...
2007  0  1       0        1
2008  0  0       0        0
2009  0  0       0        0
2010  0  0       0        0
2011  0  0       0        0
2012  0  0       0        0
2013  0  0       0        0
2014  0  0       0        0
2015  0  0       0        0
2016  0  0       0        0

К сожалению, хотя tSnaStats() может передавать аргументы функции degree(), я не вижу простого способа указать ей использовать атрибут weight при создании матрицы для каждой временной точки.

person skyebend    schedule 16.05.2019