jueves, 30 de mayo de 2024

Tutoriales. Redes (grafos)

Redes usando igraph

Generalmente nuestra data, independintemente de lo que pueda contener, es una matriz, o marco, de datos. Y podemos, por tanto, emplear técnicas relacionadas con matrices para manipularla. Por ejemplo, tengo un marco de datos con información sobre algunas alianzas y tendencias políticas de algunos partidos políticos en Venezuela, consumo de alimentos y la serie del Caribe. Aplico operaciones de matrices y, posteriormente, visualizo con grafos (redes)

Preparación de la data

Obtengo la data y los paquetes que necesito

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

Manipulación de marcos y matrices de datos

#dimensiones
dim(coa)
## [1] 44  6

44 Filas, es decir casos, y 6 columnas, es decir variables. Cada fila o cada columna es un vector. Una fila es un vector en que se recoge toda la información de cada variable para ese caso. Cada columna es un vector que ofrece información sobre una variables para todos los casos.Puedo saber las dimensiones de ese marco, lo que me indicará el número de filas y el número de columnas del marco de datos coa

# informacion sobre el primer caso de mi matriz de datos
coa[1,]
##                                  partido siglas fundacoion  tendencia
## 1 Corrientes Revolucionarias Venezolanas    CRV         na Guevarismo
##   ubicacion coalicion
## 1 izquierda       gpp
# Este procedimiento es igual a
"["(coa, 1)
##                                                    partido
## 1                   Corrientes Revolucionarias Venezolanas
## 2                 Independientes por la Comunidad Nacional
## 3             Juventud Unidad en Acción Nacional con Bimba
## 4                          Movimiento Electoral del Pueblo
## 5                         Movimiento Tupamaro de Venezuela
## 6                              Nuevo Camino Revolucionario
## 7                           Partido Comunista de Venezuela
## 8                       Partido Revolucionario del Trabajo
## 9               Partido Socialista Organizado en Venezuela
## 10                   Partido Socialista Unido de Venezuela
## 11                                       Patria Para Todos
## 12                                Por la Democracia Social
## 13              Redes de Respuesta de Cambios Comunitarios
## 14                               Unidad Popular Venezolana
## 15                     Vanguardia Bicentenaria Republicana
## 16                                      Acción Democrática
## 17                                    Alianza Bravo Pueblo
## 18                                    Avanzada Progresista
## 19                                            Bandera Roja
## 20                                            Convergencia
## 21 Comité de Organización Político Electoral Independiente
## 22                                          Cuentas Claras
## 23                                   Democracia Renovadora
## 24                                        Electores Libres
## 25                                          Fuerza Liberal
## 26                                         Gente Emergente
## 27                                        La Causa Radical
## 28                                Movimiento al Socialismo
## 29                Movimiento de Integridad Nacional Unidad
## 30                       Movimiento Ecológico de Venezuela
## 31                                    Movimiento Laborista
## 32                     Movimiento Progresista de Venezuela
## 33                                  Movimiento Republicano
## 34                                                 Moverse
## 35                                        Primero Justicia
## 36                                       Proyecto Carabobo
## 37                                      Proyecto Venezuela
## 38                               Solidaridad Independiente
## 39                                 Unidad Visión Venezuela
## 40                                   Unidos para Venezuela
## 41                           Unión Republicana Democrática
## 42                                         Un Nuevo Tiempo
## 43                                      Vanguardia Popular
## 44                                        Voluntad Popular
# informacion sobre las distintas siglas de los
# 44 casos, la segunda variable
coa$siglas
##  [1] "CRV"          "IPCN"         "JUAN BIMBA"   "MEP"         
##  [5] "MRT"          "NCR"          "PCV"          "PRT"         
##  [9] "PSOEV"        "PSUV"         "PPT"          "PODEMOS"     
## [13] "REDES"        "UPV"          "VBR"          "AD"          
## [17] "ABP"          "AP"           "BR"           "CONVERGENCIA"
## [21] "COPEI"        "CC"           "DR"           "EL"          
## [25] "FL"           "GE"           "LA CAUSA R"   "MAS"         
## [29] "MIN-UNIDAD"   "MOVEV"        "ML"           "MPV"         
## [33] "MR"           "MOVERSE"      "MPJ"          "PROCA"       
## [37] "PRVZL"        "SI"           "UVV"          "UNPARVE"     
## [41] "URD"          "UNTC"         "VP"           "VPA"
# procedimiento equivalente al anterior
coa[[2]]
##  [1] "CRV"          "IPCN"         "JUAN BIMBA"   "MEP"         
##  [5] "MRT"          "NCR"          "PCV"          "PRT"         
##  [9] "PSOEV"        "PSUV"         "PPT"          "PODEMOS"     
## [13] "REDES"        "UPV"          "VBR"          "AD"          
## [17] "ABP"          "AP"           "BR"           "CONVERGENCIA"
## [21] "COPEI"        "CC"           "DR"           "EL"          
## [25] "FL"           "GE"           "LA CAUSA R"   "MAS"         
## [29] "MIN-UNIDAD"   "MOVEV"        "ML"           "MPV"         
## [33] "MR"           "MOVERSE"      "MPJ"          "PROCA"       
## [37] "PRVZL"        "SI"           "UVV"          "UNPARVE"     
## [41] "URD"          "UNTC"         "VP"           "VPA"

Para obtener todos los atributos del marco de datos

# puedo obtener información general
attributes(coa)
## $names
## [1] "partido"    "siglas"     "fundacoion" "tendencia"  "ubicacion" 
## [6] "coalicion" 
## 
## $row.names
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
## 
## $class
## [1] "data.frame"
# o sobre un atributo específico
attr(coa, "row.names")
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

Puedo extraer información de este marco de datos, transformandola en el mismo proceso en una matriz de datos. La matriz se representa como matriz[fila, columna].

# Puedo unir dos filas y crear una nueva matriz de datos
rbind(coa[1,], coa[7,])
##                                  partido siglas fundacoion
## 1 Corrientes Revolucionarias Venezolanas    CRV         na
## 7         Partido Comunista de Venezuela    PCV       1931
##            tendencia ubicacion coalicion
## 1         Guevarismo izquierda       gpp
## 7 Marxismo-leninismo izquierda       gpp
# o puedo unir dos columnas con el mismo objetivo
cbind(coa[,2], coa[,4])
##       [,1]           [,2]                      
##  [1,] "CRV"          "Guevarismo"              
##  [2,] "IPCN"         "Izquierdista"            
##  [3,] "JUAN BIMBA"   "na"                      
##  [4,] "MEP"          "Socialismo"              
##  [5,] "MRT"          "Marxismo"                
##  [6,] "NCR"          "Socialismo"              
##  [7,] "PCV"          "Marxismo-leninismo"      
##  [8,] "PRT"          "Izquierdista"            
##  [9,] "PSOEV"        "Socialismo"              
## [10,] "PSUV"         "SocialismoSiglo XXI"     
## [11,] "PPT"          "Izquierdista"            
## [12,] "PODEMOS"      "Socialdemocracia"        
## [13,] "REDES"        "Izquierdista"            
## [14,] "UPV"          "Comunismo"               
## [15,] "VBR"          "na"                      
## [16,] "AD"           "Socialdemocracia"        
## [17,] "ABP"          "Socialdemocracia"        
## [18,] "AP"           "Centroizquierda"         
## [19,] "BR"           "Marxismo-leninismo"      
## [20,] "CONVERGENCIA" "Socialcristianismo"      
## [21,] "COPEI"        "Socialcristianismo"      
## [22,] "CC"           "Centro progresista"      
## [23,] "DR"           "Socialdemocracia"        
## [24,] "EL"           "Federalismo"             
## [25,] "FL"           "Socialdemocracia"        
## [26,] "GE"           "Centroizquierda"         
## [27,] "LA CAUSA R"   "Sindicalismo"            
## [28,] "MAS"          "Socialismo progresista"  
## [29,] "MIN-UNIDAD"   "Centro derecha"          
## [30,] "MOVEV"        "Ecologismo"              
## [31,] "ML"           "Sindicalismo"            
## [32,] "MPV"          "Centroizquierda"         
## [33,] "MR"           "Centro derecha"          
## [34,] "MOVERSE"      "ambientalismo"           
## [35,] "MPJ"          "Centro Humanismo"        
## [36,] "PROCA"        "Socialcristianismo"      
## [37,] "PRVZL"        "Socialcristianismo"      
## [38,] "SI"           "Humanista cristiano"     
## [39,] "UVV"          "Liberal"                 
## [40,] "UNPARVE"      "Centro"                  
## [41,] "URD"          "Nacionalismo progresista"
## [42,] "UNTC"         "Socialdemocracia"        
## [43,] "VP"           "Izquierdista"            
## [44,] "VPA"          "Centro progresista"

Recordemos que si deseo que esa información se guarde para seguir operando co ella, debo darle un nombre al procedimiento. Por otra parte, estos procedimientos me guardarían la información como matriz (matrix) y no como marco de datos (data.frame). Esto último es muy importante porque un marco de datos puede almacenar vectores con variables de distinto tipo: numérica, caracter, ordinal, etc., en tanto que en una matriz sólo se puede guardar variables de un mismo tipo: todas numéricas, todas tipo caracter, etc.

Note que el nombre de las columnas es claro. Corresponde al nombre de las variables. Sin embargo, en este caso, las filas (row.names) no tienen un nombre discernible sino que aparece como una sucesión de número. Si no cambia el nombre de las filas por uno que tenga sentido, en la red que cree aparecerán estos números, en lugar de los nombres que seguramente pueden ofrecer mayor información.

Redes de afiliación (red de dos modos)

En este tipo de red tenemos las relaciones entre dos tipos de diferentes de nodos: personas y organizaciones, países e importaciones (o cualquier otra relación comercial), etc. De un lado, en las filas, digamos, tenemos las personas, y en las columnas, los eventos. La relación entre las personas, o entre los eventos, no se establece de forma directa, sino, a través de los vínculos persona/evento, organización/evento.

Ejemplo 1. Consumo de alimentos en Venezuela

Desayunos según Decil/Quintil de ingreso

Tengo la data sobre el consumo de alimentos en Venezuela en el año 2005, según Deciles/Quintiels de ingreso. En primer lugar, tengo información sobre el tipo de desayuno:

print(xtable(acondesayunoing), 
      include.rownames = FALSE,type = "html")
Plato.principal TOTAL Decil1 QI QII QIII QIV Decil10
Arepa. Acomp 48.00 64.80 56.20 52.50 46.10 39.10 35.60
Empanadas 16.20 5.10 10.80 13.90 19.20 19.80 17.90
Pan.acomp 14.20 9.80 11.90 11.80 13.40 18.70 22.10
Pastelitos 3.70 1.70 2.60 3.50 3.70 4.90 5.90
Tequeños 2.10 1.00 1.30 2.70 2.80 1.60 1.30
Avena 1.90 1.80 1.80 1.90 1.90 1.90 1.40
Tetero 1.80 3.00 2.70 2.00 1.40 1.20 1.00
Sopas.herv.cremas 1.40 0.40 1.20 1.90 1.70 0.70 0.60
Galletas.acomp 1.40 1.00 0.90 1.00 1.80 1.70 1.80
Bollitos.acomp 1.30 1.90 2.10 1.70 0.80 0.80 0.70
Otros 8.10 9.50 8.40 7.10 7.10 9.70 11.70

Quiero visualizar el tipo de vínculo entre el tipo de desayuno, filas, y el nivel de ingreso. Antes necesito pre-proesar la data. Necesito eliminar la columna “TOTAL”, pasar “Plato.principal” como nombre de filas:

# elimino la columna 'total'
conin<-acondesayunoing[, -c(2)]
# paso los nombres de la primera columna a nombres de filas
rownames(conin)<-conin[,1]
#elimino la primera columna
conin<-conin[,-c(1)]

Dado que tengo una matriz de incidencia, puedo emplear la funcion graph_from_incidence_matrix(), que me dará como resultado una red de dos modos. Quiero ver qué tipo de desayuno elige qué decil/quintil, por tanto, las flechas saldrán de los nodos correspondientes a las columnas

desayunoin<-graph_from_incidence_matrix(conin,
                directed=TRUE, mode="in", weighted = TRUE)

Reviso la estructura

par(bg="gray15",mar=c(1,1,1,1))

plot(desayunoin,vertex.label=NA, asp=FALSE,
     vertex.size=3,
      vertex.color= "gray90",
     vertex.frame.color= "gray90",      
     edge.color="gray55",
     edge.arrow.size=0.6)
print(xtable(estructura(desayunoin)), 
      include.rownames = FALSE,type = "html")
Indicadores valor
nodos 17.00
aristas 66.00
densidad 0.24
diametro 64.80
long.med.cam 1.00
grado medio 7.76
modularidad -0.06
coefic.cluster 0.00

Tenemos una red bipartida con 17 nodos y 66 aristas. Es un grafo bipartido completo, aunque los indicadores parecieran señalar algo distinto. Estos es así porque las redes de dos modos deben evaluarse en forma distinta. Por ello sólo reporto la cantidad de nodos y las cantidad de vínculos.

La visualización nos devuelve una imagen poco interesante. Puedo mejorarla para que me resulte más informativa. Puedo, por ejemplo, escalar los vínculos, de acuerdo con su valor, para obtener el patrón visual sobre que Quintil/Decil de ingreso consume más qué tipo de desayuno, e igualmente puedo reforzar esa información con el color de esos vínculo: colores más claros y líneas más delgadas, menor valor, y líneas más gruesasy y oscuras, mayor valor:

nTerms <- nrow(conin)
nDocs <- ncol(conin)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)
# atributos para los vertices
V(desayunoin)$color[idx.terms] <- rgb(0.1, 0, 1, .9)
V(desayunoin)$size[idx.terms] <- 6
V(desayunoin)$color[idx.docs] <- "#228B22"
V(desayunoin)$size[idx.docs] <- 4
V(desayunoin)$frame.color[idx.terms] <- rgb(0.1, 0, 1, .5)
V(desayunoin)$frame.color[idx.docs] <- "#228B22"
V(desayunoin)$label.color[idx.docs]<-"#8B1A1A"
V(desayunoin)$label.dist<-0.6
# atributo para los vinculos


pacolores <-function(grafo){
        vin<-log(E(grafo)$weight)+.4/
                max(log(E(grafo)$weight)+.4)
        vin2<-ifelse(vin < 0, abs(vin), vin)
        vin2<-ifelse(vin2 > 1, vin2/5, vin2)
        return(list(vin=vin, vin2=vin2))}

ar<-pacolores(desayunoin)        
E(desayunoin)$color <- rgb(1, .5, ar$vin2/2, ar$vin2) 
E(desayunoin)$width<-ar$vin                          

Visualizo de nuevo

plot(desayunoin)

Independientemente del nivel del ingreso, los venezolanos, en el año 2005 preferían desayunar con arepas, y luego con empanada o pan. La empanada era preferida por el Quintil IV, el de menor ingresos, y el Quintil III. En tanto que el pan se consume de forma más o menos uniforme en los Quinteles II-IV. Dado que los deciles no es más que la información agregada de los deciles, extraigamos la red para visualizar el grafo, sin esta información:

# elimino las columnas correspondientes a 'Decil'
conina<-conin[, -c(1,6)]

# genero el grafo
desayuno<-graph_from_incidence_matrix(conina,
                directed=TRUE, mode="in", weighted = TRUE)

# extraigo elementos para mejorar la visualización
nTerms <- nrow(conina)
nDocs <- ncol(conina)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)

ar <-pacolores(desayuno)
# establezco los atributos correspondientes a los nodos
V(desayuno)$color[idx.terms] <- rgb(0.1, 0, 1, .9)
V(desayuno)$size[idx.terms] <- 6
V(desayuno)$color[idx.docs] <- "#228B22"
V(desayuno)$size[idx.docs] <- 4
V(desayuno)$frame.color[idx.terms] <- rgb(0.1, 0, 1, .5)
V(desayuno)$frame.color[idx.docs] <- "#228B22"
V(desayuno)$label.color[idx.docs]<-"#8B1A1A"
V(desayuno)$label.dist<-0.6

#Establezco atributos para las aristas
E(desayuno)$color <- rgb(1, .5, ar$vin2/2, ar$vin2) 
E(desayuno)$width<-ar$vin 

Visualizo de nuevo

plot(desayuno)

Alimentos según sitio de en donde se ingiere

# elimino la columna 'total'
lugar<-aconsumo[, -c(2)]
# paso los nombres de la primera columna a nombres de filas
rownames(lugar)<-lugar[,1]
#elimino la primera columna
lugar<-lugar[,-c(1)]
lugarin<-graph_from_incidence_matrix(lugar,
                directed=TRUE, mode="in", weighted = TRUE)
# extraigo elementos para mejorar la visualización
nTerms <- nrow(lugar)
nDocs <- ncol(lugar)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)

ar <-pacolores(lugarin)
# establezco los atributos correspondientes a los nodos
V(lugarin)$color[idx.terms] <- rgb(178/250, 34/250,
                                   34/250)
V(lugarin)$size[idx.terms] <- 6
V(lugarin)$color[idx.docs] <- "#228B22"
V(lugarin)$size[idx.docs] <- 4
V(lugarin)$frame.color[idx.terms] <- rgb(178/250, 34/250,
                                   34/250)
V(lugarin)$frame.color[idx.docs] <- "#228B22"
V(lugarin)$label.color[idx.docs]<-"#8B1A1A"
V(lugarin)$label.dist<-0.6

#Establezco atributos para las aristas
E(lugarin)$arrow.width <-.50
E(lugarin)$arrow.size <-.9
E(lugarin)$color <- rgb(0/250, 139/250, 0, ar$vin2) 
E(lugarin)$width<-ar$vin 
plot(lugarin)

Las personas, generalmente hacen sus tres comidas en casa; el desayuno es la comida que más tienden a consumir fuera del hogar, básicaente en comedores/cantinas o en lunchería. Cuando se almuerza fuera del hogar, tiende a hacerse en restaurantes.

Ejemplo 2. Serie del Caribe

Sede y ganadores

print(xtable(head(serieCaribe, 8)), 
      include.rownames = FALSE,type = "html")
ANO. SEDE. campeon MANAGER
1976 Rep.Dominicana naranjeros Benjamin Reyes
1986 Venezuela aguilas.mexicali Benjamin Reyes
1974 Mexico  criollos.caguas Bobby Wine
2009 Mexico  tigres.aragua Buddy Bailey
1953 Cuba cangrejeros Buster Clarkson
1970 Venezuela magallanes Carlos Pascual
2006 Venezuela leones.caracas Carlos Subero
1994 Venezuela tigres.licey Casey Parson

De esta información puedo obtener varias redes. Abrevio los nombres

sCaribe <-data.frame(
        campeon = serieCaribe$campeon, 
        sede =serieCaribe$SEDE.)

sCar <-table(sCaribe)



sg1<-graph_from_incidence_matrix(sCar,
                directed=TRUE, mode="in", 
                weighted = TRUE)

ar<-pacolores(sg1)
nTerms <- nrow(sCar)
nDocs <- ncol(sCar)
idx.terms <- 1:nTerms
idx.docs <- (nTerms+1):(nTerms+nDocs)
V(sg1)$color[idx.terms] <- "#68228B"
V(sg1)$frame.color[idx.terms] <- NA 
V(sg1)$size[idx.terms] <- 6

V(sg1)$color[idx.docs] <- "#8FBC8F"
V(sg1)$frame.color[idx.docs] <-NA
V(sg1)$size[idx.docs] <- 4

V(sg1)$label.dist<-0.48
V(sg1)$label.family[idx.docs] <-"mono"
V(sg1)$label.family[idx.terms] <-"sans"
V(sg1)$label.font[idx.docs] <-2
V(sg1)$label.font[idx.terms] <-1
V(sg1)$label.color[idx.docs] <-"#8B4500"
V(sg1)$label.color[idx.terms] <-"#2F4F4F"

E(sg1)$arrow.width <-.50
E(sg1)$arrow.size <-.9
E(sg1)$color <- "#8FBC8F"

Visualizo

plot(sg1,main="Serie del Caribe, segun sede y ganadores")

Convertir redes de dos modos en redes de un modo

cm <-as.matrix(conina)
ej <-cm %*% t(cm)


g <- graph_from_adjacency_matrix(ej,
                                  weighted=TRUE,
                                 diag = FALSE, 
                                 mode="undirected")
ar<-pacolores(g)

# el procedimiento anterior es similar a
g1 <- graph_from_adjacency_matrix((ej+ t(ej))/2,
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="undirected")
plot(g, vertex.size=betweenness(g),
     edge.width=E(g)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

La información que obtenemos al transformar la red de dos nodos en una red de un modo es semejante. Pero en este última modalidad de red podemos emplear los indicadores que ya hemos trabajado. De esta red, por la vía del grosor de los vínculos notamos que la combinación empanada-arepa-pan es la que más se emplea en los desayunos venezolanos; adicionalmente, observamos que los bollitos acompañado y en menor medida las galletas acompañadas son las combinaciones que, sin ser las más comunes, son las que están presentes entre las diferentes combinaciones. La gente, entonces, desayuna empanada y arepas, harina de maíz, y pan, harina de trigo, o bollitos y galletas.

ar<-pacolores(g1)
plot(g1, vertex.size=betweenness(g1),
     edge.width=E(g1)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

Podemos seguir varios procedimientos para simplificar la visualización de la red, y que, a su vez, nos ayudarán a centrar la atención en algunos patrones que de otra forma serían poco evidentes:

ej1<-ej[ ej< 100 ] <- 0

g2 <- graph_from_adjacency_matrix(ej,
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="undirected")
ar<-pacolores(g2)
plot(g2, vertex.size=betweenness(g2),
     edge.width=E(g2)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")
g3 <- graph_from_adjacency_matrix((ej+ t(ej))/2,
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="undirected")
ar<-pacolores(g3)
plot(g3, vertex.size=betweenness(g3),
     edge.width=E(g3)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

Este procedimiento nos revela que la avena también es un un acompañante del desayuno, no figura entre los más frecuentes, pero esta detrás de cada desayuno

ej2 <-cm %*% t(cm)

g4 <- graph_from_adjacency_matrix(ej, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="max")


g5 <- graph_from_adjacency_matrix(ej2, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="max")
ar<-pacolores(g4)
plot(g4, vertex.size=betweenness(g4),
     edge.width=E(g4)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")
ar<-pacolores(g5)

plot(g5, vertex.size=betweenness(g5),
     edge.width=E(g5)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

otro

nzs <- function(x) sort(x [x!=0])

all(nzs(pmax(ej, 
             t(ej))[upper.tri(ej)]) == sort(E(g4)$weight))
## [1] TRUE
g5 <- graph_from_adjacency_matrix(ej2, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="max")

all(nzs(pmax(ej2, 
             t(ej2))[upper.tri(ej)])==sort(E(g5)$weight))
## [1] TRUE
ar<-pacolores(g4)
plot(g4, vertex.size=betweenness(g4),
     edge.width=E(g4)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")
ar<-pacolores(g5)

plot(g5, vertex.size=betweenness(g5),
     edge.width=E(g5)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

otro

g4 <- graph_from_adjacency_matrix(ej, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="min")


g5 <- graph_from_adjacency_matrix(ej2, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="min")


all(nzs(pmin(ej, 
             t(ej))[upper.tri(ej)])==sort(E(g4)$weight))
## [1] TRUE
all(nzs(pmin(ej2, 
             t(ej2))[upper.tri(ej)])==sort(E(g5)$weight))
## [1] TRUE
ar<-pacolores(g4)
plot(g4, vertex.size=betweenness(g4),
     edge.width=E(g4)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")
ar<-pacolores(g5)

plot(g5, vertex.size=betweenness(g5),
     edge.width=E(g5)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

Otro

g6 <- graph_from_adjacency_matrix(ej, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="upper")

all(nzs(ej[upper.tri(ej)]) == sort(E(g6)$weight))
## [1] TRUE
g61 <- graph_from_adjacency_matrix(ej2, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="upper")

all(nzs(ej2[upper.tri(ej2)]) == sort(E(g61)$weight))
## [1] TRUE
ar<-pacolores(g6)
plot(g6, vertex.size=betweenness(g6),
     edge.width=E(g6)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")
ar<-pacolores(g61)

plot(g61, vertex.size=betweenness(g61),
     edge.width=E(g61)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

otro

g7 <- graph_from_adjacency_matrix(ej, 
                                  weighted=TRUE,
                                  diag = FALSE, 
                                  mode="lower")


all(nzs(ej[lower.tri(ej)]) == sort(E(g7)$weight))
## [1] TRUE
ar<-pacolores(g7)

plot(g7, vertex.size=betweenness(g7),
     edge.width=E(g7)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

Otro

g8 <- graph_from_adjacency_matrix(ej, 
                                  weighted=TRUE,
                                  diag=FALSE,
                                  mode="plus")

d2 <- function(x) { diag(x) <- diag(x)/2; x }

all(nzs((d2(ej+t(ej)))[lower.tri(ej)]) == sort(E(g8)$weight))
## [1] TRUE
ar<-pacolores(g8)

plot(g8, vertex.size=betweenness(g8),
     edge.width=E(g8)$weight/900, 
     edge.color=rgb(47/255, 79/255, 79/255, ar$vin2/10),
     vertex.color="#8B0A50", 
     vertex.frame.color=NA,
     vertex.label.family="sans")

No hay comentarios.: