先前的回答另一个问题提供了一些代码来重新连接一个加权图如下:
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
Run Code Online (Sandbox Code Playgroud)
但是,使用此代码可以看出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
Run Code Online (Sandbox Code Playgroud)
接下来我有两个相关的问题:
1)解决NA问题的最简单方法是手动重新分配边缘,如下所示:
g2 <- rewire(g,niter=3)
E(g2)$weight <- sample( seq_len(ecount(g)) )
Run Code Online (Sandbox Code Playgroud)
或者是否有更好的方法可以纠正这个问题,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
Run Code Online (Sandbox Code Playgroud)
小智 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)
Run Code Online (Sandbox Code Playgroud)
您看到 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)
Run Code Online (Sandbox Code Playgroud)
或者您可以使用此处提到的分区包来做到这一点
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |