Подтвердить что ты не робот

Возврат взвешенного графика дает NA

Предыдущий ответ на другой вопрос предоставил некоторый код для переустановки взвешенного графика как:

g <- graph.ring(10)
E(g)$weight <- seq_len(ecount(g))
E(g)$weight
# [1]  1  2  3  4  5  6  7  8  9 10
is.weighted(g)
# [1] TRUE
g2 <- rewire(g,niter=3)
plot(g2)
is.weighted(g2)
# [1] TRUE

Воспроизведение с помощью этого кода, однако, показывает, что NAs вводятся в вектор весовых границ:

set.seed(1) 
g <- graph.ring(10) 
E(g)$weight <- seq_len(ecount(g)) 
E(g)$weight 
# [1] 1 2 3 4 5 6 7 8 9 10 
is.weighted(g) 
# [1] TRUE 
g2 <- rewire(g,niter=3) 
E(g2)$weight 
# [1] 1 2 4 5 6 7 9 NA NA NA 
is.weighted(g2) 
# [1] TRUE

После этого у меня есть два связанных вопроса:

1) Самый простой способ исправить проблему NA, чтобы просто перераспределить ребра вручную, как в:

g2 <- rewire(g,niter=3) 
E(g2)$weight <- sample( seq_len(ecount(g)) )

или есть лучший способ, которым мы можем исправить это в igraph или по крайней мере объяснить, что происходит в igraph, чтобы это произошло?

2) Есть ли система переустановки, которая также рандомизирует весы так, чтобы сеть сохраняла свою полную прочность, но оба бинарных ребра перезаписываются, а отдельные веса ребер по краям меняются набухание?

например. не просто

id  id w
A - B  6
C - D  1
E - F  1

to

id  id w
A - C  6
D - E  1
B - F  1

but also does:
id  id w
A - B  6
C - D  1
E - F  1

to

id  id w
A - C  4
D - E  3
B - F  1
4b9b3361

Ответ 1

1) Перераспределение ребер вручную довольно просто. Но еще один простой способ - пометить ребра и затем переставить метки, например:

V(g)$name <- letters[1: ecount(g)]
E(g)
# + 10/10 edges (vertex names):
#  [1] a--b b--c c--d d--e e--f f--g g--h h--i i--j a--j
E(g)$weight
# [1]  1  2  3  4  5  6  7  8  9 10

V(g)$name <- sample(letters[1: ecount(g)])
E(g)
# + 10/10 edges (vertex names):
#  [1] g--h h--c c--d d--e e--j j--a a--b b--f f--i g--i
E(g)$weight
# [1]  1  2  3  4  5  6  7  8  9 10

# visualize:
plot(g, edge.width = E(g)$weight)

Причина появления NA, которую вы видели: для любого края, которое выживает при перепродаже, igraph может сохранить свой вес. Но для новых краев у него нет веса, чтобы назначить ему, поэтому назначает NA. С другой стороны, просто перебирая вершины, как указано выше, исходные веса сохраняются, когда ребра перетасовываются (как видно из графика), поэтому нет NA.

2) Я не знаю такой перезаписи, но вы можете переназначить весы ребер, которые вы рисуете из целочисленного раздела на общий вес, например:

w <- sum(E(g)$weight)
s <- sample(w, size = ecount(g) - 1)
E(g)$weight <- c(sort(s), w) - c(0, sort(s))
sum(E(g)$weight) == w
# [1] TRUE
plot(g, edge.width = E(g)$weight)

или вы можете сделать это, используя пакет разделов, упомянутый здесь