From 7b0142afd112e454111cc96f7d1b36109ada9c2f Mon Sep 17 00:00:00 2001 From: Harrison Deng Date: Wed, 8 Dec 2021 01:13:01 -0500 Subject: [PATCH] Graphs and networks largely finished. --- ABC-units.Rproj | 32 +- FND-MAT-Graphs_and_networks.R | 1382 ++++++++++---------- myScripts/Graphs_and_networks.R | 71 + myScripts/genome_annotation.R | 2 + myScripts/graphs_and_networks_logs.png | Bin 0 -> 15619 bytes myScripts/graphs_and_networks_overview.png | Bin 0 -> 116522 bytes 6 files changed, 780 insertions(+), 707 deletions(-) create mode 100644 myScripts/Graphs_and_networks.R create mode 100644 myScripts/genome_annotation.R create mode 100644 myScripts/graphs_and_networks_logs.png create mode 100644 myScripts/graphs_and_networks_overview.png diff --git a/ABC-units.Rproj b/ABC-units.Rproj index 9f01719..0fbb9ec 100644 --- a/ABC-units.Rproj +++ b/ABC-units.Rproj @@ -1,16 +1,16 @@ -Version: 1.0 - -RestoreWorkspace: No -SaveWorkspace: No -AlwaysSaveHistory: No - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: knitr -LaTeX: XeLaTeX - -AutoAppendNewline: Yes -StripTrailingWhitespace: Yes +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: No + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: XeLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes diff --git a/FND-MAT-Graphs_and_networks.R b/FND-MAT-Graphs_and_networks.R index 654f909..f0520d3 100644 --- a/FND-MAT-Graphs_and_networks.R +++ b/FND-MAT-Graphs_and_networks.R @@ -1,691 +1,691 @@ -# tocID <- "FND-MAT-Graphs_and_networks.R" -# -# Purpose: A Bioinformatics Course: -# R code accompanying the FND-MAT-Graphs_and_networks unit. -# -# Version: 1.2 -# -# Date: 2017 10 - 2019 01 -# Author: Boris Steipe (boris.steipe@utoronto.ca) -# -# Versions: -# 1.2 Change from require() to requireNamespace(), -# use ::() idiom throughout -# 1.1 Update set.seed() usage -# 1.0 First final version for learning units. -# 0.1 First code copied from 2016 material. -# -# -# TODO: Add some explicit tasks and sample solutions. -# -# -# == DO NOT SIMPLY source() THIS FILE! ======================================= -# -# If there are portions you don't understand, use R's help system, Google for an -# answer, or ask your instructor. Don't continue if you don't understand what's -# going on. That's not how it works ... -# -# ============================================================================== - - -#TOC> ========================================================================== -#TOC> -#TOC> Section Title Line -#TOC> -------------------------------------------------------------- -#TOC> 1 REVIEW 50 -#TOC> 2 DEGREE DISTRIBUTIONS 206 -#TOC> 2.1 Random graph 212 -#TOC> 2.2 scale-free graph (Barabasi-Albert) 260 -#TOC> 2.3 Random geometric graph 326 -#TOC> 3 A CLOSER LOOK AT THE igraph:: PACKAGE 448 -#TOC> 3.1 Basics 451 -#TOC> 3.2 Components 523 -#TOC> 4 RANDOM GRAPHS AND GRAPH METRICS 542 -#TOC> 4.1 Diameter 579 -#TOC> 5 GRAPH CLUSTERING 648 -#TOC> -#TOC> ========================================================================== - - -# = 1 REVIEW ============================================================== - -# This tutorial covers basic concepts of graph theory and analysis in R. Make -# sure you have pulled the latest version of the project from the GitHub -# repository. - -# Let's explore some of the basic ideas of graph theory by starting with a small -# random graph. - - -# To begin let's write a little function that will create random "gene" names; -# there's no particular purpose to this other than to make our graphs look a -# little more "biological" ... -makeRandomGenenames <- function(N) { - nam <- character() - while (length(nam) < N) { - a <- paste0(c(sample(LETTERS, 1), sample(letters, 2)), - collapse="") # one uppercase, two lowercase letters - n <- sample(1:9, 1) # one number - nam[length(nam) + 1] <- paste(a, n, sep="") # store in vector - nam <- unique(nam) # delete if this was a duplicate - } - return(nam) -} - -N <- 20 - -set.seed(112358) # set RNG seed for repeatable randomness -( Nnames <- makeRandomGenenames(N) ) -set.seed(NULL) # reset the RNG - -# One way to represent graphs in a computer is as an "adjacency matrix". In this -# matrix, each row and each column represents a node, and the cell at the -# intersection of a row and column contains a value/TRUE if there is an edge, -# 0/FALSE otherwise. - -# Let's create an adjacency matrix for our random graph: let's say a pair -# of nodes has probability p <- 0.09 to have an edge, and our graph is -# symmetric , i.e. it is an undirected graph, and it has neither self-edges, -# i.e. loops, nor multiple edges between the same nodes, i.e. it -# is a "simple" graph. We use the Nnames vector as node labels. - -makeRandomAM <- function(nam, p = 0.1) { - # Make a random adjacency matrix for a set of nodes with edge probability p - # Parameters: - # nam: a character vector of unique node names. - # p: probability that a random pair of nodes will have an edge. - # - # Value: an adjacency matrix for a simple, undirected graph - # - - N <- length(nam) - AM <- matrix(numeric(N * N), ncol = N) # Adjacency matrix, pre-filled with 0 - rownames(AM) <- nam - colnames(AM) <- nam - for (iRow in 1:(N-1)) { # Note how we make sure iRow != iCol - this prevents - # loops (self-edges) - for (iCol in (iRow+1):N) { - if (runif(1) < p) { # runif() creates uniform random numbers - # between 0 and 1. The expression is TRUE with - # probability p. if it is TRUE ... - AM[iRow, iCol] <- 1 # ... record an edge for the pair (iRow, iCol) - } - } - } - return(AM) -} - -set.seed(112358) # set RNG seed for repeatable randomness -( myRandAM <- makeRandomAM(Nnames, p = 0.09) ) -set.seed(NULL) # reset the RNG - - -# Listing the matrix is not very informative - we should plot this graph. The -# standard package for work with graphs in r is "igraph::". We'll go into more -# details of the igraph:: package a bit later, for now we just use it to plot: - -if (! requireNamespace("igraph", quietly = TRUE)) { - install.packages("igraph") -} -# Package information: -# library(help = igraph) # basic information -# browseVignettes("igraph") # available vignettes -# data(package = "igraph") # available datasets - - -myG <- igraph::graph_from_adjacency_matrix(myRandAM, mode = "undirected") - -set.seed(112358) # set RNG seed for repeatable randomness - # calculate layout coordinates -myGxy <- igraph::layout_with_graphopt(myG, - charge=0.0012) -set.seed(NULL) # reset the RNG - - -# The igraph:: package adds its own function to the collection of plot() -# functions; R makes the selection which plot function to use based on the class -# of the object that we request to plot. This plot function has parameters -# layout - the x,y coordinates of the nodes; -# vertex.color - which I define to color by node-degree -# vertex size - which I define to increase with node-degree -# vertex.label - which I set to combine the names of the vertices of the -# graph - names(V(iG)) - with the node degree - degree(iG). -# See ?igraph.plotting for the complete list of parameters - - -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myG, - layout = myGxy, - rescale = FALSE, - xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), - ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), - vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], - vertex.size = 1000 + (900 * igraph::degree(myG)), - vertex.label = sprintf("%s(%i)", names(igraph::V(myG)), igraph::degree(myG)), - vertex.label.family = "sans", - vertex.label.cex = 0.7) -par(oPar) # reset plot window - - -# The simplest descriptor of a graph are the number of nodes, edges, and the -# degree-distribution. In our example, the number of nodes was given: N; the -# number of edges can easily be calculated from the adjacency matrix. In our -# matrix, we have entered 1 for every edge. Thus we simply sum over the matrix: -sum(myRandAM) - -# Is that what you expect? - -# What about the degree distribution? We can get that simply by summing over the -# rows and summing over the columns and adding the two vectors. - -rowSums(myRandAM) + colSums(myRandAM) # check this against the plot! - -# The function degree() gives the same values -igraph::degree(myG) - -# Let's plot the degree distribution in a histogram: -degG <- igraph::degree(myG) -brk <- seq(min(degG)-0.5, max(degG)+0.5, by=1) # define histogram breaks -hist(degG, breaks=brk, col="#A5CCF5", - xlim = c(-1,8), xaxt = "n", - main = "Node degrees", xlab = "Degree", ylab = "Number") # plot histogram -axis(side = 1, at = 0:7) - -# Note: I don't _have_ to define breaks, the hist() function usually does so -# quite well, automatically. But for this purpose I want the columns of the -# histogram to represent exactly one node-degree difference. - -# A degree distribution is actually a very informative descriptor of graphs, -# since it is very sensitive to the generating mechanism. For biological -# networks, that is one of the key questions we are interested in: how was the -# network formed? Asking about the mechanism, the way the interactions -# support function and shape the fitness landscape in which the cell evolves, -# connects our mathematical abstraction with biological insight. - - -# = 2 DEGREE DISTRIBUTIONS ================================================ - -# Let's simulate a few graphs that are a bit bigger to get a better sense of -# their degree distributions: -# - -# == 2.1 Random graph ====================================================== - -N <- 200 - -set.seed(31415927) # set RNG seed for repeatable randomness -my200AM <- makeRandomAM(as.character(1:N), p = 0.015) -set.seed(NULL) # reset the RNG - -myG200 <- igraph::graph_from_adjacency_matrix(my200AM, mode = "undirected") -myGxy <- igraph::layout_with_graphopt(myG200, charge=0.0001) # calculate layout - # coordinates - -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off, save graphics state -plot(myG200, - layout = myGxy, - rescale = FALSE, - xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), - ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), - vertex.color=heat.colors(max(igraph::degree(myG200)+1))[igraph::degree(myG200)+1], - vertex.size = 150 + (70 * igraph::degree(myG200)), - vertex.label = NA) -par(oPar) # restore graphics state - -# This graph has thirteen singletons and one large, connected component. Many -# biological graphs look approximately like this. - -# Calculate degree distributions -dg <- igraph::degree(myG200) -brk <- seq(min(dg)-0.5, max(dg)+0.5, by=1) -hist(dg, breaks=brk, col="#A5F5CC", - xlim = c(-1,11), xaxt = "n", - main = "Node degrees", xlab = "Degree", ylab = "Number") # plot histogram -axis(side = 1, at = 0:10) - - -# Note the pronounced peak of this distribution: this is not "scale-free". -# Here is the log-log plot of frequency vs. degree-rank ... - -( freqRank <- table(dg) ) -plot(log10(as.numeric(names(freqRank)) + 1), - log10(as.numeric(freqRank)), type = "b", - pch = 21, bg = "#A5F5CC", - xlab = "log(Rank)", ylab = "log(frequency)", - main = "200 nodes in a random network") - -# ... which shows us that this does NOT correspond to the single-slope linear -# relationship that we expect for a "scale-free" graph. - -# == 2.2 scale-free graph (Barabasi-Albert) ================================ - -# What does one of those intriguing "scale-free" distributions look like? The -# iGraph:: package has a function to make random graphs according to the -# Barabasi-Albert model of scale-free graphs. It is: sample_pa(), where pa -# stands for "preferential attachment". Preferential attachment is _one_ type of -# process that will yield scale-free distributions. - -N <- 200 - -set.seed(31415927) # set RNG seed for repeatable randomness -GBA <- igraph::sample_pa(N, power = 0.8, directed = FALSE) -set.seed(NULL) # reset the RNG - -GBAxy <- igraph::layout_with_graphopt(GBA, charge=0.0001) - -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off, save graphics state -plot(GBA, - layout = GBAxy, - rescale = FALSE, - xlim = c(min(GBAxy[,1]) * 0.99, max(GBAxy[,1]) * 1.01), - ylim = c(min(GBAxy[,2]) * 0.99, max(GBAxy[,2]) * 1.01), - vertex.color=heat.colors(max(igraph::degree(GBA)+1))[igraph::degree(GBA)+1], - vertex.size = 200 + (30 * igraph::degree(GBA)), - vertex.label = NA) -par(oPar) # restore graphics state - -# This is a very obviously different graph! Some biological networks have -# features that look like that - but in my experience the hub nodes are usually -# not that distinct. But then again, that really depends on the parameter -# "power". Play with the "power" parameter and get a sense for what difference -# this makes. Also: note that the graph has only a single component - no -# singletons. - -# What's the degree distribution of this graph? -( dg <- igraph::degree(GBA) ) -brk <- seq(min(dg)-0.5, max(dg)+0.5, by=1) -hist(dg, breaks=brk, col="#DCF5B5", - xlim = c(0,max(dg)+1), xaxt = "n", - main = "Node degrees 200 nodes PA graph", - xlab = "Degree", ylab = "Number") -axis(side = 1, at = seq(0, max(dg)+1, by=5)) - -# Most nodes have a degree of 1, but one node has a degree of 19. - -(freqRank <- table(dg)) -plot(log10(as.numeric(names(freqRank)) + 1), - log10(as.numeric(freqRank)), type = "b", - pch = 21, bg = "#DCF5B5", - xlab = "log(Rank)", ylab = "log(frequency)", - main = "200 nodes in a preferential-attachment network") - -# Sort-of linear, but many of the higher ranked nodes have a frequency of only -# one. That behaviour smooths out in larger graphs - let's try 100000 nodes: -# -N <- 10000 -X <- igraph::sample_pa(N, power = 0.8, directed = FALSE) # 100,000 nodes -freqRank <- table(igraph::degree(X)) -plot(log10(as.numeric(names(freqRank)) + 1), - log10(as.numeric(freqRank)), type = "b", - xlab = "log(Rank)", ylab = "log(frequency)", - pch = 21, bg = "#A5F5CC", - main = "100,000 nodes in a random, scale-free network") -rm(X) - - -# == 2.3 Random geometric graph ============================================ - -# Finally, let's simulate a random geometric graph and look at the degree -# distribution. Remember: these graphs have a high probability to have edges -# between nodes that are "close" together - an entirely biological notion. - -# We'll randomly place our nodes in a box. Then we'll define the -# probability for two nodes to have an edge to be a function of their Euclidian -# distance in the box. - -# Here is a function that makes an adjacency matrix for such graphs. iGraph:: -# has a similar function, sample_grg(), which connects nodes that are closer -# than a cutoff, the function I give you below is a bit more interesting since -# it creates edges according to a probability that is determined by a -# generalized logistic function of the distance. This sigmoidal function gives -# a smooth cutoff and creates more "natural" graphs. Otherwise, the function is -# very similar to the random graph function, except that we output the -# "coordinates" of the nodes together with the adjacency matrix which we then -# use for the layout. list() FTW. - - -makeRandomGeometricAM <- function(nam, B = 25, Q = 0.001, t = 0.6) { - # Make an adjacency matrix for an undirected random geometric graph from - # edges connected with probabilities according to a generalized logistic - # function. - # Parameters: - # nam: a character vector of unique names - # B, Q, t: probability that a random pair (i, j) of nodes gets an - # edge determined by a generalized logistic function - # p <- 1 - 1/((1 + (Q * (exp(-B * (x-t)))))^(1 / 0.9))) - # - # Value: a list with the following components: - # AM$mat : an adjacency matrix - # AM$nam : labels for the nodes - # AM$x : x-coordinates for the nodes - # AM$y : y-coordinates for the nodes - # - nu <- 1 # probably not useful to change - AM <- list() - AM$nam <- nam - N <- length(AM$nam) - AM$mat <- matrix(numeric(N * N), ncol = N) # The adjacency matrix - rownames(AM$mat) <- AM$nam - colnames(AM$mat) <- AM$nam - AM$x <- runif(N) # Randomly place nodes into the unit square - AM$y <- runif(N) - for (iRow in 1:(N-1)) { # Same principles as in makeRandomGraph() - for (iCol in (iRow+1):N) { - # geometric distance ... - d <- sqrt((AM$x[iRow] - AM$x[iCol])^2 + - (AM$y[iRow] - AM$y[iCol])^2) # Pythagoras - # distance dependent probability - p <- 1 - 1/((1 + (Q * (exp(-B * (d-t)))))^(1 / nu)) - if (runif(1) < p) { - AM$mat[iRow, iCol] <- 1 - } - } - } - return(AM) -} - -# Getting the parameters of a generalized logistic right takes a bit of -# experimenting. If you are interested, you can try a few variations. Or you can -# look up the function at -# https://en.wikipedia.org/wiki/Generalised_logistic_function - -# This function computes generalized logistics ... -# genLog <- function(x, B = 25, Q = 0.001, t = 0.5) { -# # generalized logistic (sigmoid) -# nu <- 1 -# return(1 - 1/((1 + (Q * (exp(-B * (x-t)))))^(1 / nu))) -# } -# -# ... and this code plots p-values over the distances we could encouter between -# our nodes: from 0 to sqrt(2) i.e. the diagonal of the unit square in which we -# will place our nodes. -# x <- seq(0, sqrt(2), length.out = 50) -# plot(x, genLog(x), type="l", col="#AA0000", ylim = c(0, 1), -# xlab = "d", ylab = "p(edge)") - -# 200 node random geomteric graph -N <- 200 -set.seed(112358) # set RNG seed for repeatable randomness -rGAM <- makeRandomGeometricAM(as.character(1:N), t = 0.4) -set.seed(NULL) # reset the RNG - - -myGRG <- igraph::graph_from_adjacency_matrix(rGAM$mat, mode = "undirected") - -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myGRG, - layout = cbind(rGAM$x, rGAM$y), # use our node coordinates for layout, - rescale = FALSE, - xlim = c(min(rGAM$x) * 0.9, max(rGAM$x) * 1.1), - ylim = c(min(rGAM$y) * 0.9, max(rGAM$y) * 1.1), - vertex.color=heat.colors(max(igraph::degree(myGRG)+1))[igraph::degree(myGRG)+1], - vertex.size = 0.1 + (0.2 * igraph::degree(myGRG)), - vertex.label = NA) -par(oPar) - -# degree distribution: -(dg <- igraph::degree(myGRG)) -brk <- seq(min(dg) - 0.5, max(dg) + 0.5, by = 1) -hist(dg, breaks = brk, col = "#FCC6D2", - xlim = c(0, 25), xaxt = "n", - main = "Node degrees: 200 nodes RG graph", - xlab = "Degree", ylab = "Number") -axis(side = 1, at = c(0, min(dg):max(dg))) - -# You'll find that this is kind of in-between the random, and the scale-free -# graph. We do have hubs, but they are not as extreme as in the scale-free case; -# and we have have no singletons, in contrast to the random graph. - -(freqRank <- table(dg)) -plot(log10(as.numeric(names(freqRank)) + 1), - log10(as.numeric(freqRank)), type = "b", - pch = 21, bg = "#FCC6D2", - xlab = "log(Rank)", ylab = "log(frequency)", - main = "200 nodes in a random geometric network") - - - -# = 3 A CLOSER LOOK AT THE igraph:: PACKAGE =============================== - - -# == 3.1 Basics ============================================================ - -# The basic object of the igraph:: package is a graph object. Let's explore the -# first graph some more, the one we built with our random gene names: -summary(myG) - -# This output means: this is an IGRAPH graph, with U = UN-directed edges -# and N = named nodes, that has 20 nodes and 20 edges. For details, see -?igraph::print.igraph - -mode(myG) -class(myG) - -# This means an igraph:: graph object is a special list object; it is opaque in -# the sense that a user is never expected to modify its components directly, but -# through a variety of helper functions which the package provides. There are -# many ways to construct graphs - from adjacency matrices, as we have just done, -# from edge lists, or by producing random graphs according to a variety of -# recipes, called _games_ in this package. - -# Two basic functions retrieve nodes "Vertices", and "Edges": -igraph::V(myG) -igraph::E(myG) - -# additional properties can be retrieved from the Vertices ... -igraph::V(myG)$name - - -# As with many R objects, loading the package provides special functions that -# can be accessed via the same name as the basic R functions, for example: - -print(myG) -plot(myG) # this is the result of default plot parameters - -# ... where plot() allows the usual flexibility of fine-tuning the plot. We -# first layout the node coordinates with the Fruchtermann-Reingold algorithm - a -# force-directed layout that applies an ettractive potential along edges (which -# pulls nodes together) and a repulsive potential to nodes (so they don't -# overlap). Note the use of the degree() function to color and scale nodes and -# labels by degree and the use of the V() function to retrieve the vertex names. -# See ?plot.igraph for details." - -# Plot with some customizing parameters -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myG, - layout = igraph::layout_with_fr(myG), - vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], - vertex.size = 12 + (5 * igraph::degree(myG)), - vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), - edge.width = 2, - vertex.label = igraph::V(myG)$name, - vertex.label.family = "sans", - vertex.label.cex = 0.9) -par(oPar) - -# ... or with a different layout: -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myG, - layout = igraph::layout_in_circle(myG), - vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], - vertex.size = 12 + (5 * igraph::degree(myG)), - vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), - edge.width = 2, - vertex.label = igraph::V(myG)$name, - vertex.label.family = "sans", - vertex.label.cex = 0.9) -par(oPar) - -# igraph:: has a large number of graph-layout functions: see -# ?layout_ and try them all. - - -# == 3.2 Components ======================================================== - -# The function igrap::components() tells us whether there are components of the -# graph in which there is no path to other components. -igraph::components(myG) - -# In the _membership_ vector, nodes are annotated with the index of the -# component they are part of. Sui7 is the only node of component 2, Cyj1 is in -# the third component etc. This is perhaps more clear if we sort by component -# index -sort(igraph::components(myG)$membership, decreasing = TRUE) - -# Retrieving e.g. the members of the first component from the list can be done by subsetting: - -(sel <- igraph::components(myG)$membership == 1) # boolean vector .. -(c1 <- igraph::components(myG)$membership[sel]) -names(c1) - - -# = 4 RANDOM GRAPHS AND GRAPH METRICS ===================================== - - -# Let's explore some of the more interesting, topological graph measures. We -# start by building a somewhat bigger graph. We aren't quite sure whether -# biological graphs are small-world, or random-geometric, or -# preferential-attachment ... but igraph:: has ways to simulate the basic ones -# (and we could easily simulate our own). Look at the following help pages: - -?igraph::sample_gnm # see also sample_gnp for the Erdös-Rényi models -?igraph::sample_smallworld # for the Watts & Strogatz model -?igraph::sample_pa # for the Barabasi-Albert model - -# But note that there are many more sample_ functions. Check out the docs! - -# Let's look at betweenness measures for our first graph. Here: the nodes again -# colored by degree. Degree centrality states: nodes of higher degree are -# considered to be more central. And that's also the way the force-directed -# layout drawas them, obviously. - -set.seed(112358) # set RNG seed for repeatable randomness -myGxy <- igraph::layout_with_fr(myG) # calculate layout coordinates -set.seed(NULL) # reset the RNG - -oPar <- par(mar = rep(0, 4)) # turn margins off, save graphics state -plot(myG, - layout = myGxy, - rescale = FALSE, - xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), - ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), - vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], - vertex.size = 40 + (15 * igraph::degree(myG)), - vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), - vertex.label = igraph::V(myG)$name, - vertex.label.family = "sans") -par(oPar) # restore graphics state - -# == 4.1 Diameter ========================================================== - -igraph::diameter(myG) # The diameter of a graph is its maximum length - # shortest path. - -# let's plot this path: here are the nodes ... -igraph::get_diameter(myG) - -# ... and we can get the x, y coordinates from iGxy by subsetting with the node -# names. The we draw the diameter-path with a transparent, thick pink line: -lines(myGxy[igraph::get_diameter(myG),], lwd=10, col="#ff63a788") - -# == Centralization scores - -?igraph::centralize -# replot our graph, and color by log_betweenness: - -bC <- igraph::centr_betw(myG) # calculate betweenness centrality -nodeBetw <- bC$res -nodeBetw <- round(log(nodeBetw +1)) + 1 - -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myG, - layout = myGxy, - rescale = FALSE, - xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), - ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), - vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], - vertex.size = 40 + (15 * igraph::degree(myG)), - vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), - vertex.label = igraph::V(myG)$name, - vertex.label.family = "sans") -par(oPar) - -# Note that the betweenness - the number of shortest paths that pass through a -# node, is in general higher for high-degree nodes - but not always: Eqr2 has -# higher betweenness than Itv7: this measure really depends on the detailed -# local topology of the graph." - -# Can you use centr_eigen() and centr_degree() to calculate the respective -# values? That's something I would expect you to be able to do. -# -# Lets plot betweenness centrality for our random geometric graph: - -bCmyGRG <- igraph::centr_betw(myGRG) # calculate betweenness centrality - -nodeBetw <- bCmyGRG$res -nodeBetw <- round((log(nodeBetw +1))^2.5) + 1 - -# colours and size proportional to betweenness -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myGRG, - layout = cbind(rGAM$x, rGAM$y), # use our node coordinates for layout, - rescale = FALSE, - xlim = c(min(rGAM$x) * 0.9, max(rGAM$x) * 1.1), - ylim = c(min(rGAM$y) * 0.9, max(rGAM$y) * 1.1), - vertex.color=heat.colors(max(nodeBetw))[nodeBetw], - vertex.size = 0.1 + (0.03 * nodeBetw), - vertex.label = NA) -par(oPar) - -igraph::diameter(myGRG) -lines(rGAM$x[igraph::get_diameter(myGRG)], - rGAM$y[igraph::get_diameter(myGRG)], - lwd = 10, - col = "#ff335533") - - - -# = 5 GRAPH CLUSTERING ==================================================== - - -# Clustering finds "communities" in graphs - and depending what the edges -# represent, these could be complexes, pathways, biological systems or similar. -# There are many graph-clustering algorithms. One approach with many attractive -# properties is the Map Equation, developed by Martin Rosvall. See: -# http://www.ncbi.nlm.nih.gov/pubmed/18216267 and htttp://www.mapequation.org - - -myGRGclusters <- igraph::cluster_infomap(myGRG) -igraph::modularity(myGRGclusters) # ... measures how separated the different - # membership types are from each other -igraph::membership(myGRGclusters) # which nodes are in what cluster? -table(igraph::membership(myGRGclusters)) # how large are the clusters? - -# The largest cluster has 48 members, the second largest has 25, etc. - - -# Lets plot our graph again, coloring the nodes of the first five communities by -# their cluster membership: - -# first, make a vector with as many grey colors as we have communities ... -commColors <- rep("#f1eef6", max(igraph::membership(myGRGclusters))) -# ... then overwrite the first five with "real colors" - something like rust, -# lilac, pink, and mauve or so. -commColors[1:5] <- c("#980043", "#dd1c77", "#df65b0", "#c994c7", "#d4b9da") - - -oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off -plot(myGRG, - layout = cbind(rGAM$x, rGAM$y), - rescale = FALSE, - xlim = c(min(rGAM$x) * 0.9, max(rGAM$x) * 1.1), - ylim = c(min(rGAM$y) * 0.9, max(rGAM$y) * 1.1), - vertex.color=commColors[igraph::membership(myGRGclusters)], - vertex.size = 0.3 + (0.4 * igraph::degree(myGRG)), - vertex.label = NA) -par(oPar) - -# That's all. - - -# [END] +# tocID <- "FND-MAT-Graphs_and_networks.R" +# +# Purpose: A Bioinformatics Course: +# R code accompanying the FND-MAT-Graphs_and_networks unit. +# +# Version: 1.2 +# +# Date: 2017 10 - 2019 01 +# Author: Boris Steipe (boris.steipe@utoronto.ca) +# +# Versions: +# 1.2 Change from require() to requireNamespace(), +# use ::() idiom throughout +# 1.1 Update set.seed() usage +# 1.0 First final version for learning units. +# 0.1 First code copied from 2016 material. +# +# +# TODO: Add some explicit tasks and sample solutions. +# +# +# == DO NOT SIMPLY source() THIS FILE! ======================================= +# +# If there are portions you don't understand, use R's help system, Google for an +# answer, or ask your instructor. Don't continue if you don't understand what's +# going on. That's not how it works ... +# +# ============================================================================== + + +#TOC> ========================================================================== +#TOC> +#TOC> Section Title Line +#TOC> -------------------------------------------------------------- +#TOC> 1 REVIEW 50 +#TOC> 2 DEGREE DISTRIBUTIONS 206 +#TOC> 2.1 Random graph 212 +#TOC> 2.2 scale-free graph (Barabasi-Albert) 260 +#TOC> 2.3 Random geometric graph 326 +#TOC> 3 A CLOSER LOOK AT THE igraph:: PACKAGE 448 +#TOC> 3.1 Basics 451 +#TOC> 3.2 Components 523 +#TOC> 4 RANDOM GRAPHS AND GRAPH METRICS 542 +#TOC> 4.1 Diameter 579 +#TOC> 5 GRAPH CLUSTERING 648 +#TOC> +#TOC> ========================================================================== + + +# = 1 REVIEW ============================================================== + +# This tutorial covers basic concepts of graph theory and analysis in R. Make +# sure you have pulled the latest version of the project from the GitHub +# repository. + +# Let's explore some of the basic ideas of graph theory by starting with a small +# random graph. + + +# To begin let's write a little function that will create random "gene" names; +# there's no particular purpose to this other than to make our graphs look a +# little more "biological" ... +makeRandomGenenames <- function(N) { + nam <- character() + while (length(nam) < N) { + a <- paste0(c(sample(LETTERS, 1), sample(letters, 2)), + collapse="") # one uppercase, two lowercase letters + n <- sample(1:9, 1) # one number + nam[length(nam) + 1] <- paste(a, n, sep="") # store in vector + nam <- unique(nam) # delete if this was a duplicate + } + return(nam) +} + +N <- 20 + +set.seed(112358) # set RNG seed for repeatable randomness +( Nnames <- makeRandomGenenames(N) ) +set.seed(NULL) # reset the RNG + +# One way to represent graphs in a computer is as an "adjacency matrix". In this +# matrix, each row and each column represents a node, and the cell at the +# intersection of a row and column contains a value/TRUE if there is an edge, +# 0/FALSE otherwise. + +# Let's create an adjacency matrix for our random graph: let's say a pair +# of nodes has probability p <- 0.09 to have an edge, and our graph is +# symmetric , i.e. it is an undirected graph, and it has neither self-edges, +# i.e. loops, nor multiple edges between the same nodes, i.e. it +# is a "simple" graph. We use the Nnames vector as node labels. + +makeRandomAM <- function(nam, p = 0.1) { + # Make a random adjacency matrix for a set of nodes with edge probability p + # Parameters: + # nam: a character vector of unique node names. + # p: probability that a random pair of nodes will have an edge. + # + # Value: an adjacency matrix for a simple, undirected graph + # + + N <- length(nam) + AM <- matrix(numeric(N * N), ncol = N) # Adjacency matrix, pre-filled with 0 + rownames(AM) <- nam + colnames(AM) <- nam + for (iRow in 1:(N-1)) { # Note how we make sure iRow != iCol - this prevents + # loops (self-edges) + for (iCol in (iRow+1):N) { + if (runif(1) < p) { # runif() creates uniform random numbers + # between 0 and 1. The expression is TRUE with + # probability p. if it is TRUE ... + AM[iRow, iCol] <- 1 # ... record an edge for the pair (iRow, iCol) + } + } + } + return(AM) +} + +set.seed(112358) # set RNG seed for repeatable randomness +( myRandAM <- makeRandomAM(Nnames, p = 0.09) ) +set.seed(NULL) # reset the RNG + + +# Listing the matrix is not very informative - we should plot this graph. The +# standard package for work with graphs in r is "igraph::". We'll go into more +# details of the igraph:: package a bit later, for now we just use it to plot: + +if (! requireNamespace("igraph", quietly = TRUE)) { + install.packages("igraph") +} +# Package information: +# library(help = igraph) # basic information +# browseVignettes("igraph") # available vignettes +# data(package = "igraph") # available datasets + + +myG <- igraph::graph_from_adjacency_matrix(myRandAM, mode = "undirected") + +set.seed(112358) # set RNG seed for repeatable randomness + # calculate layout coordinates +myGxy <- igraph::layout_with_graphopt(myG, + charge=0.0012) +set.seed(NULL) # reset the RNG + + +# The igraph:: package adds its own function to the collection of plot() +# functions; R makes the selection which plot function to use based on the class +# of the object that we request to plot. This plot function has parameters +# layout - the x,y coordinates of the nodes; +# vertex.color - which I define to color by node-degree +# vertex size - which I define to increase with node-degree +# vertex.label - which I set to combine the names of the vertices of the +# graph - names(V(iG)) - with the node degree - degree(iG). +# See ?igraph.plotting for the complete list of parameters + + +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myG, + layout = myGxy, + rescale = FALSE, + xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), + ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), + vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], + vertex.size = 1000 + (900 * igraph::degree(myG)), + vertex.label = sprintf("%s(%i)", names(igraph::V(myG)), igraph::degree(myG)), + vertex.label.family = "sans", + vertex.label.cex = 0.7) +par(oPar) # reset plot window + + +# The simplest descriptor of a graph are the number of nodes, edges, and the +# degree-distribution. In our example, the number of nodes was given: N; the +# number of edges can easily be calculated from the adjacency matrix. In our +# matrix, we have entered 1 for every edge. Thus we simply sum over the matrix: +sum(myRandAM) + +# Is that what you expect? + +# What about the degree distribution? We can get that simply by summing over the +# rows and summing over the columns and adding the two vectors. + +rowSums(myRandAM) + colSums(myRandAM) # check this against the plot! + +# The function degree() gives the same values +igraph::degree(myG) + +# Let's plot the degree distribution in a histogram: +degG <- igraph::degree(myG) +brk <- seq(min(degG)-0.5, max(degG)+0.5, by=1) # define histogram breaks +hist(degG, breaks=brk, col="#A5CCF5", + xlim = c(-1,8), xaxt = "n", + main = "Node degrees", xlab = "Degree", ylab = "Number") # plot histogram +axis(side = 1, at = 0:7) + +# Note: I don't _have_ to define breaks, the hist() function usually does so +# quite well, automatically. But for this purpose I want the columns of the +# histogram to represent exactly one node-degree difference. + +# A degree distribution is actually a very informative descriptor of graphs, +# since it is very sensitive to the generating mechanism. For biological +# networks, that is one of the key questions we are interested in: how was the +# network formed? Asking about the mechanism, the way the interactions +# support function and shape the fitness landscape in which the cell evolves, +# connects our mathematical abstraction with biological insight. + + +# = 2 DEGREE DISTRIBUTIONS ================================================ + +# Let's simulate a few graphs that are a bit bigger to get a better sense of +# their degree distributions: +# + +# == 2.1 Random graph ====================================================== + +N <- 200 + +set.seed(31415927) # set RNG seed for repeatable randomness +my200AM <- makeRandomAM(as.character(1:N), p = 0.015) +set.seed(NULL) # reset the RNG + +myG200 <- igraph::graph_from_adjacency_matrix(my200AM, mode = "undirected") +myGxy <- igraph::layout_with_graphopt(myG200, charge=0.0001) # calculate layout + # coordinates + +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off, save graphics state +plot(myG200, + layout = myGxy, + rescale = FALSE, + xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), + ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), + vertex.color=heat.colors(max(igraph::degree(myG200)+1))[igraph::degree(myG200)+1], + vertex.size = 150 + (70 * igraph::degree(myG200)), + vertex.label = NA) +par(oPar) # restore graphics state + +# This graph has thirteen singletons and one large, connected component. Many +# biological graphs look approximately like this. + +# Calculate degree distributions +dg <- igraph::degree(myG200) +brk <- seq(min(dg)-0.5, max(dg)+0.5, by=1) +hist(dg, breaks=brk, col="#A5F5CC", + xlim = c(-1,11), xaxt = "n", + main = "Node degrees", xlab = "Degree", ylab = "Number") # plot histogram +axis(side = 1, at = 0:10) + + +# Note the pronounced peak of this distribution: this is not "scale-free". +# Here is the log-log plot of frequency vs. degree-rank ... + +( freqRank <- table(dg) ) +plot(log10(as.numeric(names(freqRank)) + 1), + log10(as.numeric(freqRank)), type = "b", + pch = 21, bg = "#A5F5CC", + xlab = "log(Rank)", ylab = "log(frequency)", + main = "200 nodes in a random network") + +# ... which shows us that this does NOT correspond to the single-slope linear +# relationship that we expect for a "scale-free" graph. + +# == 2.2 scale-free graph (Barabasi-Albert) ================================ + +# What does one of those intriguing "scale-free" distributions look like? The +# iGraph:: package has a function to make random graphs according to the +# Barabasi-Albert model of scale-free graphs. It is: sample_pa(), where pa +# stands for "preferential attachment". Preferential attachment is _one_ type of +# process that will yield scale-free distributions. + +N <- 200 + +set.seed(31415927) # set RNG seed for repeatable randomness +GBA <- igraph::sample_pa(N, power = 0.8, directed = FALSE) +set.seed(NULL) # reset the RNG + +GBAxy <- igraph::layout_with_graphopt(GBA, charge=0.0001) + +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off, save graphics state +plot(GBA, + layout = GBAxy, + rescale = FALSE, + xlim = c(min(GBAxy[,1]) * 0.99, max(GBAxy[,1]) * 1.01), + ylim = c(min(GBAxy[,2]) * 0.99, max(GBAxy[,2]) * 1.01), + vertex.color=heat.colors(max(igraph::degree(GBA)+1))[igraph::degree(GBA)+1], + vertex.size = 200 + (30 * igraph::degree(GBA)), + vertex.label = NA) +par(oPar) # restore graphics state + +# This is a very obviously different graph! Some biological networks have +# features that look like that - but in my experience the hub nodes are usually +# not that distinct. But then again, that really depends on the parameter +# "power". Play with the "power" parameter and get a sense for what difference +# this makes. Also: note that the graph has only a single component - no +# singletons. + +# What's the degree distribution of this graph? +( dg <- igraph::degree(GBA) ) +brk <- seq(min(dg)-0.5, max(dg)+0.5, by=1) +hist(dg, breaks=brk, col="#DCF5B5", + xlim = c(0,max(dg)+1), xaxt = "n", + main = "Node degrees 200 nodes PA graph", + xlab = "Degree", ylab = "Number") +axis(side = 1, at = seq(0, max(dg)+1, by=5)) + +# Most nodes have a degree of 1, but one node has a degree of 19. + +(freqRank <- table(dg)) +plot(log10(as.numeric(names(freqRank)) + 1), + log10(as.numeric(freqRank)), type = "b", + pch = 21, bg = "#DCF5B5", + xlab = "log(Rank)", ylab = "log(frequency)", + main = "200 nodes in a preferential-attachment network") + +# Sort-of linear, but many of the higher ranked nodes have a frequency of only +# one. That behaviour smooths out in larger graphs - let's try 100000 nodes: +# +N <- 10000 +X <- igraph::sample_pa(N, power = 0.8, directed = FALSE) # 100,000 nodes +freqRank <- table(igraph::degree(X)) +plot(log10(as.numeric(names(freqRank)) + 1), + log10(as.numeric(freqRank)), type = "b", + xlab = "log(Rank)", ylab = "log(frequency)", + pch = 21, bg = "#A5F5CC", + main = "100,000 nodes in a random, scale-free network") +rm(X) + + +# == 2.3 Random geometric graph ============================================ + +# Finally, let's simulate a random geometric graph and look at the degree +# distribution. Remember: these graphs have a high probability to have edges +# between nodes that are "close" together - an entirely biological notion. + +# We'll randomly place our nodes in a box. Then we'll define the +# probability for two nodes to have an edge to be a function of their Euclidian +# distance in the box. + +# Here is a function that makes an adjacency matrix for such graphs. iGraph:: +# has a similar function, sample_grg(), which connects nodes that are closer +# than a cutoff, the function I give you below is a bit more interesting since +# it creates edges according to a probability that is determined by a +# generalized logistic function of the distance. This sigmoidal function gives +# a smooth cutoff and creates more "natural" graphs. Otherwise, the function is +# very similar to the random graph function, except that we output the +# "coordinates" of the nodes together with the adjacency matrix which we then +# use for the layout. list() FTW. + + +makeRandomGeometricAM <- function(nam, B = 25, Q = 0.001, t = 0.6) { + # Make an adjacency matrix for an undirected random geometric graph from + # edges connected with probabilities according to a generalized logistic + # function. + # Parameters: + # nam: a character vector of unique names + # B, Q, t: probability that a random pair (i, j) of nodes gets an + # edge determined by a generalized logistic function + # p <- 1 - 1/((1 + (Q * (exp(-B * (x-t)))))^(1 / 0.9))) + # + # Value: a list with the following components: + # AM$mat : an adjacency matrix + # AM$nam : labels for the nodes + # AM$x : x-coordinates for the nodes + # AM$y : y-coordinates for the nodes + # + nu <- 1 # probably not useful to change + AM <- list() + AM$nam <- nam + N <- length(AM$nam) + AM$mat <- matrix(numeric(N * N), ncol = N) # The adjacency matrix + rownames(AM$mat) <- AM$nam + colnames(AM$mat) <- AM$nam + AM$x <- runif(N) # Randomly place nodes into the unit square + AM$y <- runif(N) + for (iRow in 1:(N-1)) { # Same principles as in makeRandomGraph() + for (iCol in (iRow+1):N) { + # geometric distance ... + d <- sqrt((AM$x[iRow] - AM$x[iCol])^2 + + (AM$y[iRow] - AM$y[iCol])^2) # Pythagoras + # distance dependent probability + p <- 1 - 1/((1 + (Q * (exp(-B * (d-t)))))^(1 / nu)) + if (runif(1) < p) { + AM$mat[iRow, iCol] <- 1 + } + } + } + return(AM) +} + +# Getting the parameters of a generalized logistic right takes a bit of +# experimenting. If you are interested, you can try a few variations. Or you can +# look up the function at +# https://en.wikipedia.org/wiki/Generalised_logistic_function + +# This function computes generalized logistics ... +# genLog <- function(x, B = 25, Q = 0.001, t = 0.5) { +# # generalized logistic (sigmoid) +# nu <- 1 +# return(1 - 1/((1 + (Q * (exp(-B * (x-t)))))^(1 / nu))) +# } +# +# ... and this code plots p-values over the distances we could encouter between +# our nodes: from 0 to sqrt(2) i.e. the diagonal of the unit square in which we +# will place our nodes. +# x <- seq(0, sqrt(2), length.out = 50) +# plot(x, genLog(x), type="l", col="#AA0000", ylim = c(0, 1), +# xlab = "d", ylab = "p(edge)") + +# 200 node random geomteric graph +N <- 200 +set.seed(112358) # set RNG seed for repeatable randomness +rGAM <- makeRandomGeometricAM(as.character(1:N), t = 0.4) +set.seed(NULL) # reset the RNG + + +myGRG <- igraph::graph_from_adjacency_matrix(rGAM$mat, mode = "undirected") + +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myGRG, + layout = cbind(rGAM$x, rGAM$y), # use our node coordinates for layout, + rescale = FALSE, + xlim = c(min(rGAM$x) * 0.9, max(rGAM$x) * 1.1), + ylim = c(min(rGAM$y) * 0.9, max(rGAM$y) * 1.1), + vertex.color=heat.colors(max(igraph::degree(myGRG)+1))[igraph::degree(myGRG)+1], + vertex.size = 0.1 + (0.2 * igraph::degree(myGRG)), + vertex.label = NA) +par(oPar) + +# degree distribution: +(dg <- igraph::degree(myGRG)) +brk <- seq(min(dg) - 0.5, max(dg) + 0.5, by = 1) +hist(dg, breaks = brk, col = "#FCC6D2", + xlim = c(0, 25), xaxt = "n", + main = "Node degrees: 200 nodes RG graph", + xlab = "Degree", ylab = "Number") +axis(side = 1, at = c(0, min(dg):max(dg))) + +# You'll find that this is kind of in-between the random, and the scale-free +# graph. We do have hubs, but they are not as extreme as in the scale-free case; +# and we have have no singletons, in contrast to the random graph. + +(freqRank <- table(dg)) +plot(log10(as.numeric(names(freqRank)) + 1), + log10(as.numeric(freqRank)), type = "b", + pch = 21, bg = "#FCC6D2", + xlab = "log(Rank)", ylab = "log(frequency)", + main = "200 nodes in a random geometric network") + + + +# = 3 A CLOSER LOOK AT THE igraph:: PACKAGE =============================== + + +# == 3.1 Basics ============================================================ + +# The basic object of the igraph:: package is a graph object. Let's explore the +# first graph some more, the one we built with our random gene names: +summary(myG) + +# This output means: this is an IGRAPH graph, with U = UN-directed edges +# and N = named nodes, that has 20 nodes and 20 edges. For details, see +?igraph::print.igraph + +mode(myG) +class(myG) + +# This means an igraph:: graph object is a special list object; it is opaque in +# the sense that a user is never expected to modify its components directly, but +# through a variety of helper functions which the package provides. There are +# many ways to construct graphs - from adjacency matrices, as we have just done, +# from edge lists, or by producing random graphs according to a variety of +# recipes, called _games_ in this package. + +# Two basic functions retrieve nodes "Vertices", and "Edges": +igraph::V(myG) +igraph::E(myG) + +# additional properties can be retrieved from the Vertices ... +igraph::V(myG)$name + + +# As with many R objects, loading the package provides special functions that +# can be accessed via the same name as the basic R functions, for example: + +print(myG) +plot(myG) # this is the result of default plot parameters + +# ... where plot() allows the usual flexibility of fine-tuning the plot. We +# first layout the node coordinates with the Fruchtermann-Reingold algorithm - a +# force-directed layout that applies an ettractive potential along edges (which +# pulls nodes together) and a repulsive potential to nodes (so they don't +# overlap). Note the use of the degree() function to color and scale nodes and +# labels by degree and the use of the V() function to retrieve the vertex names. +# See ?plot.igraph for details." + +# Plot with some customizing parameters +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myG, + layout = igraph::layout_with_fr(myG), + vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], + vertex.size = 12 + (5 * igraph::degree(myG)), + vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), + edge.width = 2, + vertex.label = igraph::V(myG)$name, + vertex.label.family = "sans", + vertex.label.cex = 0.9) +par(oPar) + +# ... or with a different layout: +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myG, + layout = igraph::layout_in_circle(myG), + vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], + vertex.size = 12 + (5 * igraph::degree(myG)), + vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), + edge.width = 2, + vertex.label = igraph::V(myG)$name, + vertex.label.family = "sans", + vertex.label.cex = 0.9) +par(oPar) + +# igraph:: has a large number of graph-layout functions: see +# ?layout_ and try them all. + + +# == 3.2 Components ======================================================== + +# The function igrap::components() tells us whether there are components of the +# graph in which there is no path to other components. +igraph::components(myG) + +# In the _membership_ vector, nodes are annotated with the index of the +# component they are part of. Sui7 is the only node of component 2, Cyj1 is in +# the third component etc. This is perhaps more clear if we sort by component +# index +sort(igraph::components(myG)$membership, decreasing = TRUE) + +# Retrieving e.g. the members of the first component from the list can be done by subsetting: + +(sel <- igraph::components(myG)$membership == 1) # boolean vector .. +(c1 <- igraph::components(myG)$membership[sel]) +names(c1) + + +# = 4 RANDOM GRAPHS AND GRAPH METRICS ===================================== + + +# Let's explore some of the more interesting, topological graph measures. We +# start by building a somewhat bigger graph. We aren't quite sure whether +# biological graphs are small-world, or random-geometric, or +# preferential-attachment ... but igraph:: has ways to simulate the basic ones +# (and we could easily simulate our own). Look at the following help pages: + +?igraph::sample_gnm # see also sample_gnp for the Erdös-Rényi models +?igraph::sample_smallworld # for the Watts & Strogatz model +?igraph::sample_pa # for the Barabasi-Albert model + +# But note that there are many more sample_ functions. Check out the docs! + +# Let's look at betweenness measures for our first graph. Here: the nodes again +# colored by degree. Degree centrality states: nodes of higher degree are +# considered to be more central. And that's also the way the force-directed +# layout drawas them, obviously. + +set.seed(112358) # set RNG seed for repeatable randomness +myGxy <- igraph::layout_with_fr(myG) # calculate layout coordinates +set.seed(NULL) # reset the RNG + +oPar <- par(mar = rep(0, 4)) # turn margins off, save graphics state +plot(myG, + layout = myGxy, + rescale = FALSE, + xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), + ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), + vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], + vertex.size = 40 + (15 * igraph::degree(myG)), + vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), + vertex.label = igraph::V(myG)$name, + vertex.label.family = "sans") +par(oPar) # restore graphics state + +# == 4.1 Diameter ========================================================== + +igraph::diameter(myG) # The diameter of a graph is its maximum length + # shortest path. + +# let's plot this path: here are the nodes ... +igraph::get_diameter(myG) + +# ... and we can get the x, y coordinates from iGxy by subsetting with the node +# names. The we draw the diameter-path with a transparent, thick pink line: +lines(myGxy[igraph::get_diameter(myG),], lwd=10, col="#ff63a788") + +# == Centralization scores + +?igraph::centralize +# replot our graph, and color by log_betweenness: + +bC <- igraph::centr_betw(myG) # calculate betweenness centrality +nodeBetw <- bC$res +nodeBetw <- round(log(nodeBetw +1)) + 1 + +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myG, + layout = myGxy, + rescale = FALSE, + xlim = c(min(myGxy[,1]) * 0.99, max(myGxy[,1]) * 1.01), + ylim = c(min(myGxy[,2]) * 0.99, max(myGxy[,2]) * 1.01), + vertex.color=heat.colors(max(igraph::degree(myG)+1))[igraph::degree(myG)+1], + vertex.size = 40 + (15 * igraph::degree(myG)), + vertex.label.cex = 0.4 + (0.15 * igraph::degree(myG)), + vertex.label = igraph::V(myG)$name, + vertex.label.family = "sans") +par(oPar) + +# Note that the betweenness - the number of shortest paths that pass through a +# node, is in general higher for high-degree nodes - but not always: Eqr2 has +# higher betweenness than Itv7: this measure really depends on the detailed +# local topology of the graph." + +# Can you use centr_eigen() and centr_degree() to calculate the respective +# values? That's something I would expect you to be able to do. +# +# Lets plot betweenness centrality for our random geometric graph: + +bCmyGRG <- igraph::centr_betw(myGRG) # calculate betweenness centrality + +nodeBetw <- bCmyGRG$res +nodeBetw <- round((log(nodeBetw +1))^2.5) + 1 + +# colours and size proportional to betweenness +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myGRG, + layout = cbind(rGAM$x, rGAM$y), # use our node coordinates for layout, + rescale = FALSE, + xlim = c(min(rGAM$x) * 0.9, max(rGAM$x) * 1.1), + ylim = c(min(rGAM$y) * 0.9, max(rGAM$y) * 1.1), + vertex.color=heat.colors(max(nodeBetw))[nodeBetw], + vertex.size = 0.1 + (0.03 * nodeBetw), + vertex.label = NA) +par(oPar) + +igraph::diameter(myGRG) +lines(rGAM$x[igraph::get_diameter(myGRG)], + rGAM$y[igraph::get_diameter(myGRG)], + lwd = 10, + col = "#ff335533") + + + +# = 5 GRAPH CLUSTERING ==================================================== + + +# Clustering finds "communities" in graphs - and depending what the edges +# represent, these could be complexes, pathways, biological systems or similar. +# There are many graph-clustering algorithms. One approach with many attractive +# properties is the Map Equation, developed by Martin Rosvall. See: +# http://www.ncbi.nlm.nih.gov/pubmed/18216267 and htttp://www.mapequation.org + + +myGRGclusters <- igraph::cluster_infomap(myGRG) +igraph::modularity(myGRGclusters) # ... measures how separated the different + # membership types are from each other +igraph::membership(myGRGclusters) # which nodes are in what cluster? +table(igraph::membership(myGRGclusters)) # how large are the clusters? + +# The largest cluster has 48 members, the second largest has 25, etc. + + +# Lets plot our graph again, coloring the nodes of the first five communities by +# their cluster membership: + +# first, make a vector with as many grey colors as we have communities ... +commColors <- rep("#f1eef6", max(igraph::membership(myGRGclusters))) +# ... then overwrite the first five with "real colors" - something like rust, +# lilac, pink, and mauve or so. +commColors[1:5] <- c("#980043", "#dd1c77", "#df65b0", "#c994c7", "#d4b9da") + + +oPar <- par(mar= c(0, 0, 0, 0)) # Turn margins off +plot(myGRG, + layout = cbind(rGAM$x, rGAM$y), + rescale = FALSE, + xlim = c(min(rGAM$x) * 0.9, max(rGAM$x) * 1.1), + ylim = c(min(rGAM$y) * 0.9, max(rGAM$y) * 1.1), + vertex.color=commColors[igraph::membership(myGRGclusters)], + vertex.size = 0.3 + (0.4 * igraph::degree(myGRG)), + vertex.label = NA) +par(oPar) + +# That's all. + + +# [END] diff --git a/myScripts/Graphs_and_networks.R b/myScripts/Graphs_and_networks.R new file mode 100644 index 0000000..e8757d5 --- /dev/null +++ b/myScripts/Graphs_and_networks.R @@ -0,0 +1,71 @@ +generate_overview_graph <- function() { + sealKey() + scCCnet <- readRDS("./data/scCCnet.rds") # S. cerevisiae Cell Cycle network + scCCnet_ns <- scCCnet[-3] # Remove scores + graph <- igraph::graph_from_edgelist(as.matrix(scCCnet_ns), directed = FALSE) + degrees <- igraph::degree(graph, normalized = TRUE) + graphxy <- igraph::layout_with_graphopt(graph, charge=0.30, mass=30) + + # Generate color palette: + colors = heat.colors( + max(igraph::degree(graph)+1) + )[igraph::degree(graph)+1] + + plot( + graph, + layout=graphxy, + rescale=TRUE, # Default is true, explicit as reminder. + vertex.size = (125 * degrees), + vertex.color = colors, + vertex.label=NA + ) + + legend( + "topright", + legend=c(max(igraph::degree(graph)), 0), + fill=c(colors[which.max(igraph::degree(graph))], colors[1]), + title = "Degrees" + ) + sealKey() +} + +generate_log_freq_vs_log_rank <- function() { + sealKey() + scCCnet <- readRDS("./data/scCCnet.rds") # S. cerevisiae Cell Cycle network + scCCnet_ns <- scCCnet[-3] # Remove scores + graph <- igraph::graph_from_edgelist(as.matrix(scCCnet_ns), directed = FALSE) + degrees <- igraph::degree(graph, normalized = FALSE) + freqs <- table(degrees) + scatter.smooth(log10(as.numeric(names(freqs)) + 1), + log10(as.numeric(freqs)), type = "b", + bg = "#A5F5CC", + xlab = "log(Rank)", ylab = "log(frequency)", + main = "Log Frequency against Log-Rank") + sealKey() +} + + +get_top_degrees <- function(n = 5) { + sealKey() + scCCnet <- readRDS("./data/scCCnet.rds") # S. cerevisiae Cell Cycle network + scCCnet_ns <- scCCnet[-3] # Remove scores + graph <- igraph::graph_from_edgelist(as.matrix(scCCnet_ns), directed = FALSE) + degrees <- igraph::degree(graph, normalized = FALSE) + + sorted_degrees <- degrees[order(degrees)] + sealKey() + tail(sorted_degrees, n) +} + +get_bot_degrees <- function(n = 5) { + sealKey() + scCCnet <- readRDS("./data/scCCnet.rds") # S. cerevisiae Cell Cycle network + scCCnet_ns <- scCCnet[-3] # Remove scores + graph <- igraph::graph_from_edgelist(as.matrix(scCCnet_ns), directed = FALSE) + degrees <- igraph::degree(graph, normalized = FALSE) + + sorted_degrees <- degrees[order(degrees)] + sealKey() + head(sorted_degrees, n) +} + diff --git a/myScripts/genome_annotation.R b/myScripts/genome_annotation.R new file mode 100644 index 0000000..d7d6273 --- /dev/null +++ b/myScripts/genome_annotation.R @@ -0,0 +1,2 @@ +# Integrator Unit: Genome Annotation +bio3d::get.seq() diff --git a/myScripts/graphs_and_networks_logs.png b/myScripts/graphs_and_networks_logs.png new file mode 100644 index 0000000000000000000000000000000000000000..07935a5de4847d36633d7dc242e11de941e94cfd GIT binary patch literal 15619 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 z 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 literal 0 HcmV?d00001 diff --git a/myScripts/graphs_and_networks_overview.png b/myScripts/graphs_and_networks_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..74231f85e582423602908468f2935a908d17fe1b GIT binary patch literal 116522 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 z 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 literal 0 HcmV?d00001