jueves, 30 de mayo de 2024

Tutoriales. Grafos (redes)

Tipos de grafos

De acuerdo con el tipo de relación que se mide en el grupo de actores analizados, los grafos pueden ser binarios, signados, u ordinales. Los grafos binarios reportan si existe o no una relación; los grafos signados nos indican si la relación es negativa, neutra y positiva (-1, 0, 1);en tanto que los grafos con relaciones ordinales nos indican la intensidad de la relación. También es posible tener grafos cuyas relaciones sean valoradas con números reales. Por ejemplo las magnitudes económicas en las relaciones comerciales entre dos actores, la frecuencia con la que ocurre la relación, etc.


Cargo la data y el paquete necesario

load("D:/pRedes.RData")
require(igraph)

Elaboro un ejemplo de relaciones binarias:

#creo una matriz binaria
	(l <- matrix(rep(seq(0,1),8), 4, byrow=T))
##      [,1] [,2] [,3] [,4]
## [1,]    0    1    0    1
## [2,]    0    1    0    1
## [3,]    0    1    0    1
## [4,]    0    1    0    1
# creo nombres para las columnas y las filas
	rownames(l)<-c(LETTERS[1:4]) 
	colnames(l)<-c(LETTERS[1:4])

	# creo el grafo con la funcion graph.adjacency porque se trata de una matriz cuadrada
         
	g <-graph.adjacency(l, diag=FALSE)

# visualizo
plot(g)

En este grafo se observa que los dos nodos (puntos) importantes por las relaciones que tienen son los nodos "B" y "D". Los otros dos nodos no se relacionan entre sí y, prácticamente, dependen de los dos nodos anteriores para "enterarse" u obtener lo que quiera que sea lo que el tipo de relación provee.

Veamos ahora un ejemplo con relaciones signadas. Se distinguirá las relaciones (negativas o positivas) con el color y con el tipo de línea:

# genero una matriz
l <- matrix(rep(seq(-1,1), 48), 12, byrow = T)
l
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
##  [1,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [2,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [3,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [4,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [5,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [6,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [7,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [8,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
##  [9,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
## [10,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
## [11,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
## [12,]   -1    0    1   -1    0    1   -1    0    1    -1     0     1
# etiqueto
rownames(l)<-c(LETTERS[1:12]) 
colnames(l)<-c(LETTERS[1:12])
g <-graph.adjacency(l, diag=FALSE, weighted = TRUE)

Coloco atributos

# creo un vector para luego colorear las aristas según
# el tipo de relación presente, negativa o positiva

colores <-ifelse(E(g)$weight < 0, "red", "blue")

# genero un vector que me permita diferenciar las aristas
# segun el tipo de relacion, negativa, linea discontinua
tipos <-ifelse(E(g)$weight < 0, "dashed", "solid")
E(g)$lty <- tipos
E(g)$color <- colores
V(g)$color <- "#8B008B"
V(g)$frame.color <- NA
V(g)$label.color <- "white"

Visualizo

plot(g)

Si, por ejemplo, el tipo de relación que se modela con este grafo es la simpatía y antipatía en un contexto dado, se vería fácilmente que, aparentemente, predominan la antipatía en ese contexto.

Las relaciones ordinales y también las que se basan en múmeros reales permiten distinguir la intensidad o el peso de la relación. Escogeré, ademas, que esa intensidad se observe no sólo con el grosor de las líneas sino también con la intensidad del color.

# genero la matriz
m <- matrix(sample(rep(1:4, 300), 144), 12)
m[, c(5, 8)]<-c(0,0,0,4,0,2,0,1,0,0,1,1)
m[, c(1, 12)]<-c(0,0,0,0,0,2,0,0,0,0,1,1)
m[, c(3, 7)]<-c(0,1,0,0,0,2,0,0,0,4,1,1)
m[, c(6, 11)]<-c(4,1,0,0,3,2,0,0,0,4,1,1)
# etiqueto
rownames(m)<-colnames(m)<-c(LETTERS[1:12])
g <-graph.adjacency(m, diag=FALSE, weighted = TRUE)

# colores de las aristas segun el rango
colores<-E(g)$weight
colores<-ifelse(colores ==1, "gray90", colores)
colores<-ifelse(colores ==2, "gray60", colores)
colores<-ifelse(colores ==3, "gray30", colores)
colores<-ifelse(colores ==4, "gray15", colores)

E(g)$width<- E(g)$weight
E(g)$arrow.size <-.9
E(g)$color <- colores
V(g)$color <- "#8B008B"
V(g)$frame.color <- NA
V(g)$label.color <- "white"
plot(g)

Elaboro ahora un ejemplo con data real. He obtenido información sobre a)los principales aereopuertos del país y las ciudades a las que sirven; b)los dueños de las tierras (antiguas haciendas) que posteriormente se transformaron en las urbanizaciones de Caracas, así como los constructores de esas urbanizaciones.

aer<-table(aereopuertos$ciudadserv, aereopuertos$estado)

g1 <-graph_from_incidence_matrix(aer, directed=TRUE, 
                                 mode="in", weighted = TRUE)
par(bg="gray15",mar=c(1,1,1,1)) 

plot(g1, edge.width=0.9, vertex.size=3, 
      edge.arrow.size=0.6,
      vertex.color= "#BF3EFF",
     vertex.frame.color= NA,
     asp=FALSE, vertex.label.color = "#C1FFC1")


Dueños de las tierras en las que se construyeron posteriormente urbanizaciones en la gran Caracas

terminos <-1:61
columnas <-62:97
colores <-ifelse(caracas.urbaniacion$ubicación =="distrito federal", "#98F5FF", "#E9967A")

m2 <-table(caracas.urbaniacion$urbanizacion,
           caracas.urbaniacion$propietario)
g2 <-graph_from_incidence_matrix(m2, directed=TRUE, 
                                 mode="in", weighted = TRUE)
V(g2)$size[terminos] <- 4
# vertices de columnas
V(g2)$size[columnas] <- 5
V(g2)$color[terminos] <- colores
V(g2)$color[columnas] <- "#F0FFFF"
# colores frame
V(g2)$frame.color[terminos] <-  NA
V(g2)$frame.color[columnas] <- NA
# etiquetas
V(g2)$label.color[terminos]<-"#FFF8DC"
V(g2)$label.color[columnas]<-"#008B8B"
V(g2)$label.family[columnas] <-"mono"
V(g2)$label.cex[terminos]<-0.9
E(g2)$arrow.width <-.45
E(g2)$arrow.size <-.9
par(bg="gray15",mar=c(1,1,1,1)) 

plot(g2)


Quien construyó

m3 <-table(caracas.urbaniacion$urbanizacion,
           caracas.urbaniacion$urbanizador)
m31 <- m3 %*% t(m3)



g <- graph_from_adjacency_matrix(m31, mode="undirected",
                                 diag = FALSE,
                                 weighted = "TRUE"
                                 )
g0 <- delete.vertices(g,
                      V(g)[degree(g)==0]) 

E(g0)$arrow.width <-.45
E(g0)$arrow.size <-.9
V(g0)$color <- "#F0FFF0"

# colores frame
V(g2)$frame.color <-  NA

# etiquetas
V(g0)$label.color<-"#BFEFFF"

V(g2)$label.cex<-0.9
par(bg="gray15",mar=c(1,1,1,1)) 
plot(g0,vertex.size=2, 
     layout= layout.fruchterman.reingold, 
     asp=FALSE)

No hay comentarios.: