从数据集中在R中建立有向网络图

时间:2019-02-28 15:59:41

标签: r network-programming igraph directed-graph

我无法从R中的数据集(10列的数据表)创建有向图(使用igraph包)。任务如下:我需要构建有向图(网络),其中如果X邀请Y到平台,则将X个人连接到Y个人。最终,我需要确定网络中最长链的大小并计算聚类系数。

在过滤了我的dt之后,dt.user由以下两列组成:user_id,invitor_id。

user_id: user identification
inviter_id: id of the user that invited this user to the platform

清除数据(删除所有NA值)后,我正在尝试进行这项工作,但是由于我的聚类系数为0,因此我不确定是否以正确的方式进行操作(这似乎不太可能):

all.users <- dt.users[, list(inviter_id, user_id)]

g.invites.network <- graph.data.frame(all.users, directed = TRUE)

我尝试过切换连接的方向,但是在直径和聚集系数方面我仍然得到相同的结果:

all.users <- dt.users[, list(user_id, inviter_id)]

我的问题是,我的有向图是否错误?如果是这样,我在做什么错?我相信我的答案是错误的,因为聚类系数为0。在我看来,这个网络似乎根本没有形成聚类的可能性很小。我应该保留...list(inviter_id), user_id而不是...list(user_id, inviter_id)吗?

样本数据(40行):

dt.users <- data.table::data.table(
  inviter_id = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 23L, 22L, 31L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 63L, 4L, 4L, 4L), 
  user_id = c(17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 32L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 58L, 59L, 60L, 64L, 71L, 75L, 76L, 78L)
)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

至少对于您的样本数据而言,0是正确的答案,我怀疑由于其构造方式,对于您的完整数据集,这始终是正确的。

我假设当您说您正在计算“聚类系数”时,您正在计算的确transitivity(g.invites.network)给出了零作为答案。根据文档:

  

这只是图中三角形和相连的三元组的比率。   对于有向图,将忽略边缘的方向。

当然,我不确定您的数据是如何构造的,但是看来只有一个人会因邀请任何其他用户而获得“信用”,也就是说,永远不会有两个箭头进入一个顶点。假设是这样,您的数据将从不具有任何三角形。因此,“三角形和图中三边形的比率”的分子为零,并且始终为零。

这在示例数据的图形中很明显。

plot(g.invites.network)

Network with no triangles

基于评论的添加
有两种直径可以计算-有向和无向。 对于您的示例数据,定向直径为2,无方向直径为4。

diameter(g.invites.network)
[1] 2
diameter(g.invites.network, directed=FALSE)
[1] 4

您可以使用get_diameter

获得构成这些路径的顶点
get_diameter(g.invites.network)
+ 3/43 vertices, named:
[1] 4  23 25
get_diameter(g.invites.network, directed=FALSE)
+ 5/43 vertices, named:
[1] 25 23 4  22 26

要对图形进行子集化以了解直径,可以使用induced_subgraph。例如,仅获取那些节点:

DiamPath =  get_diameter(g.invites.network, directed=FALSE)
DiameterGraph = induced_subgraph(g.invites.network, DiamPath)
plot(DiameterGraph)

Just the diameter vertices

或者也许您想在上下文中查看直径,可以对直径顶点进行不同的着色。

DiamPath =  get_diameter(g.invites.network, directed=FALSE)
VC = rep("orange", vcount(g.invites.network))
VC[DiamPath] = "red"
plot(g.invites.network, vertex.color=VC)

Diameter within the full graph