Comment calculer les mesures de centralité dans un réseau de 4 millions de périphéries en utilisant R?

9

J'ai un fichier CSV avec 4 millions de bords d'un réseau dirigé représentant des personnes communiquant entre elles (par exemple, John envoie un message à Mary, Mary envoie un message à Ann, John envoie un autre message à Mary, etc.). Je voudrais faire deux choses:

  1. Trouvez le degré, l'intervalle et (peut-être) les mesures de centralité des vecteurs propres pour chaque personne.

  2. Obtenez une visualisation du réseau.

Je voudrais le faire en ligne de commande sur un serveur Linux car mon ordinateur portable n'a pas beaucoup de puissance. J'ai R installé sur ce serveur et la bibliothèque statnet. J'ai trouvé ce poste de 2009 d'une personne plus compétente que moi essayant de faire la même chose et ayant des problèmes avec ça. Je me demandais donc si quelqu'un d'autre avait des conseils sur la façon de procéder, de préférence en me prenant étape par étape car je ne sais que charger le fichier CSV et rien d'autre.

Juste pour vous donner une idée, voici à quoi ressemble mon fichier CSV:

$ head comments.csv
    "src","dest"
    "6493","139"
    "406705","369798"
$ wc -l comments.csv 
4210369 comments.csv
amh
la source
pour certaines de ces mesures, le fait que R puisse le gérer ou le noter dépendra du nombre de personnes (nœuds) distinctes du réseau. R n'est pas nécessairement le meilleur outil pour les aspects informatiques. Il y a un gars avec le nom de famille de Leskovec qui était à Carnegie Mellon --- je pense en tant qu'étudiant --- qui a fait beaucoup de choses avec des statistiques descriptives sur de grands graphiques. Il existe de nombreux utilitaires pour "visualiser" les graphiques, mais la plupart du temps, j'ai trouvé qu'ils sont assez difficiles à interpréter ou à donner beaucoup de sens. Représenter graphiquement les distributions des degrés pourrait être un premier départ.
Cardinal
Même comploter 4 millions de points pourrait prendre un certain temps ...
Wok
@wok, nah. Un morceau de gâteau sur les ordinateurs d'aujourd'hui. Quoi qu'il en soit, vous pouvez toujours vider d'abord un fichier PNG, ce qui est probablement suffisant pour la distribution des degrés. Le graphique de l'OP n'est vraiment pas si gros.
cardinal

Réponses:

7

Ce que vous avez est une liste de bords, qui peut être convertie en objet réseau à l'aide de la bibliothèque réseau. Voici un exemple utilisant des données fictives.

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)

Cependant, un avertissement s'impose: vous avez un très grand réseau et je ne suis pas sûr qu'une intrigue sera si informative. Cela ressemblera probablement à une grosse pelote de laine. Je ne sais pas non plus dans quelle mesure ces bibliothèques gèrent de tels ensembles de données. Je vous suggère de jeter un œil à la documentation des bibliothèques réseau, statnet et ergm. Le Journal of Statistical Software (v24 / 3) propose plusieurs articles couvrant ces bibliothèques. Le problème peut être trouvé ici:

http://www.jstatsoft.org/v24

Jason Morgan
la source
1
Je me souviens vaguement de la carte du monde du réseau Facebook, qui a été réalisée dans R. Je pense que l'auteur a décrit son processus en détail dans son blog. Je suppose que l'utilisation de cette approche générerait une carte informative même avec 4 millions de nœuds.
Owe Jessen
Toutes mes excuses pour la question naïve, mais comment puis-je convertir un tableau en ce que vous avez en tant que srcet dst. Voici ce que je fais généralement pour charger le fichier (maintenant un fichier délimité par des tabulations): el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
amh
read.csv () devrait produire un data.frame. as.network () peut lire cela directement ou vous devrez peut-être faire as.matrix (el).
Jason Morgan
Je suis plutôt sceptique quant à la capacité de ces bibliothèques à faire beaucoup avec un graphique de millions de nœuds. Les avez-vous réellement utilisés avec des ensembles de données comparables?
Szabolcs
L'affiche faisait référence à un réseau avec 4 millions d' arêtes , pas à des nœuds. J'ai utilisé la statnetfamille de bibliothèques sur un réseau non dirigé de plus de 3500 nœuds (~ 8 millions de bords possibles). C'était tout à fait faisable, surtout lorsque l'objectif était simplement de calculer les statistiques du réseau. J'ai même estimé des ERGM sur des réseaux de cette taille. Mais votre point est bien compris; Je doute que des réseaux de millions de nœuds puissent être facilement analysés.
Jason Morgan
3

Je ne pense pas que R soit un premier choix ici (peut-être que je me trompe). Vous aurez besoin d'énormes tableaux ici pour indexer et préparer vos fichiers réseaux dans le format de données approprié. Tout d'abord, je vais essayer d'utiliser la bibliothèque SNAP de Jure (Rob le mentionne dans le post ci-dessus) ; il est écrit en C ++ et fonctionne très bien sur les grands réseaux.

Andrej
la source
Merci d'avoir mentionné SNAP. J'y regarde. L'avez-vous utilisé? L'échantillon de centralité qui l'accompagne semble proche de ce que je veux. J'ai essayé de le modifier pour qu'il fonctionne avec mes données de graphique multidirectionnel, mais il n'a pas pu être compilé. Je ne sais pas s'il est approprié de poser une question à ce sujet ici, donc je pourrais créer un nouveau Q.
amh
1
@andresmh, vous pourriez essayer de réduire votre graphique pour avoir une seule observation par paire dirigée en premier. Pour ce qui est des valeurs propres, vos données sont probablement similaires ou équivalentes à une marche aléatoire pondérée sur le graphique. Je ne sais pas si SNAP prend en charge cela, mais c'est probable. Si tout le reste échoue, vous pourriez envoyer un e-mail très spécifique à Jure. C'est un gars très gentil, donc je ne serais pas surpris s'il fournissait quelques conseils rapides.
cardinal
@cardinal: J'ai trouvé un exemple de code dans SNAP qui fait exactement ce que je veux, mais pour un graphique non orienté. Je pense que mon graphique est ce que les documents SNAP appellent "multi-graphique dirigé". J'ai donc changé une seule ligne centrality.cppde TUNGraphà TNEGraph(voir pastebin.com/GHUquJvT ligne 24). Il ne compile plus. Je soupçonne que cela nécessite un type de nœud différent? L'erreur que j'obtiens est: centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested(voir l'erreur complète sur pastebin.com/86mCbByG )
amh
3

Gephi ( http://gephi.org/ ) pourrait être un moyen facile d'explorer les données. Vous pouvez presque certainement le visualiser et effectuer des calculs (même si je ne l'ai pas utilisé depuis un certain temps, donc je ne me souviens pas de toutes les fonctions).

celenius
la source
3

De l'expérience passée avec un réseau de 7 millions de nœuds, je pense que visualiser votre réseau complet vous donnera une image ininterprétable. Je pourrais suggérer différentes visualisations en utilisant des sous-ensembles de vos données, par exemple en utilisant simplement les 10 principaux nœuds avec les liens les plus entrants ou sortants. J'appuie la suggestion de celenius sur l'utilisation de gephi.

Zubin
la source
@andresmh, Maslov et Sneppen ( Science , 2002) ont une visualisation qui pourrait être utile dans ce contexte. En recherchant dans les récentes statistiques / comp-sci - citations liées à ce travail, j'ai également trouvé cela . Voici peut-être un autre travail connexe.
Cardinal
1

Si vous êtes préoccupé par la taille du réseau, vous pouvez essayer le igraphpackage dans R. Et si cela fonctionne mal à l'intérieur de R, il pourrait faire mieux en tant que module Python. Ou même le networkxpackage pour Python

fioghual
la source
1

Pensez-vous que le réseau possède un petit nombre de très gros composants connectés? Sinon, vous pouvez le décomposer en composants distincts, ce qui facilitera le calcul des mesures de centralité.

Michael Bishop
la source
+1 à ceci - si c'est un composant entièrement connecté, c'est une chose, mais si vous pouvez décomposer le réseau, vous avez à la fois des données plus petites et en fait plusieurs réseaux indépendants qui peuvent être analysés en parallèle.
Fomite
1

Il existe plusieurs logiciels R que l'on pourrait utiliser, notamment "sna" et "network". NetworkX est une chose sur laquelle je ne compterais pas nécessairement si vous rencontrez des problèmes de performances avec sna. J'adore NetworkX à mort et je l'utilise pour la plupart de mes analyses, mais NetworkX est assez fier d'être une implémentation principalement purement pythonique. Il n'exploite pas particulièrement bien le code précompilé rapide, et sna dépasse souvent NetworkX d'une marge considérable.

Fomite
la source