{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "2e7e77e9", "metadata": {}, "source": [ "# Higher-order network motif analysis in hypergraphs" ] }, { "cell_type": "raw", "id": "a65f26fd", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. admonition:: Definition\n", "\n", " Motifs are small subhypergraphs that occur more often than expected under a null model.\n" ] }, { "cell_type": "raw", "id": "ee699966", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. admonition:: You will learn\n", "\n", " Compute higher-order motifs and interpret their statistics.\n" ] }, { "cell_type": "markdown", "id": "53cb791e", "metadata": {}, "source": [ "## Overview\n", "\n", "- Compute higher-order motifs and interpret their patterns.\n", "- Visualize motif statistics for quick inspection.\n" ] }, { "cell_type": "markdown", "id": "a477ef56", "metadata": {}, "source": [ "## Setup\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "c3e3bcf1", "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "\n", "mpl.rcParams.update({\n", " \"figure.figsize\": (6, 4),\n", " \"figure.dpi\": 120,\n", " \"savefig.dpi\": 150,\n", "})\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ae3d9460", "metadata": {}, "source": [ "The function *compute_motifs* accepts the hypergraph H as a parameter, the order of the motif analysis (i.e., the size of the patterns in terms of the number of nodes), and the runs of the configuration model for computing the score of the motifs (relative abundance). Zero runs of the configuration model corresponds to counting patterns in the input hypergraphs. For example, here we set five runs for the configuration model. Five runs is a very low number, but it is enough for the purpose of this tutorial." ] }, { "attachments": {}, "cell_type": "markdown", "id": "8d367dbe", "metadata": {}, "source": [ "The output object stores the count of the patterns on the input hypergraph, the count of the patterns on the samples from the configuration model and the relative abundance score of the motifs." ] }, { "cell_type": "code", "execution_count": 2, "id": "74e683d7", "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append(\"..\")\n", "\n", "import hypergraphx as hgx\n", "from hypergraphx.motifs import compute_motifs\n", "from hypergraphx.readwrite import load_hypergraph\n", "from hypergraphx.viz import plot_motifs" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e63c6f90", "metadata": {}, "source": [ "Here we load the dataset \"high school\" from our data repository" ] }, { "cell_type": "code", "execution_count": 3, "id": "724811e5", "metadata": {}, "outputs": [], "source": [ "H = load_hypergraph(\"../tests/test_data/hs/hs.json\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "a86433bc", "metadata": {}, "outputs": [], "source": [ "motifs = compute_motifs(H, order=3, runs_config_model=5)" ] }, { "cell_type": "code", "execution_count": 5, "id": "8c3cb831", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['observed', 'config_model', 'norm_delta'])\n" ] } ], "source": [ "print(motifs.keys())" ] }, { "cell_type": "code", "execution_count": 6, "id": "d68210e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(((1, 2), (1, 2, 3)), 58),\n", " (((1, 2), (1, 2, 3), (1, 3)), 231),\n", " (((1, 2), (1, 2, 3), (1, 3), (2, 3)), 1802),\n", " (((1, 2), (1, 3)), 115709),\n", " (((1, 2), (1, 3), (2, 3)), 28029),\n", " (((1, 2, 3),), 0)]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "motifs['observed']" ] }, { "cell_type": "code", "execution_count": 7, "id": "45472fe5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(((1, 2), (1, 2, 3)), -0.46264365428648674), (((1, 2), (1, 2, 3), (1, 3)), 0.2151545406162159), (((1, 2), (1, 2, 3), (1, 3), (2, 3)), 0.5546029717156314), (((1, 2), (1, 3)), -0.0857528475493179), (((1, 2), (1, 3), (2, 3)), 0.3366743100547552), (((1, 2, 3),), -0.5580159268795104)]\n" ] } ], "source": [ "print(motifs['norm_delta'])" ] }, { "cell_type": "code", "execution_count": 8, "id": "372f622b", "metadata": {}, "outputs": [], "source": [ "motif_profile = [i[1] for i in motifs['norm_delta']]\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b9d79707", "metadata": {}, "source": [ "Let's plot the profile. Please keep in mind that the x-axis of the plot follows the original paper convention, displaying first the patterns involving lower-order interactions only." ] }, { "cell_type": "code", "execution_count": 9, "id": "c75a57d4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_motifs(motif_profile)" ] } ], "metadata": { "kernelspec": { "display_name": "hgx-installation", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 5 }