Rを使用して400万のエッジネットワークの中心性測定を計算する方法


9

私は、互いに通信する人々を表す有向ネットワークの400万エッジのCSVファイルを持っています(たとえば、ジョンはメアリーにメッセージを送信し、メアリーはアンにメッセージを送信し、ジョンはメアリーに別のメッセージを送信ます)。私は2つのことをしたいと思います:

  1. 各個人の次数、(おそらく)固有ベクトル中心性測度の次数を求めます。

  2. ネットワークの視覚化を取得します。

私のラップトップには電力があまりないので、Linuxサーバーのコマンドラインでこれを実行したいと思います。そのサーバーとstatnetライブラリにRをインストールしました。私が見つかりました。この2009年のポスト私は同じことをやろうとしていると、それで問題が発生したよりも多くの有能な誰かのを。だから私は他の誰かがこれを行う方法についてのポインタを持っているのではないかと思っていました。

ちょうどあなたにアイデアを与えるために、これは私のCSVファイルがどのように見えるかです:

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

これらの測定値の一部では、Rがそれを処理できるかどうか、またはネットワークが別々の人(ノード)をいくつ持つかによって異なります。Rは、必ずしも計算の側面で最適なツールとは限りません。かつてカーネギーメロンにいたレスコベックの姓を持つ男がいます-私は学生として考えています-大きなグラフの記述統計でたくさんのことをしました。グラフを「視覚化」するためのユーティリティはたくさんありますが、ほとんどの場合、それらを解釈したり、意味を理解したりするのはかなり困難です。次数分布だけをグラフ化することが、最初のスタートになるかもしれません。
枢機卿は

でも400万ポイントをプロットしています...しばらく時間がかかるかもしれません
ウォック

@wok、いや。今日のコンピューターのケーキ。とにかく、常に最初にPNGにダンプすることができます。これは、次数分布にとって十分なものになる可能性があります。OPのグラフはそれほど大きくありません。
枢機卿

回答:


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、2011

素朴な質問に対する謝罪が、どのように私はあなたのように持っているものの中にテーブルを変換しないsrcdst。:これは私が通常ファイル(現在はタブ区切りファイル)をロードするために何をすべきかである el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
AMH

read.csv()はdata.frameを生成する必要があります。as.network()がそれを直接読み取るか、as.matrix(el)を実行する必要がある場合があります。
Jason Morgan、

これらのライブラリーが何百万ものノードのグラフを使って多くのことを行うことができるかについて、私はむしろ懐疑的です。比較可能なデータセットで実際に使用しましたか?
Szabolcs 2013年

ポスターは、ノードではなく、400万のエッジを持つネットワークに言及していました。私はstatnet、3500を超えるノード(約800万の可能なエッジ)の無向ネットワークでライブラリファミリを使用しました。これは、特にネットワーク統計を計算することだけが目的である場合は、かなり可能でした。このサイズのネットワークでのERGMも推定しました。しかし、あなたの主張はよく理解されています。何百万ものノードのネットワークを簡単に分析できるとは思えません。
Jason Morgan

3

ここではRが最初の選択肢だとは思わない(たぶん私は間違っている)。ネットワークファイルに適切なデータ形式でインデックスを作成して準備するには、ここで巨大な配列が必要になります。まず最初に、Jureの(上記の投稿でRobが彼に言及した)SNAPライブラリを使用してみます。C ++で記述されており、大規模ネットワークで非常にうまく機能します。


SNAPについて言及していただきありがとうございます。調べています。使ったことはありますか?付属の中心性サンプルは、私が望んでいるものに近いようです。多方向グラフデータで機能するように変更しようとしましたが、コンパイルに失敗しました。私が新しいQ.を作成することがありますので、ここではそれについての質問をすることが適切であるかどうかはわからない
AMH

1
@andresmh、最初に有向ペアごとに単一の観測値を持つようにグラフを削減してみてください。固有値のものについては、データはグラフ上の加重ランダムウォークに類似または同等です。SNAPがサポートしているかどうかはわかりませんが、サポートしている可能性があります。他のすべてが失敗した場合は、非常に具体的なメールをジュールに送信することができます。彼はとてもいい人なので、彼が簡単なアドバイスをしてくれても驚かないでしょう。
枢機卿、

@cardinal:無向グラフの場合とまったく同じように機能するサンプルコードをSNAPで見つけました。私は考えて私のグラフは、SNAPのドキュメントは、「マルチ有向グラフ」と呼ぶものです。そこで、1行だけをcentrality.cppからに変更しTUNGraphましたTNEGraphpastebin.com/GHUquJvTの 24行目を参照)。もうコンパイルされていません。別のタイプのノードが必要だと思いますか?私が手にエラーがある:centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested(でフルエラーが表示さpastebin.com/86mCbByG
AMH

3

Gephi(http://gephi.org/)は、データを探索する簡単な方法かもしれません。ほぼ確実にそれを視覚化し、いくつかの計算を実行できます(ただし、しばらく使用していないため、すべての機能を思い出せません)。


3

700万ノードのネットワークでの過去の経験から、完全なネットワークを視覚化すると、解釈できないイメージが得られると思います。受信リンクまたは送信リンクが最も多い上位10個のノードを使用するなど、データのサブセットを使用してさまざまな視覚化を提案する場合があります。私は、gephiの使用に関するセレニウスの提案の2番目です。


@ andresmh、Maslov、Sneppen(Science、2002)は、このコンテキストで役立つかもしれない視覚化を持っています。この作品の最近の統計/ comp-sci--関連する引用を検索したところ、これも見つかりました。ここに別の関連した仕事があるかもしれません。
枢機卿

1

ネットワークのサイズが気になる場合は、igraphRでパッケージを試すことができます。R内でパフォーマンスが低下する場合は、Pythonモジュールの方が優れている可能性があります。またはnetworkxPython用のパッケージ


1

ネットワークに非常に大きな接続コンポーネントが少数あると思いますか?そうでない場合は、それを別個のコンポーネントに分解して、中心性の測定値の計算をはるかに簡単にすることができます。


これに+1-完全に接続されたコンポーネントの場合、それは1つのことですが、ネットワークを分解できる場合は、より小さなデータと、実際に並行して分析できるいくつかの独立したネットワークの両方を使用できます。
Fomite、2011年

1

「sna」や「network」など、使用できるRソフトウェアパッケージはいくつかあります。snaでパフォーマンスの問題が発生している場合、必ずしも信頼できるとは限らない 1つのことは、NetworkXです。私はNetworkXが大好きで、私の分析のほとんどで使用していますが、NetworkXはほとんど純粋にPython的な実装であることを非常に誇りに思っています。これは特に高速のコンパイル済みコードをうまく活用しておらず、snaはNetworkXをかなりのマージンで追い越すことがよくあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.