一个组合网络分析和 igraph/r 问题。它与数学交叉发布(希望我不会被嘲笑)。
我正在尝试找到无向加权图的分类系数。边有权重,反映节点之间的价值流动(如果你好奇,这是一个交易者之间交换商品的市场图表)。
我看到标准的Newman (2002)分类实现可以应用于加权网络,用度数强度代替度数,ala
(其中i索引图的M条边,F(i) 表示由链接i连接的两个节点的集合,s_\phi 是强度或总权重;连接到节点 \phi 的边权重的总和。)
我看到这是由 r 包igraph通过 实现的assortativity(g, types1 = graph.strength(g))
,其中 types1 是节点权重。
问题
如果s_\phi只是度数,则可以使用总度数或剩余度数,无论哪种方式,您都会得到相同的答案。但是,使用总权重(graph.strength(g)
如上),我担心在我的分类指标中引入向上偏差,因为每个节点权重都包括我们正在迭代的边权重(连接这两个节点的边)。虽然我目前无法指出引用,但似乎我们应该找到剩余权重的相关性。
也就是说,上面的s_\phi是连接到节点\phi的边上的权重之和,包括连接它们的边,应该是剩余的权重;连接到节点\phi的边上的权重总和,边i除外。
首先,我很好奇这是否是一个问题?使用这种类型的图表,使用节点权重的分类是否会影响我的相关性估计?没关系吗?
其次,我很好奇这是否可以通过 r 中的 igraph 包或 networkX python 库实现。也许是加权度数依赖的最近邻度数的实现?看起来不像,但我想我会问。
我举了一个例子来告诉你我的意思:
设置
library(igraph)
g <- read.table(
text =
" a b c d e f
a 0 4 5 8 1 0
b 4 0 1 4 8 9
c 5 1 0 4 1 0
d 8 4 4 0 2 7
e 1 8 1 2 0 1
f 0 9 0 7 1 0
",
header = T
)
g <- as.matrix(g)
g <- graph.adjacency(g, mode="undirected", weighted=TRUE)
E(g)$width <- E(g)$weight; plot(g)
图形
assortativity.degree(g) # degree assortativity (ie unweighted)
[1] -0.4444444
assortativity(g, types1 = graph.strength(g), directed = F) #assortativity with weights
[1] -0.2421219
我的剩余重量分类
assortativity.weightEdge <- function(g){
linkedNodes <- data.frame(
n1 = rep(NA, length(E(g))),
n2 = rep(NA, length(E(g))),
s1 = rep(NA, length(E(g))),
s2 = rep(NA, length(E(g))),
s1_remaining = rep(NA, length(E(g))),
s2_remaining = rep(NA, length(E(g))),
k_nn_1 = rep(NA, length(E(g))),
k_nn_2 = rep(NA, length(E(g)))
)
# standard Newman 2002, http://arxiv.org/pdf/cond-mat/0205405v1.pdf
# but usign the "remaining strengths"
num1 = 0
num2 = 0
den1 = 0
#iterate over edges
for (i in 1:length(E(g))){
n1 = ends(g,E(g))[i,1]
n2 = ends(g,E(g))[i,2]
s1 = sum(g[n1,]) - g[n1,n2] # stregth of "remaining" connected nodes
s2 = sum(g[n2,]) - g[n1,n2] # "
linkedNodes$n1[i] <- n1
linkedNodes$n2[i] <- n2
linkedNodes$s1_remaining[i] <- s1
linkedNodes$s2_remaining[i] <- s2
num1 = num1 + s1 * s2
num2 = num2 + s1 + s2
den1 = den1 + (s1^2 + s2^2)
}
num1 = num1 / length(E(g))
num2 = num2 / (length(E(g)) * 2)
num2 = num2 * num2
den1 = den1 / (length(E(g)) * 2)
print(
paste(
"Assortativity, remaining weights:",
(num1-num2) / (den1-num2))
)
##########
num1 = 0
num2 = 0
den1 = 0
#iterate over edges
for (i in 1:length(E(g))){
n1 = ends(g,E(g))[i,1]
n2 = ends(g,E(g))[i,2]
s1 = sum(g[n1,])
s2 = sum(g[n2,])
linkedNodes$s1[i] <- s1
linkedNodes$s2[i] <- s2
num1 = num1 + s1 * s2
num2 = num2 + s1 + s2
den1 = den1 + (s1^2 + s2^2)
}
num1 = num1 / length(E(g))
num2 = num2 / (length(E(g)) * 2)
num2 = num2 * num2
den1 = den1 / (length(E(g)) * 2)
print(
paste(
"Assortativity, total weights:",
(num1-num2) / (den1-num2))
)
return(linkedNodes)
}
返回:
assortativity.weightEdge(g)
[1] "Assortativity, remaining weights: -0.3579013116802"
[1] "Assortativity, total weights: -0.242121917988836"
n1 n2 s1 s2 s1_remaining s2_remaining k_nn_1 k_nn_2
1 a b 18 26 14 22 NA NA
2 a c 18 11 13 6 NA NA
3 a d 18 25 10 17 NA NA
4 a e 18 13 17 12 NA NA
5 b c 26 11 25 10 NA NA
6 b d 26 25 22 21 NA NA
7 b e 26 13 18 5 NA NA
8 b f 26 17 17 8 NA NA
9 c d 11 25 7 21 NA NA
10 c e 11 13 10 12 NA NA
11 d e 25 13 23 11 NA NA
12 d f 25 17 18 10 NA NA
13 e f 13 17 12 16 NA NA
对于一些证据,请注意总权重分类匹配 igraph。正如所怀疑的那样,剩余的权重分类比用总权重得出的要低一些。