如何使用R计算400万边缘网络中的集中度度量?


9

我有一个CSV文件,该文件有400万条有向网络的边缘,代表着彼此通信的人(例如,约翰向玛丽发送消息,玛丽向安发送消息,约翰向玛丽发送一条消息,等等)。我想做两件事:

  1. 查找每个人的度数,本位之间和(也许)本征中心度度量。

  2. 获得网络的可视化。

我想在Linux服务器上的命令行上执行此操作,因为我的笔记本电脑没有很多功能。我在该服务器和statnet库上安装了R。我在2009年的这个职位发现某人比我更有能力尝试做同样的事情,并且遇到问题。因此,我想知道是否还有其他人对如何执行此操作有任何建议,最好带我一步一步,因为我只知道如何加载CSV文件,而别无其他。

为了给您一个想法,这是我的CSV文件的外观:

$ head comments.csv
    "src","dest"
    "6493","139"
    "406705","369798"
$ wc -l comments.csv 
4210369 comments.csv

对于其中的一些措施,R是否可以处理还是要注意,将取决于网络有多少个单独的人(节点)。R不一定是计算方面的最佳工具。有一个姓莱斯科维茨的人,他曾经在卡内基梅隆大学(我认为是学生)曾做过很多工作,它们在大图上进行描述性统计。有很多实用程序可以“可视化”图形,但是大多数情况下,我发现它们很难解释,也很难理解。仅绘制度分布图可能是第一个开始。
主教

甚至要获得400万点也可能需要一段时间...
Wok

@wok,不。当今计算机上的小菜一碟。无论如何,您总是可以先将其转储为PNG,这对于度数分布可能已经足够好了。OP的图实际上并没有那么大。
主教

Answers:


7

您所拥有的是一个边缘列表,可以使用网络库将其转换为网络对象。这是使用虚拟数据的示例。

library(network)

src <- c("A", "B", "C", "D", "E", "B", "A", "F")
dst <- c("B", "E", "A", "B", "B", "A", "F", "A")

edges <- cbind(src, dst)
Net <- as.network(edges, matrix.type = "edgelist")

summary(Net)
plot(Net)

但是,需要发出警告:您的网络非常庞大,我不确定情节是否能提供足够的信息。它可能看起来像一个大毛线球。我也不确定这些库如何处理如此大的数据集。我建议您看一下有关网络,statnet和ergm库的文档。该杂志统计软件(V24 / 3)报价几篇文章,涵盖这些库。可以在这里找到问题:

http://www.jstatsoft.org/v24


1
我隐约记得在R中完成的facebook网络世界地图。我认为作者在博客中详细描述了他的过程。我想使用该方法将生成一个即使有400万个节点也能提供信息的地图。
Owe Jessen

很抱歉这个天真的问题,但是如何将表格转换为as src和as dst。这是我通常要加载的文件(现在是制表符分隔的文件)的工作: el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
amh 2011年

read.csv()应该产生一个data.frame。as.network()可能直接读取,或者您可能需要as.matrix(el)。
詹森·摩根

我对这些库能否对数百万个节点的图做很多事持怀疑态度。您是否实际将它们用于可比较的数据集?
Szabolcs

张贴者指的是具有400万个边缘的网络,而不是节点。我已经在statnet超过3500个节点(约800万个可能的边缘)的无向网络上使用了库系列。这是相当可行的,尤其是当目标只是计算网络统计信息时。我什至估计了这种规模的网络上的ERGM。但是你的观点是正确的。我怀疑数百万个节点的网络是否可以轻松分析。
杰森·摩根

3

我认为R不是这里的首选(也许我错了)。您将需要巨大的数组,以适当的数据格式索引和准备网络文件。首先,我将尝试使用Jure的SNAP库(Rob在上面的帖子中提到了他);它是用C ++编写的,并且在大型网络上运行良好。


感谢您提及SNAP。我正在调查。你用过吗?随附的中心性示例似乎与我想要的接近。我尝试对其进行修改,以使其可用于我的多向图形数据,但无法编译。我不知道这是否是适当的问一个问题关于在这里,所以我可能会创建一个新的问题:
AMH

1
@andresmh,您可以尝试减少图形以使每个有向对首先具有一个观察值。对于特征值资料,您的数据可能类似于或等效于图上的加权随机游动。我不确定SNAP是否支持该功能,但可能会支持。如果其他所有方法均失败,则您可能会向Jure发送一封非常具体的电子邮件。他是一个非常好的人,所以如果他提供一些快速指导,我不会感到惊讶。
主教

@cardinal:我在SNAP中找到了一个示例代码,该代码完全可以实现我想要的功能,但可以用于无向图。我认为我的图就是SNAP文档所说的“有向多图”。因此,我只更改了centrality.cppTUNGraph到的一行TNEGraph(请参见pastebin.com/GHUquJvT第24行)。它不再编译了。我怀疑它需要不同类型的节点吗?我得到的错误是:(centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested请参阅pastebin.com/86mCbByG的完整错误)
2011年

3

Gephi(http://gephi.org/)可能是一种探索数据的简便方法。您几乎可以肯定地看到它,并执行一些计算(尽管我已经有一段时间没有使用它了,所以我不记得所有的功能)。


3

根据过去拥有700万个节点的网络的经验,我认为可视化您的完整网络将为您提供无法解释的图像。我可能会建议您使用数据的子集进行不同的可视化处理,例如仅使用入站或出站链接最多的前10个节点。我赞同celenius关于使用gephi的建议。


@ andresmh,Maslov和Sneppen(《科学》,2002年)具有一种可视化效果,在这种情况下可能会有用。通过搜索有关该工作的最新统计数据/ comp-sci相关引用,我也发现了一点。可能是另一项相关的工作。
主教

1

如果您担心网络的大小,则可以igraph在R中尝试该软件包。如果该软件包在R中的效果不佳,则作为Python模块可能会更好。甚至是networkxPython 的软件包


1

您是否怀疑网络中有少量非常大的连接组件?如果没有,您可以将其分解为不同的组件,这将使计算中心度的度量变得更加容易。


+1-如果它是一个完全连接的组件,那是一回事,但是如果您可以分解网络,那么您将拥有较小的数据,实际上还有几个可以并行分析的独立网络。
Fomite 2011年

1

可以使用几种R软件包,包括“ sna”和“ network”。有一件事我不会必然依靠如果你有与SNA性能问题是NetworkX。我爱死于NetworkX,并在大多数分析中都使用了它,但是NetworkX以成为一个纯粹的Pythonic实现而感到自豪。它不能很好地利用快速的预编译代码,并且sna经常比NetworkX快很多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.