Una relación no dirigida (simétrica) tiene uno y solo un valor por díada. Por otro lado, una relación dirigida (asimétrica) tiene dos valores por díada, un valor que representa la perspectiva de cada miembro de la pareja.
Se dice que una red es una red no dirigida si todas las relaciones en ella no están dirigidas, y se denomina red dirigida o dígrafo en caso contrario.
Ejemplos de relaciones no dirigidas:
Ejemplos de relaciones dirigidas:
Una relación binaria (dicotómica) únicamente asume dos valores, a saber, ausencia o presencia de la relación. Mientras que una relación ponderada (numérica) toma más de dos valores para caracterizar las relaciones entre las díadas.
Ejemplos de relaciones binarias:
Ejemplos de relaciones ponderadas:
Red de relaciones de trabajo colaborativo entre
miembros de una firma de abogados (SG&R) disponible en el paquete
sand
de R
y en este enlace.
Un enlace indica que los miembros de la firma han trabajado juntos en al menos un caso.
# paquetes
suppressMessages(suppressWarnings(library(igraph)))
suppressMessages(suppressWarnings(library(sand)))
suppressMessages(suppressWarnings(library(corrplot)))
# datos: relaciones de trabajo colaborativo
head(elist.lazega)
## V1 V2
## 1 V1 V17
## 2 V2 V7
## 3 V2 V16
## 4 V2 V17
## 5 V2 V22
## 6 V2 V26
# clase de objeto
class(elist.lazega)
## [1] "data.frame"
# grafo
g <- graph_from_data_frame(d = elist.lazega, directed = "F")
# clase de objeto
class(g)
## [1] "igraph"
# dirigida?
is_directed(g)
## [1] FALSE
# ponderada?
is_weighted(g)
## [1] FALSE
# orden
(n <- vcount(g))
## [1] 34
# tamaño
(s <- ecount(g))
## [1] 115
# visualización
igraph_options(vertex.label = 1:vcount(g), vertex.size = 9, vertex.frame.color = 1, vertex.color = 0, vertex.label.color = "black", edge.color = "blue4")
par(mfrow = c(1,2))
# diseño circular
plot(g, layout = layout_in_circle)
# diseño de Fruchterman y Reingold: Graph Drawing by Force-directed Placement
set.seed(1234)
plot(g, layout = layout_with_fr)
La matriz de adyacencia Y=[yi,j] asociada con una red binaria de n vértices es una matriz binaria de n×n tal que yi,j=1 si {i,j}∈E y yi,j=0 si {i,j}∉E.
La diagonal principal de una matriz de adyacencia está llena de ceros estructurales.
La matriz de adyacencia de un grafo no dirigido es necesariamente simétrica. Mientras que la matriz de adyacencia de un grafo dirigido es posiblemente asimétrica.
# matriz de adyacencia
Y <- as.matrix(get.adjacency(graph = g, names = F))
# clase de objeto
class(Y)
## [1] "matrix" "array"
# dimensión
dim(Y)
## [1] 34 34
# simétrica?
isSymmetric(Y)
## [1] TRUE
# visualización
igraph_options(vertex.label = 1:vcount(g), vertex.size = 9, vertex.frame.color = 1, vertex.color = 0, vertex.label.color = "black", edge.color = "blue4")
par(mfrow = c(1,2))
# grafo
set.seed(1234)
plot(g, layout = layout_with_fr)
# matriz de adyacencia
corrplot(corr = Y, col.lim = c(0,1), method = "color", tl.col = "black", tl.cex = 1.4, addgrid.col = "gray90", cl.pos = "n")
Un vértice v∈V es incidente en una arista e∈E si e={v,u} para algún u∈V.
El grado dv de un vértice v∈V corresponde al número de aristas indicentes en v.
Se define fd como la fracción de vértices v∈V tales que dv=d. La colección {fd} se denomina distribución de grado de G.
# grados
(d <- degree(g))
## V1 V2 V3 V4 V5 V6 V7 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
## 1 6 3 9 6 5 2 3 5 1 9 2 6 11 13 15 8 10 4 1
## V22 V24 V25 V26 V28 V29 V30 V31 V32 V33 V34 V35 V36 V27
## 9 9 5 12 13 9 4 13 12 5 6 7 3 3
# grados ordenados descendentemente
d[order(d, decreasing = T)]
## V17 V16 V28 V31 V26 V32 V15 V19 V4 V12 V22 V24 V29 V18 V35 V2 V5 V14 V34 V6
## 15 13 13 13 12 12 11 10 9 9 9 9 9 8 7 6 6 6 6 5
## V10 V25 V33 V20 V30 V3 V9 V36 V27 V7 V13 V1 V11 V21
## 5 5 5 4 4 3 3 3 3 2 2 1 1 1
# distribución de grado
dg <- table(factor(d, levels = 0:n))/n
round(dg, 3)
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12
## 0.000 0.088 0.059 0.118 0.059 0.118 0.118 0.029 0.029 0.147 0.029 0.029 0.059
## 13 14 15 16 17 18 19 20 21 22 23 24 25
## 0.088 0.000 0.029 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## 26 27 28 29 30 31 32 33 34
## 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
# distribución de grado
round(degree_distribution(g), 3)
## [1] 0.000 0.088 0.059 0.118 0.059 0.118 0.118 0.029 0.029 0.147 0.029 0.029
## [13] 0.059 0.088 0.000 0.029
# visualización
igraph_options(vertex.label.color = "black", edge.color = "blue4", layout = layout_with_fr)
par(mfrow = c(1,2))
# grafo
set.seed(1234)
plot(g, vertex.label = 1:vcount(g), vertex.size = 9, vertex.frame.color = 1, vertex.color = 0)
# gra
set.seed(1234)
plot(g, vertex.label = NA, vertex.size = degree(g), vertex.frame.color = "gold", vertex.color = adjustcolor("gold",0.1))
La densidad de una red no dirigida se define como la frecuencia relativa de las aristas observadas respecto al potencial de aristas.
La densidad de una red no dirigida se calcula como den(G)=|E||V|(|V|−1)/2.
# densidad
round(s/(n*(n-1)/2), 3)
## [1] 0.205
# densidad
round(sum(Y)/(n*(n-1)), 3)
## [1] 0.205
# densidad
round(edge_density(g), 3)
## [1] 0.205
Los estados triádicos no dirigidos son:
Una tripla está constituida por tres nodos conectados por dos (tripla abierta) o tres (tripla cerrada) aristas no dirigidas.
La transitividad se cuantifica por medio del coeficiente de agrupamiento que se calcula como cl(G)=no. triplas cerradasno. triplas=3×no. triángulosno. triplas=3τ△(G)τ3(G), donde τ△(G) es el número de triángulos y τ3(G) es el número de triplas.
# numero de triángulos
sum(count_triangles(g))
## [1] 360
# conteos de estados triádicos
(mot <- motifs(g, size = 3))
## [1] NA NA 566 120
# coeficiente de agrupamiento (transitividad)
round(3*mot[4]/(mot[3] + 3*mot[4]), 3)
## [1] 0.389
# coeficiente de agrupamiento (transitividad)
round(transitivity(g), 3)
## [1] 0.389
La asortatividad se refiere a la tendencia de los vértices a conectarse con otros vértices que tienen características similares (homofilia).
La asortatividad se mide a través de coeficientes que indican el grado de similitud o disimilitud entre los nodos conectados.
Un coeficiente popular para cuantificar la asortatividad es el coeficiente de asortatividad de grado que para redes no dirigidas se calcula como r=1s2q∑j,kjk(ej,k−qjqk), donde ej,k es la fracción de aristas que conectan vértices de tipo j y k, qj=∑kej,k y sq es la desviación estándar de los qj.
Este coeficiente compara los grados de los nodos que están conectados entre sí.
El coeficiente de asortatividad de grado varía entre −1 y 1. Si el coeficiente es positivo, indica que existe una tendencia hacia la conexión de nodos con grados similares (asortatividad). Si el coeficiente es negativo, indica una preferencia por la conexión de nodos con grados diferentes (disortatividad).
# coeficiente de asortatividad de grado
round(assortativity_degree(g), 3)
## [1] -0.168
# assortativity_degree usa el grado como valores de vértice y llama assortativity
round(assortativity(g, types1 = degree(g)), 3)
## [1] -0.168