Network theory has been used for many years in the modeling and analysis of complex systems, as epidemiology, biology and biomedicine . As the data evolves and becomes more heterogeneous and complex, monoplex networks become an oversimplification of the corresponding systems. This imposes a need to go beyond traditional networks into a richer framework capable of hosting objects and relations of different scales, called Multilayered Network Mully, multilayer networks, is an R package that provides a multilayer network framework. Using this package, the user can create, modify and visualize graphs with multiple layers. This package is an extension to the igraph package that provides a monolayer graph framework. The package is implemented as a part of the Multipath Project directed by Dr. Frank Kramer .
More information and references can be found in the mully paper:
https://www.mdpi.com/2073-4425/9/11/519
mully is now available on CRAN !!
require(devtools)
install_github("frankkramer-lab/mully")
library(mully)
In this section, we provide a demo to test the package by calling some of the function. After running this script, you will have a graph g with 3 layers and 8 nodes. the graph can also be modified by calling other functions. Please refer to help to see the available functions.
g <- mully("MyFirstMully",direct = F)
g <- addLayer(g, c("Gene", "Drug", "Drug", "Disease"))
g=addNode(g,"d1","disease",attributes=list(type="t1"))
print("Node d1 added as disease")
g=addNode(g,"d2","disease",attributes=list(type="t1"))
print("Node d2 added as disease")
g=addNode(g,"d3","disease",attributes=list(type="t1"))
print("Node d3 added as disease")
g=addNode(g,"dr1","drug",attributes=list(effect="strong"))
print("Node dr1 added as drug")
g=addNode(g,"dr2","drug",attributes=list(effect="strong"))
print("Node dr2 added as drug")
g=addNode(g,"dr3","drug",attributes=list(effect="moderate"))
print("Node dr3 added as drug")
g=addNode(g,"g1","gene",attributes=list(desc="AF"))
print("Node g1 added as gene")
g=addNode(g,"g2","gene",attributes=list(desc="BE"))
print("Node g2 added as gene")
#See vertices attributes
print(getNodeAttributes(g))
#The Result:
# name n type effect desc
# 1 d1 3 t1 <NA> <NA>
# 2 d2 3 t1 <NA> <NA>
# 3 d3 3 t1 <NA> <NA>
# 4 dr1 2 <NA> strong <NA>
# 5 dr2 2 <NA> strong <NA>
# 6 dr3 2 <NA> moderate <NA>
# 7 g1 1 <NA> <NA> AF
# 8 g2 1 <NA> <NA> BE
g=addEdge(g,"dr1","d2",list(name="treats"))
g=addEdge(g,"dr1","d2",list(name="extraEdge"))
g=addEdge(g,"d2","g1",list(name="targets"))
g=addEdge(g,"g2","dr3",list(name="mutates and causes"))
g=addEdge(g,"dr3","d3",list(name="treats"))
print(getEdgeAttributes(g)
#The Result:
# V1 V2 name
# 1 d2 dr1 treats
# 2 d2 dr1 extraEdge
# 3 d2 g1 targets
# 4 dr3 g2 mutates and causes
# 5 d3 dr3 treats
removeEdge(g,"d2","dr1",multi=T)
#Create a Second graph
g1=mully()
g1=addLayer(g1,c("protein","drug","gene"))
g1=addNode(g1,"dr4","drug",attributes=list(effect="strong"))
g1=addNode(g1,"dr5","drug",attributes=list(effect="strong"))
g1=addNode(g1,"dr6","drug",attributes=list(effect="moderate"))
g1=addNode(g1,"p1","protein")
g1=addNode(g1,"p2","protein")
g1=addNode(g1,"p3","protein")
g1=addNode(g1,"g3","gene")
g1=addNode(g1,"g4","gene")
g1=addEdge(g1,nodeStart = "p2",nodeDest = "p3",attributes = list(name="interacts"))
g1=addEdge(g1,nodeStart = "dr6",nodeDest = "g4",attributes = list(name="targets"))
#Merge both graphs
g12=merge(g,g1)
#Print the graph
print(g12)
# Printing this graph gives this result:
# mully -- MyFirstMully
# 4 Layers:
# ID Name NameLower
# 1 1 Gene gene
# 2 2 Drug drug
# 3 3 Disease disease
# 4 4 protein protein
#
# 16 Nodes:
# name n type effect desc
# 1 d1 3 t1 <NA> <NA>
# 2 d2 3 t1 <NA> <NA>
# 3 d3 3 t1 <NA> <NA>
# 4 dr1 2 <NA> strong <NA>
# 5 dr2 2 <NA> strong <NA>
# 6 dr3 2 <NA> moderate <NA>
# 7 g1 1 <NA> <NA> AF
# 8 g2 1 <NA> <NA> BE
# 9 dr4 2 <NA> strong <NA>
# 10 dr5 2 <NA> strong <NA>
# 11 dr6 2 <NA> moderate <NA>
# 12 p1 4 <NA> <NA> <NA>
# 13 p2 4 <NA> <NA> <NA>
# 14 p3 4 <NA> <NA> <NA>
# 15 g3 1 <NA> <NA> <NA>
# 16 g4 1 <NA> <NA> <NA>
#
# 7 Edges:
# V1 V2 name
# 1 d2 dr1 treats
# 2 d2 dr1 extraEdge
# 3 d2 g1 targets
# 4 dr3 g2 mutates and causes
# 5 d3 dr3 treats
# 6 p2 p3 interacts
# 7 dr6 g4 targets
plot(g12,layout = "scaled")
plot3d(g12)
mully functions are divided into different files depending on their functionnality range: Constructor , Layers Functions , Node Functions , Edge Functions , Merge Function , Visualization Functions , Import Functions , Export Functions , Demo.
Function | Description |
---|---|
mully(name,direct) |
Constructor Function, Create an empty multilayered graph |
print(g) |
Print function |
addLayer(g, nameLayer) |
Add a layer or a set of layers to a graph |
removeLayer(g, name,trans) |
Delete a layer or a set of layers from a graph |
isLayer(g, name) |
Verify if the layer exists in a graph |
getLayersCount(g) |
Get the number of layers in a graph |
getLayer(g, nameLayer) |
Get the nodes on a layer in a graph |
getNode(g,nameNode) |
Get a node from a graph |
getIDNode(g,nameNode) |
Get the id of a node |
addNode(g, nodeName, layerName, attributes) |
Add a node with assigned layer and attributes to a graph |
removeNode(g, name,trans) |
Delete a node or a set of nodes from a graph |
getNodeAttributes(g,nameNode) |
Get the attributes of one or all nodes |
addEdge(g, nodeStart, nodeDest, attributes) |
Add an edge |
removeEdge(g, nodeStart, nodeDest,attributes, multi) |
Delete an edge |
getEdgeAttributes(g,nodeStart,nodeDest) |
Get the attributes of the edges connecting two nodes or all the edges in the graph |
getIDEdge(g,nodeStart,nodeDest) |
Get the ids of the edges connecting two nodes |
merge(g1,g2) |
Merge or unite two graphs |
plot(g,layout) |
Plot the graph in 2D |
plot3d(g) |
Plot the graph in 3D using rgl |
importGraphCSV(name,direct,layers,nodes,edges) |
Import a mully graph from csv files |
importLayersCSV(g,file) |
Import layers to a mully graph from a CSV file |
importNodesCSV(g,file) |
Import nodes to a mully graph from a CSV file |
importEdgesCSV(g,file) |
Import edges to a mully graph from a CSV file |