我想使用 Barabási–Albert (BA) 优先依恋模型来生成具有指定属性的图形。 顶点和边的数量:分别为V(g)=20、E(g)=72。入度和出度向量也是已知的。我想生成没有循环、多条边和孤立顶点的有向图。
有人可以提供一些如何设置函数 barabasi.game() 参数的想法吗?我当前的设置是:
out_seq<-degree(g, mode="out")
sum(out_seq)
#[1] 72
g1<-barabasi.game(20,out.seq = out_seq)
summary(g1)
#IGRAPH D--- 20 62 -- Barabasi graph
#+ attr: name (g/c), power (g/n), m (g/x), zero.appeal (g/n),
#| algorithm (g/c)
has.multiple(g1)
#[1] FALSE
之前我使用过函数 Degree.sequence.game()
。它可以工作,但我必须删除参数:method="vl"
degs_out <- degree(g, mode="out")
degs_in <- degree(g, mode="in")
g1<-degree.sequence.game(degs_out, degs_in)#, method="vl")
# IGRAPH D D--- 20 72 -- Degree sequence random graph
#+ attr: name (g/c), method (g/c)
谢谢。
编辑。 vl
和 v1
不同。在第一种情况下,vl
是两个字母 v
和 l
,在第二种情况下,v1
包括字母 >v
和数字 1
。
最佳答案
我知道这个问题已经存在了一段时间,但希望我下面的回答可以为将来类似情况提供引用。
首先,您需要创建一个 out.seq
向量,其总和为 72,如 @LiorKogan 所建议。您可以通过检查this post来做到这一点出去。这是实现此任务的函数:
rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
vec <- rnorm(N, M/N, sd)
if (abs(sum(vec)) < 0.01) vec <- vec + 1
vec <- round(vec / sum(vec) * M)
deviation <- M - sum(vec)
for (. in seq_len(abs(deviation))) {
vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
}
if (pos.only) while (any(vec < 0)) {
negs <- vec < 0
pos <- vec > 0
vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
vec[pos][i] <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
}
vec
}
由于进入网络的初始节点无法与许多其他节点连接(因为它们还不存在!),因此您必须在向量 init_nodes
中手动设置它们的连接,即:节点 1 没有与任何人连接,节点 2 仅与节点 1 连接,节点 3 与两者都连接...依此类推。
nodes=20
edges=72
init_nodes <- c(0,1,2,3,4)
对于向量的“其余部分”,我们使用上面的函数,使整个向量加起来为 72:
out_seq = c(init_nodes,rand_vect(nodes-length(init_nodes), edges-sum(init_nodes),pos.only = TRUE))
上面的例程可能需要改进,但在我的所有尝试中它都运行得相当好。完成此操作后,您可以检查规则是否有效。加起来必须是 72:
sum(out_seq)
现在您可以使用向量 out_seq
继续进行 Barabasi 游戏
graph01 <- barabasi.game(nodes,
directed = TRUE,
out.seq = out_seq
)
创建图形后,您可以仔细检查是否满足 72 条边的要求:
ecount(graph01)
最后将向量out.seq
与实际度数结构进行比较:
degree(graph01, loops = FALSE, normalized=FALSE, mode="out")
out_seq
最后,询问 R
你的图表是否简单:
is_simple(graph01)
希望对您有帮助!祝你好运!
关于r - Barabási模型参数如何设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484099/