knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" )
r badger::badge_devel("Chabert-Liddell/MLVSBM", "blue")
r badger::badge_cran_release(color = "green")
r badger::badge_doi("10.1016/j.csda.2021.107179", "yellow")
This is an R package implementation of a Stochastic Block Model for Multilevel Network (MLVSBM) as described in Chabert-Liddell, Barbillon, Donnet and Lazega (2021) https://doi.org/10.1016/j.csda.2021.107179.
Details about generalized multilevel networks which are supported by the latest dev version on github can be found at http://www.theses.fr/en/2022UPASM005 (Chapter 2.E).
You can install the latest released version of MLVSBM from cran
install.packages("MLVSBM")
or the latest dev version which includes support for generalized multilevel networks from github with:
devtools::install_github("Chabert-Liddell/MLVSBM")
The package deals with multilevel network defined as the junction of two interaction networks (adjacency matrices) linked by an affiliation relationship (affiliation matrix).
First, we're going to simulate a multilevel network with 100 individuals and 3 clusters of individuals for the lower level and 50 organizations and 3 clusters for the upper level. The inter-organizational level will have an assortative structure and will be undirected, the inter-individual's one a core-periphery structure and will be directed. Affiliation matrix will be generated by a power law and the dependence between the structure of the two levels will be strong.
set.seed(123) my_mlvsbm <- MLVSBM::mlvsbm_simulate_network( n = list(I = 60, O = 40), # Number of nodes for the lower level and the upper level Q = list(I = 3, O = 3), # Number of blocks for the lower level and the upper level pi = c(.5, .3, .2), # Block proportion for the upper level, must sum to one gamma = matrix(c(.8, .1, .1, # Block proportion for the lower level, .1, .8, .1, .1, .1, .8), # each column must sum to one nrow = 3, ncol = 3, byrow = TRUE), alpha = list(I = matrix(c(.1, .1, .3, .1, .2, .5, .1, .5, .5), nrow = 3, ncol = 3, byrow = TRUE), # Connection matrix O = matrix(c(.5, .1, .1, .1, .5, .1, .1, .1, .5), nrow = 3, ncol = 3, byrow = TRUE)),# between blocks directed = list(I = TRUE, O = FALSE), # Are the upper and lower level directed or not ? affiliation = "preferential", # How the affiliation matrix is generated no_empty_org = FALSE) # May the affiliation matrix have column suming to 0
The network is stocked in an R6
object of type MLVSBM
.
Now, we are going to create a multilevel network object from 2 existing adjacency matrix and an affiliation matrix :
lower_level <- my_mlvsbm$adjacency_matrix$I # matrix of size nI x nI upper_level <- my_mlvsbm$adjacency_matrix$O # matrix of size nO x nO affiliation <- my_mlvsbm$affiliation_matrix # matrix of size nI x nO my_mlvsbm2 <- MLVSBM::mlvsbm_create_network(X = list(I = lower_level, O = upper_level), A = affiliation)
We can now infer the parameters, blocks and edge probabilities of our network by
using the mlvlsbm_estimate_network()
function on an MLVSBM
object.
It will return the best model for this network as another R6 object of type FitMLVSBM
.
fit <- MLVSBM:::mlvsbm_estimate_network(my_mlvsbm)
Some generic functions allow an easy access to the most useful parameters:
print(fit)
We can also plot a synthetic view of the network, with the fitted model:
plot(fit)
As well as obtain the model parameters:
coef(fit)
And the prediction of the block clustering as well as the probability of a link between two individuals or two organizations:
pred <- predict(fit) pred$nodes pred$dyads$I[1:5, 1:5]
Output of the algorithm are stocked in the MLVSBM
and FitMLVSBM
objects.
The MLVSBM
object stocks information of the observed or simulated network and a
list of all the fitted SBM and MLVSBM models.
my_mlvsbm$ICL # A data frame of the inferred models my_fit <- my_mlvsbm$fittedmodels[[which.max(my_mlvsbm$ICL$ICL)]] # The fitted model with index the highest ICL my_mlvsbm$ICL_sbm # The ICL of the SBM my_sbm_lower <- my_mlvsbm$fittedmodels_sbm$lower[[3]] # A fitted SBM for the lower level with 3 blocks my_sbm_upper <- my_mlvsbm$fittedmodels_sbm$upper[[2]] # A fitted SBM for the upper level with 2 blocks
You can also get the parameters and the clustering of the fitted model from the
FitMLVSBM
object as follows:
fit$parameters # The connectivity and membership parameters of the model fit$Z # The membership of each nodes fit$vbound # A vector of the varational bound of the VEM algorithm tau <- fit$membership # The variational parameters of the model pred <- fit$X_hat # The links predictions for each level
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.