【问题标题】:Build a directed network graph in R from a dataset从数据集在 R 中构建有向网络图
【发布时间】:2019-03-02 05:54:22
【问题描述】:

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

过滤我的dt后,dt.user由以下2列组成:user_id,invitationer_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 &lt;- 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) 我如何提出一个好问题,(2) 如何创建 MCVE 以及 (3) 如何在 R 中提供一个最小的可重现示例...
  • 我试过了!现在好吗?如果没有,请告诉我(对不起,我的 R 经验很少)

标签: r network-programming igraph directed-graph


【解决方案1】:

至少对于您的样本数据,0 是正确答案,我怀疑这对于您的完整数据集来说总是正确的,因为它的构造方式。

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

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

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

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

plot(g.invites.network)

基于 cmets 的加法
有两种直径需要计算——有向和无向。 对于您的示例数据,有向直径为 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)

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

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)

【讨论】:

  • 感谢您的解释!我现在明白为什么聚类系数为 0。对于完整的数据集,我发现直径为 9。有没有办法在网络的这个特定部分“放大”/子集?我无法让函数 subgraph() 工作,因为我无法识别此函数的 v。
  • 我会补充一点答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多