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[1] ) == attlist[i] && | |
get.vertex.attribute(mygraph, attrib, x[2] ) == attlist[j] } ))) | |
} | |
} | |
# convert to proportional mixing matrix if desired (ie by edge density) | |
if (use.density) mm/ecount(mygraph) else mm | |
} |
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) | |
} |
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) |
Cool.