Network-level Measures and Two-mode Networks

WEN, Tzai-Hung (NTU Geography)

library(sna)
library(igraph)

1. Network-level Measures

setwd("D:/R_Labs")
data<- "sample_adjmatrix.csv"
el<-read.table(data, header=T, row.names=1, sep=",")
m=as.matrix(el)
gplot(m, displaylabels=TRUE)

Network-level Measures: Connectivity, Dyad census, Triad census, and path/cycle census
# Network Connectivity
component.dist(m)
## $membership
## [1] 1 1 1 1 1 1 1
## 
## $csize
## [1] 7
## 
## $cdist
## [1] 0 0 0 0 0 0 1
component.largest(m)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# Network-level measure
sna::dyad.census(m)
##      Mut Asym Null
## [1,]  10    0   11
sna::triad.census(m)
##      003 012 102 021D 021U 021C 111D 111U 030T 030C 201 120D 120U 120C 210
## [1,]   6   0  13    0    0    0    0    0    0    0  11    0    0    0   0
##      300
## [1,]   5
sna::kpath.census(m)
## $path.count
##   Agg 23732 23778 23824 23871 58009 58098 58256
## 1  20     6     8     2     8     4    10     2
## 2  52    26    30     6    32    16    38     8
## 3  90    60    70    18    74    40    80    18
sna::kcycle.census(m)
## $cycle.count
##   Agg 23732 23778 23824 23871 58009 58098 58256
## 2  10     3     4     1     4     2     5     1
## 3  10     6     6     0     8     2     8     0
cc<-kcycle.census(m,maxlen=5,tabulate.by.vertex=FALSE, cycle.comembership="bylength")
cc$cycle.count          #Examine cycle counts
##  2  3  4  5 
## 10 10 10  4
cc$cycle.comemb[1,,]    #Co-membership for 2-cycles
##       23732 23778 23824 23871 58009 58098 58256
## 23732     3     1     0     1     0     1     0
## 23778     1     4     1     1     0     1     0
## 23824     0     1     1     0     0     0     0
## 23871     1     1     0     4     1     1     0
## 58009     0     0     0     1     2     1     0
## 58098     1     1     0     1     1     5     1
## 58256     0     0     0     0     0     1     1
cc$cycle.comemb[2,,]    #Co-membership for 3-cycles
##       23732 23778 23824 23871 58009 58098 58256
## 23732     6     4     0     4     0     4     0
## 23778     4     6     0     4     0     4     0
## 23824     0     0     0     0     0     0     0
## 23871     4     4     0     8     2     6     0
## 58009     0     0     0     2     2     2     0
## 58098     4     4     0     6     2     8     0
## 58256     0     0     0     0     0     0     0
cc$cycle.comemb[3,,]    #Co-membership for 4-cycles
##       23732 23778 23824 23871 58009 58098 58256
## 23732     8     6     0     8     2     8     0
## 23778     6     8     0     8     2     8     0
## 23824     0     0     0     0     0     0     0
## 23871     8     8     0    10     4    10     0
## 58009     2     2     0     4     4     4     0
## 58098     8     8     0    10     4    10     0
## 58256     0     0     0     0     0     0     0
Network-level Measures: Centralization, Density, Reciprocity, and Transitivity
g1=graph.adjacency(m,mode="undirected",weighted=NULL)

igraph::graph.density(g1)  # Density 
## [1] 0.4761905
igraph::reciprocity(g1)  # Reciprocity
## [1] 1
igraph::transitivity(g1) # Transitivity
## [1] 0.5769231
centr_degree(g1)$centralization # Centralization according to degree centrality
## [1] 0.3571429
centr_eigen(g1)$centralization  # Centralization according to eigenvector centrality
## [1] 0.4580906
Network-level Measures: Network diameter, Average path length (APL)
diameter(g1) # Network diameter
## [1] 3
shortest.paths(g1, mode="out") # Shortest paths between vertices
##        X23732 X23778 X23824 X23871 X58009 X58098 X58256
## X23732      0      1      2      1      2      1      2
## X23778      1      0      1      1      2      1      2
## X23824      2      1      0      2      3      2      3
## X23871      1      1      2      0      1      1      2
## X58009      2      2      3      1      0      1      2
## X58098      1      1      2      1      1      0      1
## X58256      2      2      3      2      2      1      0
average.path.length(g1)
## [1] 1.619048


2. Two-mode networks

setwd("D:/R_Labs")
data<- "mag_act96.csv"
magact96<-read.table(data, header=T, row.names=1, sep=",")
magact96<-magact96[1:100, 1:23]

data<- "mag_act97.csv"
magact97<-read.table(data,header=T, row.names=1, sep=",")
magact97<-magact97[1:100, 1:23]

data<- "mag_act98.csv"
magact98<-read.table(data,header=T, row.names=1, sep=",")
magact98<-magact98[1:100, 1:23]

# (2) Create the attribute data. 
magattrib = magact96[,1:3]

# (3) Drop columns so we have a square incidence matrix for each year
g96 = as.matrix(magact96[,-(1:3)]) # 100x 20 matrix

# Now load in these two-mode graphs into igraph.
i96 <- graph.incidence(g96, mode=c("all")) 
V(i96);vcount(i96)
## + 120/120 vertices, named:
##   [1] 101498 104452 104456 104462 104471 105215 106517 106569 106572 106587
##  [11] 106592 106604 106606 106609 106621 106709 106732 109492 109493 113047
##  [21] 113050 113053 113060 113105 113107 113122 113123 113127 113137 113140
##  [31] 113168 113204 113211 113214 113243 113429 113433 113479 113694 113719
##  [41] 113939 113958 114002 114010 114015 114025 114037 114071 114073 114076
##  [51] 114078 114085 114097 114111 114126 114134 114144 114148 114187 114189
##  [61] 114227 114233 114235 114239 114240 114242 114248 114493 114671 114679
##  [71] 114684 114746 114841 114843 114844 114849 114850 114875 114885 114920
##  [81] 114934 114945 114977 114988 114992 115075 115094 115101 115166 115180
##  [91] 115182 115212 115229 115383 115433 115460 115477 115782 115805 115830
## + ... omitted several vertices
## [1] 120
V(i96)$color[1:100] = rgb(red = 1, green = 0, blue = 0, alpha = .5) # students
V(i96)$color[101:120] = rgb(red = 0, green = 1, blue = 0, alpha = .5) # clubs
V(i96)$label = V(i96)$name
V(i96)$label.color = rgb(0,0,.2,.5)
V(i96)$label.cex = .4
V(i96)$size = 6
V(i96)$frame.color = V(i96)$color

E(i96)$color = "black"
plot(i96, layout=layout.fruchterman.reingold)

# removing isolates
i96 = delete.vertices(i96, V(i96)[degree(i96)==0 ])
V(i96);vcount(i96)
## + 63/63 vertices, named:
##  [1] 101498 104452 104456 104462 106604 106609 106709 109493 113047 113053
## [11] 113122 113127 113137 113140 113168 113211 113214 113429 113694 113719
## [21] 113939 114037 114071 114073 114076 114078 114085 114097 114126 114134
## [31] 114187 114189 114671 114679 114849 114850 114920 114934 114977 114992
## [41] 115101 115180 115229 115460 115477 115805 C1     C2     C3     C4    
## [51] C5     C6     C7     C8     C9     C10    C11    C12    C16    C17   
## [61] C18    C19    C20
## [1] 63
E(i96)$width = .5
E(i96)$color =  "black"

plot(i96, layout=layout.kamada.kawai)

# co-event matrices
(g96e = t(g96) %*% g96)
##     C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20
## C1   2  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C2   0  2  0  0  0  0  0  0  1   1   1   0   0   0   0   0   0   0   0   1
## C3   0  0 12  1  0  0  1  0  5   2   2   0   0   0   0   0   0   1   1   0
## C4   0  0  1  3  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C5   0  0  0  0  6  1  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C6   0  0  0  0  1  1  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C7   0  0  1  0  0  0  5  1  1   0   0   0   0   0   0   2   2   3   0   0
## C8   0  0  0  0  0  0  1  1  0   0   0   0   0   0   0   1   1   1   0   0
## C9   0  1  5  0  0  0  1  0 17   1   1   0   0   0   0   2   1   2   0   1
## C10  0  1  2  0  0  0  0  0  1   6   4   0   0   0   0   0   0   1   0   0
## C11  0  1  2  0  0  0  0  0  1   4   4   0   0   0   0   0   0   1   0   0
## C12  0  0  0  0  0  0  0  0  0   0   0   1   0   0   0   0   0   0   0   0
## C13  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C14  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C15  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
## C16  0  0  0  0  0  0  2  1  2   0   0   0   0   0   0   5   3   5   0   0
## C17  0  0  0  0  0  0  2  1  1   0   0   0   0   0   0   3   6   5   0   0
## C18  0  0  1  0  0  0  3  1  2   1   1   0   0   0   0   5   5   8   0   0
## C19  0  0  1  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   1   0
## C20  0  1  0  0  0  0  0  0  1   0   0   0   0   0   0   0   0   0   0   2
i96e = graph.adjacency(g96e, mode = "undirected")
E(i96e)$weight <- count.multiple(i96e)

i96e <- simplify(i96e)
plot(i96e)

# Set vertex attributes
V(i96e)$label = V(i96e)$name
V(i96e)$label.color = "blue"
V(i96e)$label.cex = .8
V(i96e)$size = 12
V(i96e)$color ="grey"
V(i96e)$frame.color = V(i96e)$color

# Set edge attributes
egalpha = log(E(i96e)$weight)
E(i96e)$color = "black"
E(i96e)$width = egalpha

i96e_layout <- layout.fruchterman.reingold(i96e)
plot(i96e, main = "Co-event Network", layout=i96e_layout) 

write.graph(i96e, file='i96e.txt', format="edgelist")

ol96 = g96e/diag(g96e) # Group Overlap Networks: 20 x 20 matrix
diag(ol96)<-0
round(ol96, 2)
##      C1   C2   C3   C4  C5   C6   C7   C8   C9  C10  C11 C12 C13 C14 C15
## C1    0 0.00 0.00 0.00   0 0.00 0.00 0.00 0.00 0.00 0.00   0   0   0   0
## C2    0 0.00 0.00 0.00   0 0.00 0.00 0.00 0.50 0.50 0.50   0   0   0   0
## C3    0 0.00 0.00 0.08   0 0.00 0.08 0.00 0.42 0.17 0.17   0   0   0   0
## C4    0 0.00 0.33 0.00   0 0.00 0.00 0.00 0.00 0.00 0.00   0   0   0   0
## C5    0 0.00 0.00 0.00   0 0.17 0.00 0.00 0.00 0.00 0.00   0   0   0   0
## C6    0 0.00 0.00 0.00   1 0.00 0.00 0.00 0.00 0.00 0.00   0   0   0   0
## C7    0 0.00 0.20 0.00   0 0.00 0.00 0.20 0.20 0.00 0.00   0   0   0   0
## C8    0 0.00 0.00 0.00   0 0.00 1.00 0.00 0.00 0.00 0.00   0   0   0   0
## C9    0 0.06 0.29 0.00   0 0.00 0.06 0.00 0.00 0.06 0.06   0   0   0   0
## C10   0 0.17 0.33 0.00   0 0.00 0.00 0.00 0.17 0.00 0.67   0   0   0   0
## C11   0 0.25 0.50 0.00   0 0.00 0.00 0.00 0.25 1.00 0.00   0   0   0   0
## C12   0 0.00 0.00 0.00   0 0.00 0.00 0.00 0.00 0.00 0.00   0   0   0   0
## C13 NaN  NaN  NaN  NaN NaN  NaN  NaN  NaN  NaN  NaN  NaN NaN   0 NaN NaN
## C14 NaN  NaN  NaN  NaN NaN  NaN  NaN  NaN  NaN  NaN  NaN NaN NaN   0 NaN
## C15 NaN  NaN  NaN  NaN NaN  NaN  NaN  NaN  NaN  NaN  NaN NaN NaN NaN   0
## C16   0 0.00 0.00 0.00   0 0.00 0.40 0.20 0.40 0.00 0.00   0   0   0   0
## C17   0 0.00 0.00 0.00   0 0.00 0.33 0.17 0.17 0.00 0.00   0   0   0   0
## C18   0 0.00 0.12 0.00   0 0.00 0.38 0.12 0.25 0.12 0.12   0   0   0   0
## C19   0 0.00 1.00 0.00   0 0.00 0.00 0.00 0.00 0.00 0.00   0   0   0   0
## C20   0 0.50 0.00 0.00   0 0.00 0.00 0.00 0.50 0.00 0.00   0   0   0   0
##      C16  C17  C18  C19  C20
## C1  0.00 0.00 0.00 0.00 0.00
## C2  0.00 0.00 0.00 0.00 0.50
## C3  0.00 0.00 0.08 0.08 0.00
## C4  0.00 0.00 0.00 0.00 0.00
## C5  0.00 0.00 0.00 0.00 0.00
## C6  0.00 0.00 0.00 0.00 0.00
## C7  0.40 0.40 0.60 0.00 0.00
## C8  1.00 1.00 1.00 0.00 0.00
## C9  0.12 0.06 0.12 0.00 0.06
## C10 0.00 0.00 0.17 0.00 0.00
## C11 0.00 0.00 0.25 0.00 0.00
## C12 0.00 0.00 0.00 0.00 0.00
## C13  NaN  NaN  NaN  NaN  NaN
## C14  NaN  NaN  NaN  NaN  NaN
## C15  NaN  NaN  NaN  NaN  NaN
## C16 0.00 0.60 1.00 0.00 0.00
## C17 0.50 0.00 0.83 0.00 0.00
## C18 0.62 0.62 0.00 0.00 0.00
## C19 0.00 0.00 0.00 0.00 0.00
## C20 0.00 0.00 0.00 0.00 0.00
iol96 = graph.adjacency(ol96, mode = "undirected", weighted=TRUE)
plot(iol96, edge.width=E(iol96)$weight*5 ,edge.color="black",vertex.color = "grey", main = "Group Overlap  Network", layout=i96e_layout)