# Calculating the mixing matrix and assortativity coefficient with igraph in R The mixing matrix of a graph gives the density of edges between vertices with different characteristics. The mixing matrix for a given igraph object can be calculated using the following function:

 # calculate the mixing matrix of in igraph graph object ‘mygraph’, by some vertex attribute ‘attrib’ # can change the default use.density=FALSE to return a matrix with raw number of edges rather than density mixmat <- function(mygraph, attrib, use.density=TRUE) { require(igraph) # get unique list of characteristics of the attribute attlist <- sort(unique(get.vertex.attribute(mygraph,attrib))) numatts <- length(attlist) # build an empty mixing matrix by attribute mm <- matrix(nrow=numatts, ncol=numatts, dimnames=list(attlist,attlist)) # calculate edge density for each matrix entry by pairing type # lends itself to parallel if available el <- get.edgelist(mygraph,names=FALSE) for (i in 1:numatts) { for (j in 1:numatts) { mm[i,j] <- length(which(apply(el,1,function(x) { get.vertex.attribute(mygraph, attrib, x ) == attlist[i] && get.vertex.attribute(mygraph, attrib, x ) == attlist[j] } ))) } } # convert to proportional mixing matrix if desired (ie by edge density) if (use.density) mm/ecount(mygraph) else mm }
view rawmixing_matrix.R hosted with ❤ by GitHub

The assortativity coefficient, based on Newman’s paper, can be calculated from the mixing matrix by the following:

 # calculate the assortativity coefficient for a mixing matrix of a graph # ref: MEJ Newman, ‘Mixing patterns in networks’, Phys Rev E 67, 026126 (2003) # # define assortativity coefficient as # trace (m) – sum (m^2) # ac = ————————- # 1 – sum (m^2) # # where m is the mixing matrix of a graph assortcoeff <- function(m) { tr <- sum(diag(m)) sumsq <- sum (rowSums(m)*colSums(m)) (tr – sumsq) / (1 – sumsq) }
view rawassortativity_coefficient.R hosted with ❤ by GitHub

Here is an example (be sure to load the functions mentioned above):

 # sample calculating mixing matrix and assortativity coefficient with igraph require(igraph) set.seed(12) # create a random graph g <- random.graph.game(1000,0.15) # assign some characteristics V(g)\$color <- c(‘red‘,‘white‘,‘blue‘,‘orange‘,‘green‘) # calculate the mixing matrix m <- mixmat(g,‘color‘) # now calculate the assortativity coefficient assortcoeff(m)
view rawsample_mm_ac.R hosted with ❤ by GitHub

Cool.