Come calcolare le misure di centralità in una rete edge di 4 milioni usando R?


9

Ho un file CSV con 4 milioni di bordi di una rete diretta che rappresenta le persone che comunicano tra loro (ad es. John invia un messaggio a Mary, Mary invia un messaggio ad Ann, John invia un altro messaggio a Mary, ecc.). Vorrei fare due cose:

  1. Trova gradi, centralità e (forse) misure di centralità di autovettore per ogni persona.

  2. Ottieni una visualizzazione della rete.

Vorrei farlo sulla riga di comando su un server Linux poiché il mio laptop non ha molta potenza. Ho installato R su quel server e la libreria statnet. Ho trovato questo post del 2009 di qualcuno più competente di me che cerca di fare la stessa cosa e ha problemi con esso. Quindi mi chiedevo se qualcun altro avesse qualche suggerimento su come farlo, preferibilmente portandomi passo dopo passo poiché so solo come caricare il file CSV e nient'altro.

Solo per darti un'idea, ecco come appare il mio file CSV:

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

per alcune di queste misure, indipendentemente dal fatto che R sia in grado di gestirlo o la nota dipenderà da quante persone separate (nodi) ha la rete. R potrebbe non essere necessariamente lo strumento migliore per gli aspetti computazionali. C'è un ragazzo con il cognome di Leskovec che era solito essere a Carnegie Mellon --- penso come uno studente --- che ha fatto un sacco di cose con statistiche descrittive su grandi grafici. Ci sono molte utility là fuori per "visualizzare" i grafici, ma soprattutto ho scoperto che sono piuttosto difficili da interpretare o da cui ha molto senso. La rappresentazione grafica delle sole distribuzioni dei gradi potrebbe essere un primo inizio.
cardinale il

Anche tracciare 4 milioni di punti potrebbe richiedere del tempo ...
Wok,

@wok, nah. Pezzo di torta sui computer di oggi. Ad ogni modo, potresti sempre scaricare prima un PNG e probabilmente è abbastanza buono per la distribuzione dei gradi. Il grafico dell'OP non è poi così grande.
cardinale il

Risposte:


7

Quello che hai è un elenco di bordi, che può essere convertito in un oggetto di rete utilizzando la libreria di rete. Ecco un esempio usando dati fittizi.

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)

Tuttavia, un avvertimento è in ordine: hai una rete molto grande e non sono sicuro che una trama sarà così istruttiva. Probabilmente sembrerà un grosso gomitolo di lana. Inoltre, non sono sicuro di come queste librerie gestiscano set di dati così grandi. Ti suggerisco di dare un'occhiata alla documentazione per le librerie di rete, statnet ed ergm. Il Journal of Statistical Software (v24 / 3) offre numerosi articoli su queste librerie. Il problema può essere trovato qui:

http://www.jstatsoft.org/v24


1
Ricordo vagamente la mappa del mondo della rete di Facebook, che è stata fatta in R. Penso che l'autore abbia descritto il suo processo in dettaglio nel suo blog. Suppongo che l'uso di questo approccio genererebbe una mappa che sia informativa anche con 4 milioni di nodi.
Devo Jessen il

Ci scusiamo per l'ingenua domanda, ma come faccio a convertire una tabella in ciò che hai come srce dst. Questo è ciò che faccio in genere per caricare il file (ora un file delimitato da tabulazioni): el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
am

read.csv () dovrebbe produrre un data.frame. as.network () potrebbe leggerlo direttamente o potrebbe essere necessario eseguire as.matrix (el).
Jason Morgan,

Sono piuttosto scettico sul fatto che queste librerie siano in grado di fare molto con un grafico di milioni di nodi. Li hai effettivamente utilizzati con set di dati comparabili?
Szabolcs,

Il poster si riferiva a una rete con 4 milioni di spigoli , non a nodi. Ho usato la statnetfamiglia di librerie su una rete non indirizzata di oltre 3500 nodi (~ 8 milioni di possibili bordi). Era abbastanza fattibile, soprattutto quando l'obiettivo era solo quello di calcolare le statistiche di rete. Ho persino stimato ERGM su reti di queste dimensioni. Ma il tuo punto è ben preso; Dubito che reti di milioni di nodi possano essere facilmente analizzate.
Jason Morgan,

3

Non penso che R sia la prima scelta qui (forse sbaglio). Avrai bisogno di enormi matrici qui per indicizzare e preparare i file di rete nel formato dati appropriato. Prima di tutto, proverò ad usare la libreria SNAP di Jure (Rob menzionalo nel post sopra) ; è scritto in C ++ e funziona molto bene su reti di grandi dimensioni.


Grazie per aver menzionato SNAP. Ci sto esaminando. L'hai usato? Il campione di centralità che ne deriva sembra vicino a quello che voglio. Ho provato a modificarlo in modo che funzioni con i miei dati del grafico a più direzioni ma non è stato possibile compilarlo. Non sono sicuro che sia opportuno porre una domanda al riguardo qui, quindi potrei creare una nuova
domanda.

1
@andresmh, potresti provare a ridurre il tuo grafico per avere prima una singola osservazione per coppia diretta. Per quanto riguarda gli autovalori, i tuoi dati sono probabilmente simili o equivalenti a una camminata casuale ponderata sul grafico. Non sono sicuro che SNAP lo supporti, ma è probabile che lo sia. Se tutto il resto fallisce, potresti inviare un'email molto specifica a Jure. È un ragazzo molto simpatico, quindi non sarei sorpreso se avesse fornito una guida rapida.
cardinale il

@cardinal: ho trovato un codice di esempio in SNAP che fa esattamente quello che voglio ma per un grafico non indirizzato. Penso che il mio grafico sia ciò che i documenti SNAP chiamano "multi-grafico diretto". Quindi ho cambiato solo una riga centrality.cppda TUNGrapha TNEGraph(vedi pastebin.com/GHUquJvT linea 24). Non si sta più compilando. Ho il sospetto che richieda un diverso tipo di nodo? L'errore che ottengo è: centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested(vedi errore completo su pastebin.com/86mCbByG )
am

3

Gephi ( http://gephi.org/ ) potrebbe essere un modo semplice per esplorare i dati. Puoi quasi certamente visualizzarlo ed eseguire alcuni calcoli (anche se non lo uso da un po 'di tempo, quindi non ricordo tutte le funzioni).


3

Dall'esperienza passata con una rete di 7 milioni di nodi, penso che visualizzare la tua rete completa ti darà un'immagine non interpretabile. Potrei suggerire visualizzazioni diverse utilizzando sottoinsiemi dei tuoi dati, ad esempio semplicemente utilizzando i primi 10 nodi con i collegamenti più in entrata o in uscita. Secondo il suggerimento di Celenius sull'uso di gephi.


@andresmh, Maslov e Sneppen ( Science , 2002) hanno una visualizzazione che potrebbe essere utile in questo contesto. Cercando tra le citazioni recenti relative a statistiche / comp-sci di questo lavoro, ho trovato anche questo . Qui potrebbe esserci un altro lavoro correlato.
cardinale il

1

Se ti preoccupi delle dimensioni della rete, potresti provare il igraphpacchetto in R. E se ciò funziona male all'interno di R, potrebbe fare meglio come modulo Python. O anche il networkxpacchetto per Python


1

Pensi che la rete abbia un numero limitato di componenti connessi molto grandi? In caso contrario, è possibile scomporlo in componenti distinti che semplificheranno molto il calcolo delle misure di centralità.


+1 a questo: se si tratta di un componente interamente connesso, questa è una cosa, ma se riesci a scomporre la rete, hai entrambi i dati più piccoli e in realtà diverse reti indipendenti che possono essere analizzate in parallelo.
Fomite

1

Esistono diversi pacchetti software R che è possibile utilizzare, inclusi "sna" e "network". Una cosa su cui non farei necessariamente affidamento se riscontri problemi di prestazioni con sna è NetworkX. Adoro NetworkX fino alla morte e lo uso per la maggior parte delle mie analisi, ma NetworkX è abbastanza orgoglioso di essere un'implementazione per lo più puramente Pythonic. Non sfrutta particolarmente bene il codice precompilato veloce e sna spesso supera NetworkX di un margine considerevole.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.