Enfoque y ejemplo de agrupación de gráficos en "R"

10

Estoy buscando agrupar / fusionar nodos en un gráfico usando la agrupación de gráficos en 'r'.

Aquí hay una variación asombrosamente juguetona de mi problema.

  • Hay dos "grupos"
  • Hay un "puente" que conecta los grupos

Aquí hay una red de candidatos:
ingrese la descripción de la imagen aquí

Cuando miro la distancia de conexión, el "conteo", si lo desea, entonces puedo obtener la siguiente matriz:

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

Pensamientos aquí:

  • Por suerte o debido a la simplicidad del juguete, la matriz tiene parches obvios, este no será el caso en la matriz (muy grande). Si aleatorizara la relación entre punto y fila, entonces no sería tan limpio.
  • Puede que me haya equivocado, así que si tengo un error tipográfico, avíseme.
  • El conteo de saltos aquí es el número más corto de saltos para conectar el punto en la fila i con el punto en la columna j. Un salto automático sigue siendo un salto, por lo que la diagonal es todo.

Entonces, en esta matriz, la mayor distancia (lúpulo) tiene un número mayor. Si quisiera una matriz que mostrara "conectividad" en lugar de distancia, podría hacer un punto inverso, donde cada celda de la matriz se reemplaza con su inverso multiplicativo.

Preguntas:

Para ayudarme a encontrar mi propio camino:

  • ¿Cuáles son los términos para reducir el número de nodos en un gráfico combinándolos? ¿Es agrupación, fusión, munging, cuáles son las palabras que debo usar?
  • ¿Cuáles son las técnicas probadas? ¿Hay un libro de texto sobre el tema? ¿Puedes señalar documentos o sitios web?
  • Ahora traté de mirar aquí primero, es un gran lugar de "primer chequeo". No encontré lo que estaba buscando. Si me lo perdí (no es poco probable), ¿puede señalarme una o dos preguntas respondidas sobre el tema aquí en CV?

Para llevarme a donde voy:

  • ¿Existe un paquete 'R' que agrupe adecuadamente los nodos en la red?
  • ¿Podría indicarme un código de ejemplo para hacer esto?
  • ¿Existe un paquete 'R' que presente gráficamente la red reducida resultante?
  • ¿Podría indicarme un código de ejemplo para hacer esto?

Gracias por adelantado.

Estudiante
fuente
2
Tenga en cuenta que pedir paquetes o códigos (R) no está incluido aquí. Es posible que desee hacer que la parte "buscar" sea más prominente y la parte "obtener" menos.
gung - Restablece a Monica
3
Intentaré dar una respuesta completa en algún momento cuando tenga la oportunidad @gung. Pero para una respuesta rápida aquí está la detección comunitaria aplicada al gráfico de ejemplo de EngrStudent usando el igraphpaquete R.
Andy W
1
En mi humilde opinión, solo hay un grupo en este gráfico. Hay, sin embargo, tres camarillas superpuestas . No sé por qué su plan es destruir la camarilla del medio; a menos que pueda formalizar esto, tendrá dificultades para encontrar un algoritmo.
HA SALIDO - Anony-Mousse
2
Para lo que vale, mcl ( micans.org/mcl ) encuentra los dos grupos (realmente no estoy de acuerdo con la evaluación de Anony-Mousse, y no encuentro el enfoque de modelado de camarillas para la agrupación de gráficos particularmente fructífero). Esto es con su único parámetro (control de granularidad) configurado por defecto. Este algoritmo (mcl - lo publiqué) se usa bastante en bioinformática, y el código fuente (altamente escalable) está disponible. La interfaz con R se realiza fácilmente mediante interfaces de texto.
micans
2
Pedir código y paquetes esencialmente siempre ha estado fuera de tema aquí. Pedir ayuda con el código existente (es decir, tiene un ejemplo reproducible ) es sobre el tema en Stack Overflow . Si no sabías esto, es hora de aprenderlo. La idea de que los usuarios que responden R Qs en SO no tienen experiencia estadística es extraña para mí, pero muchas personas parecen asumir eso; en cualquier caso, no es cierto. Que tu Q haya sido respondida por una publicación SO debería decir algo aquí. OTOH, decir 'qué tipo de análisis es este, ¿alguien puede señalarme los recursos' es definitivamente un tema aquí?
gung - Restablece a Monica

Respuestas:

9

Su ejemplo particular sugiere encontrar comunidades dentro de la red que tengan más conexiones entre nodos en la comunidad y relativamente pocos bordes entre nodos en diferentes comunidades. Esto es distinto de encontrar comunidades aisladas , en las que hay subgrafías que están completamente desconectadas.

Aquí hay un ejemplo de detección comunitaria en R usando el igraphpaquete y un algoritmo descrito en Clauset et al. (2004) . Para usar este algoritmo, convierto su "conteo de saltos" en una matriz de adyacencia binaria sin bucles propios. El algoritmo necesita una matriz no dirigida, que sea consistente con su diagrama escrito a mano y los datos que proporcionó (los bordes son simétricos).

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

ingrese la descripción de la imagen aquí

No puedo comentar sobre la conveniencia de colapsar dichos nodos para un análisis posterior, pero esa detección de la comunidad es definitivamente útil para explorar la red. También hay muchos otros algoritmos de detección de la comunidad (así como otras bibliotecas para el análisis de red en R). Este es solo un ejemplo que produce el resultado deseado para este problema de juguete.

Andy W
fuente
1
Además, dados los comentarios anteriores sobre el uso de una base de datos de gráficos, no necesita tener el gráfico representado como una matriz de adyacencia. Una tabla para los nodos y una fila para cada borde es un formato más típico / eficiente, y puede convertirlo en una igraphred.
Andy W
1

Si aún no está conectado a un repositorio para su nodo y datos de conexión, puede consultar el paquete Rneo4j. Pero esto implica el uso de neo4j (una base de datos de gráficos, no un RDBMS) para almacenar sus datos. No soy un experto aquí, pero creo que este enfoque podría ser especialmente efectivo si a) como sugiere Anony-Mousse, no puedes formalizar esto, o b) el número de nodos y conexiones es especialmente grande, o c) teniendo preguntas adicionales con respecto a su red.

usuario3123116
fuente
No sabía que tal cosa existiera. ¡Ordenado! ¿Es este un ejemplo decente del material? nicolewhite.github.io/RNeo4j/examples
EngrStudent
¿Cómo pasaría de los datos en neo4j a la agrupación de gráficos? ¿Funcionarían mcl o igraph con él?
EngrStudent
2
Una vez que haya extraído sus datos de neo4j en R, puede usar cualquier otro paquete R (por ejemplo, AndyW sugiere igraph) contra los datos. Alternativamente, el paquete Rneo4j incluye comandos para recuperar datos y también le permite ejecutar el lenguaje de consulta Cypher (análogo a SQL, pero personalizado para el gráfico neo4j db). En Cypher, puede hacer consultas sofisticadas y ejecutar algunos algoritmos predefinidos (rutas más cortas, todas las rutas, todas las rutas simples, Dijkstra, etc.). Estoy en mi límite aquí, tanto en caracteres como en contenido: si desea seguir este camino (¡lo siento!), El sitio neo4j podría ser su próxima parada.
user3123116
1

Para futuros lectores,

Aquí hay un conjunto de funciones de los paquetes igraph y el último es de MCL:

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

Puede encontrar la documentación aquí http://igraph.org/r/doc/ y aquí https://cran.r-project.org/web/packages/MCL/MCL.pdf

Encuentro Walktrap particularmente útil

Omar Jaafor
fuente
Aunque esto puede estar relacionado con la pregunta, no parece ser una respuesta.
Michael R. Chernick
2
Respondí las dos preguntas: ¿Hay un paquete 'R' que agrupe adecuadamente los nodos en la red? ¿Podría indicarme un código de ejemplo para hacer esto? Pero sí, no responde todo el conjunto de preguntas.
Omar Jaafor