Skip to content

[R-es] igraph V a partir de E y subgrafos

5 messages · Javier Marcuzzi, Luisfo

#
Estimados

Tengo un problema. Con igraph creo una red a partir de un data.frame, las dos primeras columnas son V y las restantes E. Hay un trabajo anterior, yo me pregunté ¿Qué pasaría si las cosas hablaran entre ellas?, entonces hay un cruce de información de todos contra todos y elimino los nulos y duplicados. Al ver los listados E, V tienen la información. Hasta ahí estaría todo bien (me interesa puntos o cosas que aporten información, no la información).

Ahora donde comienzan las complicaciones, conociendo una palabra (cosa) que está en E, quiero tener los V que la contienen. Ej, la relación A?B dentro de sus cosas tienen ?casa?, yo quiero un grafo con todos los V que tengan ?casa?.

Tengo tres alternativas:

Buscar a partir del índice que tiene la palabra ?Casa?
idx <- match("Casa", V(datos.network)$name)
res <- E(datos.network) [ from(idx) ] 

Pero esta forma no me gusta, porque idx 160 (resultado real) al ser reemplazado en from(idx) por from(160) da un resultado errado. Str(res) me resulta un poco ?feo?.

La siguiente forma me es mucho más agradable a la vista
Los veo como un data.frame, correcto, varias columnas, una por cada categoría de E y su palabra correspondiente. Pero plot(a) no grafica una red. No lo es.
Lo mismo, pero ahora es una red, lo grafico y me doy cuenta que faltan cosas, detecta el V que tiene el E, pero no toma ningún E de ese V que no coincida la palabra, en otra forma, A?B en la columna habitad tienen ?Casa? y en la columna transporte tienen ?Bicicleta?, bueno, no aparece nada de la información de esta última. Me interesa por ejemplo para colocar un color según el transporte.
Error in .Call("R_igraph_induced_subgraph", graph, vids - 1, impl, PACKAGE = "igraph") : 
  At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id
La última forma que se me ocurrió me da un error que comparto.

Lo siguiente 
jj <-datos.network - E(datos.network)[E(datos.network)$habitad !="Casa"]
Funciona correcto, pero al graficarlo crea una cantidad muy grande de puntos con unos pocos señalados (exagerando, como si en una galaxia marco el sistema solar). Todos los V quedan en el gráfico con un valor de 0 creo, se ven, no quiero que estén presentes, por eso si a todos les resto todos los que no son solo me quedan los que son, pero en el gráfico aparecen todos los puntos, solo marcados los que son.

No es nada reproducible y posiblemente poco entendible, pero ¿alguien puede aportar un comentario a mi desorden?

Desde ya, muchas gracias.

Javier Rubén Marcuzzi
1 day later
#
Estimados

Encontré una solución, que no comprendo pero arregla uno de los problemas.

En la preparación de datos tengo varias partes, al final realizo un cbind y luego un merge, esto da error, pero si realizo merge y luego cbind, no hay error (no se ?pierde eso que comenté en el correo anterior?).

Luego igraph crea el grafo y el sub grafo que al graficar es correcto.

Ahora, porqué esa diferencia, no tengo la menor idea.

Solo queda el problema de
Error in .Call("R_igraph_induced_subgraph", graph, vids - 1, impl, PACKAGE = "igraph") : 
  At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id
 
Pero hay un avance, por lo menos regreso a la lógica de los libros, aunque me desconcierta el porqué esa diferencia al preparar el data.frame que luego es leído por igraph. En varios años con R y muchísimos errores, es lo primero que me sorprende sin entender nada.

Javier Rubén Marcuzzi

De: javier.ruben.marcuzzi en gmail.com
#
Estimado Javier,

Me alegra que hayas avanzado con tu error.

Te respondo a esto último.
La función induced.subgraph() espera como segundo parámetro una lista de 
los IDs de los vértices, mientras que tú le estás pasando una lista de 
'edges'.

Prueba lo siguiente:

c <- induced.subgraph(datos.network, which(V(datos.network)$name == 'Casa'))

Si entendí bien todo, debería funcionar.

Un saludo,

*Luisfo Chiroque*
/PhD Student | PhD Candidate
IMDEA Networks Institute/
http://fourier.networks.imdea.org/people/~luis_nunez/ 
<http://fourier.networks.imdea.org/people/%7Eluis_nunez/>
On 09/05/2016 07:08 PM, javier.ruben.marcuzzi en gmail.com wrote:

  
  
#
Estimado Luisfo

Gracias por la acotación, tendía que ver ese cambio, hora ¿el resultado sería el mismo al crear el subgrafo o hay una diferencia entre el subgrafo entre: subgraph.edges y induced.subgraph? Yo pienso que colocando correctamente los parámetros el resultado no debería ser distinto.

Otra pregunta, hay una forma de colocar más de un filtro en lo siguiente:
plot(subgraph.edges(datos.network, E(datos.network)[[inc(?Casa?)]]))
a por ejemplo
plot(subgraph.edges(datos.network, E(datos.network)[[inc('Casa')  ++++  otro filtro +++]]))

Porque me parece que tendré que filtrar y luego crear los grafos, no estoy dando justo con lo que necesito, me resulta muy fácil crear un montón de igraph(?.), pero me parece que sería ineficiente.

Javier Rubén Marcuzzi

De: Luisfo
#
Estimado Javier,

Te respondo a esto rápidamente.

Pienso como tú, que el resultado de /subgraph.edges/ e 
/induced.subgraph/ debería ser el mismo. No se me ocurre ahora mismo 
ningún caso donde no sea así.
Sin embargo,/subgraph.edges/ tiene un tercer parámetro opcional por si 
quieres conservar los vértices, a pesar de que desaparezcan todas sus 
aristas.

Para colocar más de un filtro en la 'query' de edges, se pueden 
concatenar con comas ( , ), haciendo la función de ORs.
Ejemplo:
     plot(subgraph.edges(datos.network, E(datos.network)[[inc('Casa'), 
inc('otro filtro'), ... ]]))

Un saludo,

*Luisfo Chiroque*
/PhD Student | PhD Candidate
IMDEA Networks Institute/
http://fourier.networks.imdea.org/people/~luis_nunez/ 
<http://fourier.networks.imdea.org/people/%7Eluis_nunez/>
On 09/06/2016 03:55 PM, javier.ruben.marcuzzi en gmail.com wrote: