¿Cómo calcular medidas de centralidad en una red de borde de 4 millones usando R?

9

Tengo un archivo CSV con 4 millones de bordes de una red dirigida que representa a las personas que se comunican entre sí (por ejemplo, John envía un mensaje a Mary, Mary le envía un mensaje a Ann, John le envía otro mensaje a Mary, etc.). Me gustaría hacer dos cosas:

  1. Encuentre medidas de grado, centralidad y (tal vez) centralidad de vector propio para cada persona.

  2. Obtenga una visualización de la red.

Me gustaría hacer esto en la línea de comandos en un servidor Linux ya que mi computadora portátil no tiene mucha potencia. Tengo R instalado en ese servidor y la biblioteca de statnet. Encontré esta publicación de 2009 de alguien más competente que yo tratando de hacer lo mismo y teniendo problemas con ella. Así que me preguntaba si alguien más tiene algún indicador sobre cómo hacer esto, preferiblemente llevándome paso a paso ya que solo sé cómo cargar el archivo CSV y nada más.

Solo para darle una idea, así es como se ve mi archivo CSV:

$ head comments.csv
    "src","dest"
    "6493","139"
    "406705","369798"
$ wc -l comments.csv 
4210369 comments.csv
amh
fuente
para algunas de estas medidas, si R puede manejarlo o si la nota dependerá de cuántas personas (nodos) separadas tenga la red. R puede no ser necesariamente la mejor herramienta para los aspectos computacionales. Hay un chico con el apellido de Leskovec que solía estar en Carnegie Mellon, creo que como estudiante, que hizo muchas cosas con estadísticas descriptivas en gráficos grandes. Existen muchas utilidades para "visualizar" gráficos, pero la mayoría de las veces he descubierto que son bastante difíciles de interpretar o que tienen mucho sentido. Graficar solo las distribuciones de grados podría ser un primer comienzo.
cardenal
Incluso trazar 4 millones de puntos podría llevar un tiempo ...
Wok
@wok, no. Pedazo de pastel en las computadoras de hoy. De todos modos, siempre puedes volcar a un PNG primero y es probable que sea lo suficientemente bueno para la distribución de grados. El gráfico del OP realmente no es tan grande.
cardenal

Respuestas:

7

Lo que tiene es una lista de bordes, que se puede convertir en un objeto de red utilizando la biblioteca de red. Aquí hay un ejemplo usando datos ficticios.

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)

Sin embargo, una advertencia está en orden: tiene una red muy grande y no estoy seguro de que una trama sea tan informativa. Probablemente se verá como una gran bola de estambre. Tampoco estoy seguro de qué tan bien manejan estas bibliotecas con conjuntos de datos tan grandes. Le sugiero que consulte la documentación de las bibliotecas de red, statnet y ergm. El Journal of Statistical Software (v24 / 3) ofrece varios artículos que cubren estas bibliotecas. El problema se puede encontrar aquí:

http://www.jstatsoft.org/v24

Jason Morgan
fuente
1
Recuerdo vagamente el mapa mundial de la red de Facebook, que se hizo en R. Creo que el autor describió su proceso con cierto detalle en su blog. Supongo que usar ese enfoque generaría un mapa informativo incluso con 4 millones de nodos.
Le debo a Jessen
Disculpas por la pregunta ingenua, pero ¿cómo convierto una tabla en lo que tienes como srcy dst? Esto es lo que normalmente hago para cargar el archivo (ahora un archivo delimitado por tabulaciones): el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
amh
read.csv () debería producir un data.frame. as.network () puede leer eso directamente o puede que tenga que hacer as.matrix (el).
Jason Morgan
Soy bastante escéptico acerca de que estas bibliotecas puedan hacer mucho con un gráfico de millones de nodos. ¿Realmente los ha usado con conjuntos de datos comparables?
Szabolcs
El póster se refería a una red con 4 millones de bordes , no nodos. He usado la statnetfamilia de bibliotecas en una red no dirigida de más de 3500 nodos (~ 8 millones de bordes posibles). Eso fue bastante factible, especialmente cuando el objetivo era solo calcular las estadísticas de la red. Incluso he estimado ERGM en redes de este tamaño. Pero su punto está bien tomado; Dudo que las redes de millones de nodos puedan analizarse fácilmente.
Jason Morgan
3

No creo que R sea la primera opción aquí (tal vez me equivoque). Necesitará grandes matrices aquí para indexar y preparar sus archivos de red en el formato de datos apropiado. En primer lugar, intentaré usar la biblioteca SNAP de Jure (Rob lo menciona en la publicación anterior) ; Está escrito en C ++ y funciona muy bien en redes grandes.

Andrej
fuente
Gracias por mencionar SNAP. Lo estoy investigando. ¿Lo has usado? La muestra de centralidad que viene con ella parece cercana a lo que quiero. Intenté modificarlo para que funcione con mis datos de gráficos multidireccionados pero no se pudo compilar. No estoy seguro de si es apropiado hacer una pregunta al respecto aquí, por lo que podría crear una nueva Q.
amh
1
@andresmh, primero puede intentar reducir su gráfico para tener una sola observación por par dirigido. Para el material de valor propio, es probable que sus datos sean similares o equivalentes a una caminata aleatoria ponderada en el gráfico. No estoy seguro de si SNAP lo admite, pero es probable que lo haga. Si todo lo demás falla, puede enviar un correo electrónico muy específico a Jure. Es un tipo muy agradable, por lo que no me sorprendería si proporcionara una guía rápida.
cardenal
@cardinal: Encontré un código de muestra en SNAP que hace exactamente lo que quiero, pero para un gráfico no dirigido. Creo que mi gráfico es lo que los documentos SNAP llaman "gráfico múltiple dirigido". Así que cambié solo una línea centrality.cppdesde TUNGrapha TNEGraph(ver pastebin.com/GHUquJvT línea 24). Ya no se está compilando. Sospecho que requiere un tipo diferente de nodo? El error que obtengo es: centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested(vea el error completo en pastebin.com/86mCbByG )
amh
3

Gephi ( http://gephi.org/ ) podría ser una manera fácil de explorar los datos. Es casi seguro que puede visualizarlo y realizar algunos cálculos (aunque no lo he usado durante algún tiempo, así que no puedo recordar todas las funciones).

celenius
fuente
3

De la experiencia pasada con una red de 7 millones de nodos, creo que visualizar su red completa le dará una imagen ininterpretable. Podría sugerir diferentes visualizaciones usando subconjuntos de sus datos, como simplemente usar los 10 nodos principales con la mayoría de los enlaces entrantes o salientes. Secundo la sugerencia de Celenius sobre el uso de Gephi.

Zubin
fuente
@andresmh, Maslov y Sneppen ( Science , 2002) tienen una visualización que podría ser útil en este contexto. Al buscar en estadísticas recientes / citas relacionadas con comp-sci de este trabajo, también encontré esto . Aquí puede haber otro trabajo relacionado.
cardenal
1

Si le preocupa el tamaño de la red, puede probar el igraphpaquete en R. Y si eso funciona mal dentro de R, podría funcionar mejor como módulo Python. O incluso el networkxpaquete para Python

fioghual
fuente
1

¿Sospecha que la red tiene una pequeña cantidad de componentes conectados muy grandes? Si no, puede descomponerlo en componentes distintos que harán mucho más fácil calcular medidas de centralidad.

Michael Bishop
fuente
+1 a esto: si es un componente completamente conectado, eso es una cosa, pero si puede descomponer la red, tiene datos más pequeños y, de hecho, varias redes independientes que se pueden analizar en paralelo.
Fomite
1

Hay varios paquetes de software R que uno podría usar, incluidos "sna" y "network". Una cosa en la que no confiaría necesariamente si tiene problemas de rendimiento con sna es NetworkX. Amo a NetworkX hasta la muerte, y lo uso para la mayoría de mis análisis, pero NetworkX está muy orgulloso de ser una implementación principalmente puramente Pythonic. No explota particularmente bien el rápido código precompilado, y a menudo supera a NetworkX por un margen considerable.

Fomite
fuente