Processing math: 25%

Visualization

library(nett)
library(igraph)

In this article, we go through some of the basic visualization functionality in the nett package.

Visualizing a DCSBM

Let us sample a network from a DCSBM:

n = 1500
Ktru = 4
lambda = 15 # expected average degree
oir = 0.1
pri = 1:Ktru

set.seed(1234)
theta <- EnvStats::rpareto(n, 2/3, 3)
B = pp_conn(n, oir, lambda, pri=pri, theta)$B
z = sample(Ktru, n, replace=T, prob=pri)

# sample the adjacency matrix
A = sample_dcsbm(z, B, theta)

We can plot the network using community labels z to color the nodes:

original = par("mar")

gr = igraph::graph_from_adjacency_matrix(A, "undirected") # convert to igraph object 
par(mar = c(0,0,0,0))
out = nett::plot_net(gr, community = z)


par(mar = original)

We can also plot the degree distribution:

nett::plot_deg_dist(gr)

summary(igraph::degree(out$gr))
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    1.00   10.00   13.00   14.81   17.00  131.00

A latent variable model

Now consider a latent variable model with K communities as follows: The adjacency matrix A=(Aij) is generated as a symmetric matrix, with independent Bernoulli entries above the diagonal with E[Aijx,θ]θiθje where e_k is the kth basis vector of \mathbb R^d, w_i \sim N(0, I_d), \{z_i\} \subset [K]^n are multinomial labels (similar to the DCSBM labels) and d = K. The proportionality constant in~\eqref{eq:dclvm:def} is chosen such that the overall network has expected average degree \lambda

We can generate from this model using the nett::sample_dclvm() function as follows:

d = Ktru
labels = sample(Ktru, n, replace = T, prob = pri)
labels = sort(labels)
mu = diag(Ktru)
x = 2*mu[labels, ] + 0.75*matrix(rnorm(n*d), n)

A = sample_dclvm(x, lambda, theta)

Visualizing the network and its degree distribution goes as before:

original = par("mar")

gr = igraph::graph_from_adjacency_matrix(A, "undirected") # convert to igraph object 
par(mar = c(0,0,0,0))
out = nett::plot_net(gr, community = labels)


par(mar = original)
nett::plot_deg_dist(gr)
#> Warning in nett::plot_deg_dist(gr): There are 0-degree nodes. Omitting them on
#> log scale.

summary(igraph::degree(out$gr))
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    1.00    6.00   11.00   13.61   18.00  198.00

Visualizing Political Blogs network

Let us compare with Political Blogs network accessible via polblogs.

original = par("mar")

par(mar = c(0,0,0,0))
out = nett::plot_net(polblogs, community = igraph::V(polblogs)$community)


par(mar = original)
nett::plot_deg_dist(polblogs)
#> Warning in nett::plot_deg_dist(polblogs): There are 0-degree nodes. Omitting
#> them on log scale.

summary(igraph::degree(polblogs))
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    0.00    1.00    8.00   25.62   33.00  468.00