## Loading required package: igraph
##
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
## The following object is masked from 'package:base':
##
## union
Rnetcarto provides fast network modularity and roles computation by simulated annealing (rgraph C library wrapper for R).
It exposes one main command named netcarto
that take a graph as an input (formatted as an adjacency matrix or list, as described in more detail below) and returns a partition of the graph optimizing a given modularity criterion. It also computes the modularity roles of the nodes.
Here is a small example:
# Generate a simple random network
matrix(as.integer(runif(100)<.3), ncol=10)
a =lower.tri(a)] = 0
a[rownames(a) = c('a','b','b','c','d','e','f','g','h','i')
colnames(a) = rownames(a)
# Find an optimal partition for modularity using netcarto.
# The output consists in a table containing node properties,
# and the modularity value of the partition.
netcarto(a)
## [[1]]
## name module connectivity participation role
## 4 c 0 -1.0000000 0.0000000 Ultra peripheral
## 5 d 0 1.0000000 0.6250000 Connector
## 2 b 1 -1.2247449 0.0000000 Ultra peripheral
## 8 g 1 -1.2247449 0.0000000 Ultra peripheral
## 1 a 1 0.8164966 0.3200000 Peripheral
## 6 e 1 0.8164966 0.3200000 Peripheral
## 10 i 1 0.8164966 0.3200000 Peripheral
## 7 f 2 -0.7071068 0.0000000 Ultra peripheral
## 3 b 2 -0.7071068 0.6666667 Connector
## 9 h 2 1.4142136 0.4444444 Peripheral
##
## [[2]]
## [1] 0.1373457
The netcarto
function can read network in either adjacency matrix or adjacency list format.
square symmetric matrix. In this format, the weight \(w\) of an between If you choose the matrix format, your network must consist in a vertices \(i\) and \(j\) is given by the corresponding value in the matrix web[i,j]
. Auto-loop (i.e. diagonal terms are authorised). You may name the rows and/or columns, those names will be used in the function output. Example:
matrix(0,3,3)
input =1,2] = 1
input[2,3] = 1
input[3,1] = 1
input[2,1] = 1
input[3,2] = 1
input[1,3] = 1
input[rownames(input) = c("A","B","C")
colnames(input) = rownames(input)
print(input)
## A B C
## A 0 1 1
## B 1 0 1
## C 1 1 0
Note that igraph
package can be used to manipulate and plot graphs:
# import from rnetcarto matrix format to igraph:
igraph::graph.adjacency(input,weighted=TRUE,mode="undirected")
G =# Export to a matrix compatible with netcarto:
igraph::get.adjacency(G,sparse=FALSE) input =
matrix(0,7,7)
input =1,2] = 10
input[2,3] = 10
input[3,1] = 10
input[4,5] = 10
input[5,6] = 10
input[6,4] = 10
input[rownames(input) = c("A","B","C","D","E","F","G")
colnames(input) = rownames(input)
Note that:
G
).web = web+t(web)-diag(web)
So the previous matrix is equivalent to:
## A B C D E F
## A 0 10 10 0 0 0
## B 10 0 10 0 0 0
## C 10 10 0 0 0 0
## D 0 0 0 0 10 10
## E 0 0 0 10 0 10
## F 0 0 0 10 10 0
Note that the matrix may not be square and symmetric if and only if you are considering a bipartite network (using the bipartite
flag).
matrix(0,6,2)
input =1,1] = 1
input[2,1] = 1
input[3,1] = 1
input[4,2] = 1
input[5,2] = 1
input[6,2] = 1
input[rownames(input) = c("A","B","C","D","E","F")
colnames(input) = c("Team 1", "Team 2")
print(input)
## Team 1 Team 2
## A 1 0
## B 1 0
## C 1 0
## D 0 1
## E 0 1
## F 0 1
If you choose the list format, your network must be formatted as a R-list. The first element must be a vector giving the label. The third element is a vector of the edge weights. The weights are optional and are all set to one if the list contains only the first two elements.
c("A","B","C","D","E","F","C")
nd1 = c("B","C","A","E","F","D","D")
nd2 = list(nd1,nd2,weights)
web =print(list(nd1,nd2))
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "C"
##
## [[2]]
## [1] "B" "C" "A" "E" "F" "D" "D"
c("A","B","C","D","E","F","C","A")
nd1 = c("B","C","A","E","F","D","D","D")
nd2 = c(10,10,10,10,10,10,10,10,1)
weights = list(nd1,nd2,weights)
web =print(web)
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "C" "A"
##
## [[2]]
## [1] "B" "C" "A" "E" "F" "D" "D" "D"
##
## [[3]]
## [1] 10 10 10 10 10 10 10 10 1
c("A","B","C","D","E","F","C","A")
nd1 = c("Team1","Team2","Team1","Team1","Team2","Team1","Team1","Team2")
nd2 = list(nd1,nd2)
bipartite =print(bipartite)
## [[1]]
## [1] "A" "B" "C" "D" "E" "F" "C" "A"
##
## [[2]]
## [1] "Team1" "Team2" "Team1" "Team1" "Team2" "Team1" "Team1" "Team2"
The netcarto
command output a list. Its first element is a dataframe giving the name module, connectivity, and participation coefficient for each node of the input graph. The second element is the modularity of this optimal partition.
netcarto(igraph::get.adjacency(G,sparse=FALSE))
## [[1]]
## name module connectivity participation role
## 4 D 0 0 0 Ultra peripheral
## 5 E 0 0 0 Ultra peripheral
## 6 F 0 0 0 Ultra peripheral
## 1 A 1 0 0 Ultra peripheral
## 2 B 1 0 0 Ultra peripheral
## 3 C 1 0 0 Ultra peripheral
##
## [[2]]
## [1] 0.5
netcarto(bipartite, bipartite=TRUE)
## [[1]]
## name module connectivity participation role
## 4 D 0 -0.5773503 0.0000000 Ultra peripheral
## 6 F 0 -0.5773503 0.0000000 Ultra peripheral
## 1 A 0 -0.5773503 0.4444444 Peripheral
## 3 C 0 1.7320508 0.0000000 Ultra peripheral
## 2 B 1 0.0000000 0.5000000 Peripheral
## 5 E 1 0.0000000 0.5000000 Peripheral
##
## [[2]]
## [1] 0.3317308