重新连接加权图会产生 NA

标签 r graph igraph

上一个answer到另一个question提供了一些代码来重新连接加权图:

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

然而,使用此代码表明 NA 被引入到边缘权重向量中:

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

最佳答案

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)

或者您可以使用提到的分区包here来做到这一点

关于重新连接加权图会产生 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38896812/

相关文章:

c - 快速读取文件

python - 将 python-igraph 图转换为 networkx

r - 在 R 中建立家庭嵌套树父/子关系

arrays - 在 df1 中的键数组中查找 df2 中的键并合并相应的值

R如何仅计算营业时间的 "task time"

python - 基于动态值更新 Matplotlib 中的轴

c++ - "excess elements in scalar initializer"使用 igraph C 库生成具有幂律度分布的网络时

python - 获取多个 Pandas DataFrame 的平均值

javascript - DataTable 中的 Actionbutton 不起作用,Shiny DT

algorithm - 深度优先搜索优于广度优先搜索,反之亦然