Python implementation of preprocessing and significance testing with inexact graph matching across a population.
This is a Python implementation built upon the techniques used in Osmanlıoğlu et al (2019).
It also allows for multi-threading of the more consuming processes (density matching and permutation testing).
If you use this in any work please cite the Zenodo record:
Alexander Anwyl-Irvine, & Edwin Dalmaijer. (2021). u01ai11/ConnectomeMatch. Zenodo. https://doi.org/10.5281/zenodo.5572257
Up-to-date version is here
First install the package.
pip install ConnectomeMatch
Then import
import ConnectomeMatch as cm
Sometimes we are matching groups of graphs with different densities. For instance a sparse DTI-MRI connectome against a fully connected MEG connectome.
Given two group of N graphs (shape=N x Node x Node), we threshold the sample matrix to match the target matrix
sample_matrix = cm.match_density(sample_matrix, target_matrix, 0.2, 0.01,100)
One function executes the matching on the group level. It normalises per graph pair and allows for built in multithreading.
diagonal_matches, binary_matrices, euclidean_distances = cm.match_graphs(sample_matrix, target_matrix, njobs=4, log=True)
the function returns the matches along each graphs diagonal, binary matrixes for each participant and the euclidean distance between nodes of each graph.
A permutation function generates a null distribution of binary matches for the sample. This can then be compared to the average matching accuracy from binary matching matrices above
import numpy as np
null = cm.generate_null_dist(sample_matrix, target_matrix,perms=100, njobs=4) # get null distribution
montecarlo_thresh = np.percentile(null, 0.95, axis=2) # get threshold values for matching matrix
significance_mask = binary_matrices.mean(axis=0) > montecarlo_thresh # mask for all significant values