Algunas definiciones importantes desde la perspectiva de grafos
Un grafo es un conjunto de vértices (que también pueden denominarse: nodos, actores) y un conjunto de líneas entre pares de vértices a las que se denomina vínculos (también: edges, links, relaciones). Un grafo representa la estructura de una red.
Matriz de incidencia. Una matriz binaria (los elementos son ceros o unos) y se emplea para representar la ausencia o presencia de, por ejemplo, una relación Matriz de adyacencia, es una matriz cuadrada que se emplea para representar relaciones binarias La matriz una diferencia característica de una matriz de adyacencia con respecto a una matriz de incidencia es que la primera es cuadrada, por tanto simétrica, en tanto que una matriz de incidencia es rectangular.
Las relaciones también pueden representarse con listas que contienen el par odrdenado nodos y vertices.
Grafos. Representaciones y visualizaciones
Existen numerosas opciones para crear un grafo en el paquete igraph. Veamos algunas de ellas. Para visualizar los grafos debemos emplear la función plot()
Grafos. Función graph()
Con la función graph() podemos generar gráficos rápidos, para ello debemos especificar el ID de los nodos:
g <- graph(c(1, 2, 3, 4, 5, 6, 1, 5))
plot(g)
Podemos crear grafos sin nodos y luego agregarlos poco a poco. Para ello empleamos la función graph.empty. De la misma forma se pueden crear grafos completos, circulares, tipo estrella:
g <- graph.empty()
g <- graph.empty(n = 10)
plot(g)
g <- graph.star(10, mode = "out")
plot(g)
g <- graph.star(10, mode = "in")
plot(g)
plot(graph.ring(10))
plot(graph.tree(10, 2))
Grafos.Usando fórmulas
Este tipo de representación es útil para crear grafos pequeños. Las relaciones se representan con:
- Un signo menos “-” entre nodos cuando la relación es indirecta: A-B
- Un signo más “+” si la relación es directa y es recíproca entre un par de nodos A+B
- un signo menos seguido de un signo más para representar la relación direta entre un par de nodos. El signo mas se coloca del lado del nodo que recibe la relación: A-+B
- Si la relación es similar para varios nodos, entonces se colocan dos puntos entre el primero nodo y el resto: A+B:C:D
Visualizando los grafos anteriores:
# Relacion indirecta
g <- graph.formula(A - B)
plot(g)
plot(graph.formula(A + B))
plot(graph.formula(A - +B, A + -C:D:E:F, B + F))
plot(graph.formula(alicia + bob, ))
# creamos algunas relaciones entre personajes de Cien Años de Soledad
plot(graph.formula("jose arcadio" - "jose arcadio buendia":"ursula iguaran",
"jose arcadio buendia" - "ursula iguaran", "aureliano" - "jose arcadio buendia":"ursula iguaran",
"amaranta" - "jose arcadio buendia":"ursula iguaran", "rebeca" - "nicanor uloa":"rebeca montiel",
"jose arcadio" - "rebeca", "jose arcadio" - "pilar ternera", "arcadio" -
"jose arcadio":"pilar ternera"))
Grafos. Matriz de adyacencia y matriz de incidencia
Creemos una matriz rápidamente:
n <- 10
m <- 10
AA <- matrix(sample(0:1, m * n, replace = TRUE), m, n)
AA
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0 1 0 1 0 0 0 1 1 1
## [2,] 1 1 0 1 0 0 0 0 0 0
## [3,] 1 1 0 1 1 0 0 1 1 0
## [4,] 1 0 0 0 1 1 1 0 1 1
## [5,] 0 0 1 0 0 0 0 0 0 1
## [6,] 1 0 1 1 1 0 1 1 0 0
## [7,] 0 0 0 1 1 0 1 0 1 0
## [8,] 1 0 1 1 1 1 0 0 1 0
## [9,] 0 0 0 0 0 0 1 1 1 0
## [10,] 0 0 1 0 0 0 1 1 1 1
# nombres para las filas y las columnas
colnames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
rownames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
AA
## A B C D E F G H I J
## A 0 1 0 1 0 0 0 1 1 1
## B 1 1 0 1 0 0 0 0 0 0
## C 1 1 0 1 1 0 0 1 1 0
## D 1 0 0 0 1 1 1 0 1 1
## E 0 0 1 0 0 0 0 0 0 1
## F 1 0 1 1 1 0 1 1 0 0
## G 0 0 0 1 1 0 1 0 1 0
## H 1 0 1 1 1 1 0 0 1 0
## I 0 0 0 0 0 0 1 1 1 0
## J 0 0 1 0 0 0 1 1 1 1
Esta matriz puede ser la representación de la relación entre personas, comunidades, organizaciones países, etc. Supongamos que se trata de las relaciones comerciales entre países. Como queremos representar la relación comercial entr los países, debemo asegurarnos de que la diagonal, donde cada país se cruza consigo mismo sea 0, es decir no consideramos las relaciones comerciales de cada país consigo mismo
diag(AA) <- 0
AA
## A B C D E F G H I J
## A 0 1 0 1 0 0 0 1 1 1
## B 1 0 0 1 0 0 0 0 0 0
## C 1 1 0 1 1 0 0 1 1 0
## D 1 0 0 0 1 1 1 0 1 1
## E 0 0 1 0 0 0 0 0 0 1
## F 1 0 1 1 1 0 1 1 0 0
## G 0 0 0 1 1 0 0 0 1 0
## H 1 0 1 1 1 1 0 0 1 0
## I 0 0 0 0 0 0 1 1 0 0
## J 0 0 1 0 0 0 1 1 1 0
Creamos entonces el grafo a partir de esta matriz:
plot(graph.adjacency(AA))
A partir de una matriz de incidencia
n <- 10
m <- 8
AA <- matrix(sample(0:1, m * n, replace = TRUE), m, n)
colnames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
rownames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H")
diag(AA) <- 0
plot(graph.incidence(AA, directed = TRUE))
Grafo. Data.frame
En ocasiones la data que tenemos está en forma de data.frame. En esos casos sólo empleamos la función graph.data.frame()
plot(graph.data.frame(rebeliones[, c(8, 7)]))
caso1 <- as.matrix(table(colonia))
g <- graph.incidence(caso1, mode = c("all"))
plot(g)