"sna" или "igraph": почему я получаю разные значения степени для неориентированного графа? - PullRequest
2 голосов
/ 14 февраля 2020

Я делаю базовый c анализ сети с использованием сетей из пакета R "networkdata". Для этого я использую пакет «igraph», а также «sna». Однако я понял, что результаты описательной статистики сети варьируются в зависимости от пакета, который я использую. Большинство вариаций не слишком серьезны, но средняя степень моего неориентированного графа уменьшилась вдвое, как только я переключился с «sna» на «igraph».

library(networkdata)
n_1 <- covert_28

library(igraph)
library(sna)

n_1_adjmat <- as_adjacency_matrix(n_1)
n_1_adjmat2 <- as.matrix(n_1_adjmat)

mean(sna::degree(n_1_adjmat2, cmode = "freeman")) # [1] 23.33333
mean(igraph::degree(n_1, mode = "all")) # [1] 11.66667

Этого не происходит в случае моего ориентированного графа. Здесь я получаю одинаковые результаты независимо от использования «sna» или «igraph».

Есть ли объяснение этому явлению? И если да, могу ли я что-нибудь сделать, чтобы этого не случилось?

Заранее спасибо!

1 Ответ

1 голос
/ 16 февраля 2020

Это объясняется в документации для sna :: Степень.

Степень вершины, v, соответствует мощности множества вершин N ^ + (v) = {i в V (G): (i, v) в E (G)}; outdegree соответствует мощности множества вершин N ^ - (v) = {i в V (G): (v, i) в E (G)}; и общая (или «Фримен») степень соответствует | N ^ + (v) | + | N ^ - (v) |.

(Обратите внимание, что для простых графиков

indegree = outdegree = total степени / 2.)

Более простой пример, чем ваш, проясняет это.

library(igraph)
library(sna)

g = make_ring(3)
plot(g)

Simple ring graph with three nodes

AM = as.matrix(as_adjacency_matrix(g))
sna::degree(AM)
[1] 4 4 4

igraph::degree(g)
[1] 2 2 2

В вершине 1 есть ссылки на обе вершины 2 и 3. Они учитываются в градусах, а также в out-градус, так что
Freeman = in + out = 2 + 2 = 4
«Примечание» в документации гласит это.

...