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.