Python codes for the (q, s)-test, a significance test for individual communities in networks.
Please cite
Kojaku, S. and Masuda, N. "A generalised significance test for individual communities in networks". Sci. Rep. 8, 7351 (2018)
-
LICENSE - License of qstest
-
README.md - README file for Github
-
README.txt - README file (text file)
-
setup.py - Script for installing qstest
-
requirements.txt - List of libraries installed by setup.py
-
test.py - Test code for Travis CI
-
.gitignore - Configuration file for GitHub
-
.travis.yml - Configuration file for Travis CI
-
qstest/ - Python codes for the (q, s)-test:
- qstest/_init_.py - Header file
- qstest/cdalgorithm_wrapper.py - Codes for community-detection algorithms
- qstest/qstest.py contains - Codes for the (q, s)-test
- qstest/quality_functions.py - Codes for calculating quality functions of a community
- qstest/size_functions.py - Codes for calculating the size of a community
-
examples/ - example codes:
- examples/example1.py - Usage of qstest with a built-in quality function, community-size function and community detection algorithm
- examples/example2.py - Usage of qstest with a user-defined quality function
- examples/example3.py - Usage of qstest with a user-defined community-size function
- examples/example4.py - Usage of qstest with a user-defined community-detection algorithm
You can install qstest with pip, a package management system for Python.
To install, run
pip install qstest
If this does not work, try
python setup.py install
sg, p_values = qstest(network, communities, qfunc, sfunc, cdalgorithm, num_of_rand_net = 500, alpha = 0.05, num_of_thread = 4)
-
network
- Networkx Graph class instance -
communities
- C-dimensional list of lists. communities[c] is a list containing the IDs of nodes belonging to community c. Node and community indices start from 0. -
qfunc
- Quality of a community. The following quality functions are available:- qmod - Contribution of a community to the modularity
- qint - Internal average degree
- qexp - Expansion
- qcnd - Conductance To pass your quality function to qstest, see "How to pass your quality function to qstest" below.
-
sfunc
- Community-size function (i.e., size of a community). The following community-size functions are available:- n - Number of nodes in a community
- vol - Sum of the degrees of nodes in a community
To pass your community-size function to qstest, see "How to pass your community-size function to qstest" below.
-
cdalgorithm
- Community-detection algorithm. The following algorithms are available:- louvain - "Louvain algorithm"
- label_propagation - "Label propagation algorithm"
To pass your community-detection algorithm to qstest, see "How to pass your community-detection algorithm to qstest" below.
-
num_of_rand_net
(optional) - Number of randomised networks (Default: 500) -
alpha
(optional) - Statistical significance level before the Šidák correction (Default: 0.05) -
num_of_thread
(optional) - Maximum number of CPU threads (Default: 4)
sg
- Results of the significance test (C-dimensional list). sg[c] = True or False indicates that community c is significant or insignificant, respectively.p_values
- P-values for the communities (C-dimensional list). p_values[c] is the p-value for community c.
import networkx as nx
import qstest as qs
network = nx.karate_club_graph()
communities = qs.louvain(network)
sg, p_values = qs.qstest(network, communities, qs.qmod, qs.vol, qs.louvain)
Write a quality function of a community as follows:
q = my_qfunc(network, community)
network
- Networkx Graph class instancecommunity
- List of nodes belonging to a community
q
- Quality of the community
Then, pass my_qfunc to qstest:
sg, p_values = qstest(network, communities, my_qfunc, sfunc, cdalgorithm)
import networkx as nx
import qstest as qs
# Number of intra-community edges
def my_qfunc(network, nodes):
return network.subgraph(nodes).size()
network = nx.karate_club_graph()
communities = qs.louvain(network)
sg, p_values = qs.qstest(network, communities, my_qfunc, qs.vol, qs.louvain)
Write a community-size function of a community as follows:
s = my_sfunc(network, community)
network
- Networkx Graph class instancecommunity
- List of the IDs of nodes belonging to a community
s
- Size of the community
Then, pass my_sfunc to qstest:
sg, p_values = qstest(network, communities, qfunc, my_sfunc, cdalgorithm)
import networkx as nx
import qstest as qs
# Square of the number of nodes in a community
def my_sfunc(network, nodes):
return len(nodes) * len(nodes)
network = nx.karate_club_graph()
communities = qs.louvain(network)
sg, p_values = qs.qstest(network, communities, qs.qmod, my_sfunc, qs.louvain)
To pass your community-detection algorithm to qstest, write a wrapper function of the following form:
communities = my_cdalgorithm(network)
network
- Networkx Graph class instance
communities
- C-dimensional list of lists. communities[c] is a list containing the IDs of nodes belonging to community c.
Then, pass my_cdalgorithm to qstest:
sg, p_values = qstest(network, communities, qfunc, sfunc, my_cdalgorithm)
If the community-detection algorithm requires parameters such as the number of communities, then pass the parameters as global variables, e.g., define a global variable X, then use X within the cdalgorithm.
import networkx as nx
import qstest as qs
from networkx.algorithms import community as nxcdalgorithm
# Wrapper function for async_fluidc implemented in Networkx 2.0
def my_cdalgorithm(network):
communities = []
subnets = nx.connected_component_subgraphs(network)
for subnet in subnets:
coms_iter = nxcdalgorithm.asyn_fluidc(subnet, min([C, subnet.order()]), maxiter)
for nodes in iter(coms_iter):
communities.append(list(nodes))
return communities
# Pareameters of async_fluidc
C = 3
maxiter = 10
network = nx.karate_club_graph()
communities = my_cdalgorithm(network)
sg, p_values = qs.qstest(network, communities, qs.qmod, qs.vol, my_cdalgorithm)
- Python 2.7, 3.4 or later
- SciPy 1.0 or later
- Networkx 2.0 or later
- python-louvain 0.9