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

问题描述 投票:1回答:1

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

过滤我的dt后,dt.user由以下2列组成:user_id,inviter_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)
)

任何帮助将不胜感激!

r network-programming igraph directed-graph
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.