diff --git a/README.md b/README.md index 4ffdf26..ccc9b0d 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,12 @@ review the sections from [The PathCORE-T analysis workflow](#the-pathcore-analysis-workflow) onwards in this README. +We released two Python packages for PathCORE-T: +- [PathCORE-T](https://github.com/greenelab/PathCORE-T) +- [crosstalk-correction](https://github.com/kathyxchen/crosstalk-correction): listed as a dependency in PathCORE-T + +The two packages are used in this analysis repository. + ## The [data](data) directory A README is provided in the `./data` directory with details about the scripts to download and/or process datasets, data source citations, etc. @@ -18,6 +24,12 @@ Scripts used to generate Figure 3 and Supplemental Figure 2 are provided in notebook format. We have found that we can offer greater detail about each of the figures in this format. +### Tutorials +This directory also contains 2 notebooks that users can read through or run +when they are getting started with PathCORE-T analysis: +- [FastICA-based PAO1 KEGG example](jupyter-notebooks/Supplemental_PAO1_FastICA_example.ipynb) +- [_k_=24 NMF-based TCGA PID example](jupyter-notebooks/Supplemental3_TCGA_NMF_k=24.ipynb) + ## The PathCORE-T analysis workflow Please review one of the `analysis__.sh` scripts for an example of the workflow. diff --git a/data/get_normalized_TCGA_dataset.py b/data/get_normalized_TCGA_dataset.py index 63a6ee9..098c39f 100644 --- a/data/get_normalized_TCGA_dataset.py +++ b/data/get_normalized_TCGA_dataset.py @@ -36,7 +36,7 @@ def expression_data_minmax_normalization(path_to_file, index_on_col): """ data = pd.read_table(path_to_file) data.set_index(index_on_col, inplace=True) - data = data[-data.index.str.contains('?', regex=False)] + data = data[~data.index.str.contains('?', regex=False)] data = data.sort_index() data_normalized = MinMaxScaler().fit_transform(data.T) diff --git a/jupyter-notebooks/Summary_PAO1_and_TCGA_network_results.ipynb b/jupyter-notebooks/Summary_PAO1_and_TCGA_network_results.ipynb new file mode 100644 index 0000000..58341a3 --- /dev/null +++ b/jupyter-notebooks/Summary_PAO1_and_TCGA_network_results.ipynb @@ -0,0 +1,1579 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional information about the PAO1 and TCGA pathway-pathway networks" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import itertools\n", + "import os\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "from scipy.stats import fisher_exact\n", + "from statsmodels.sandbox.stats.multicomp import multipletests" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "data_dir = os.path.join(\"..\", \"data\")\n", + "pao1_data = os.path.join(data_dir, \"pao1_data\")\n", + "tcga_data = os.path.join(data_dir, \"tcga_data\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "pao1_kegg_edges_file = os.path.join(\n", + " pao1_data, \"eADAGE_analysis\", \"permutation_test_n=10000\", \"filtered_network.tsv\")\n", + "tcga_pid_edges_file = os.path.join(\n", + " tcga_data, \"NMF_analysis\", \"permutation_test_n=10000\", \"filtered_network.tsv\")\n", + "\n", + "kegg_pathways = os.path.join(pao1_data, \"pseudomonas_KEGG_terms.txt\")\n", + "pid_pathways = os.path.join(tcga_data, \"PID_pathway_definitions.txt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def load_pathway_definitions_file(pathways_file, shorten_pathway_name):\n", + " pathway_definitions_df = pd.read_table(\n", + " pathways_file, header=None, names=[\"pw\", \"size\", \"genes\"])\n", + " pathway_definitions_df[\"genes\"] = pathway_definitions_df[\"genes\"].map(\n", + " lambda x: x.split(\";\"))\n", + " pathway_definitions_df.set_index(\"pw\", inplace=True)\n", + "\n", + " pathway_definitions_map = {}\n", + " for index, row in pathway_definitions_df.iterrows():\n", + " pathway = shorten_pathway_name(index)\n", + " pathway_definitions_map[pathway] = set(row[\"genes\"])\n", + " return pathway_definitions_map" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pw0pw1weight
0Ribosome PAO1Ribosome, bacteria26.089640
1Phosphonate and phosphinate metabolism PAO1Phosphonate transport system25.455394
2Macrolide resistance, MacAB-TolC transporterZinc transport system23.170151
3Phosphonate and phosphinate metabolism PAO1Type II general secretion pathway21.168310
4Glycine betaine/proline transport systemGlycine, serine and threonine metabolism PAO119.221697
\n", + "
" + ], + "text/plain": [ + " pw0 \\\n", + "0 Ribosome PAO1 \n", + "1 Phosphonate and phosphinate metabolism PAO1 \n", + "2 Macrolide resistance, MacAB-TolC transporter \n", + "3 Phosphonate and phosphinate metabolism PAO1 \n", + "4 Glycine betaine/proline transport system \n", + "\n", + " pw1 weight \n", + "0 Ribosome, bacteria 26.089640 \n", + "1 Phosphonate transport system 25.455394 \n", + "2 Zinc transport system 23.170151 \n", + "3 Type II general secretion pathway 21.168310 \n", + "4 Glycine, serine and threonine metabolism PAO1 19.221697 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pao1_kegg_network = pd.read_table(pao1_kegg_edges_file)\n", + "pao1_kegg_network.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# shorten the PAO1 KEGG pathway names so that they match the ones\n", + "# we use in the publication\n", + "def shorten_pao1_kegg(pathway_name):\n", + " REMOVE_SUFFIX = \"- Pseudomonas aeruginosa PAO1\"\n", + " pathway_short = None\n", + " split_label = pathway_name.split(\" \", 1)\n", + " if len(split_label) > 1:\n", + " pathway_short = split_label[1]\n", + " else:\n", + " pathway_short = split_label[0]\n", + " if REMOVE_SUFFIX in pathway_short:\n", + " remove_from_index = pathway_short.index(REMOVE_SUFFIX)\n", + " return \"{0}PAO1\".format(pathway_short[:remove_from_index])\n", + " return pathway_short.strip()\n", + "\n", + "kegg_pathways_dict = load_pathway_definitions_file(\n", + " kegg_pathways, shorten_pao1_kegg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PAO1 KEGG network summary statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For the PAO1 KEGG pathway-pathway co-occurrence network:\n", + "Number of distinct pathways in the network: 89\n", + "Number of edges in the network: 203\n", + "Number of edges in the network where the 2 pathways share genes: 35 (average similarity by Jaccard Index: 0.03482)\n" + ] + } + ], + "source": [ + "pathways_in_kegg_network = set(\n", + " pao1_kegg_network[\"pw0\"].tolist() + pao1_kegg_network[\"pw1\"].tolist())\n", + "\n", + "n_overlapping = 0\n", + "edge_jaccards = []\n", + "for index, row in pao1_kegg_network.iterrows():\n", + " pw0_genes = kegg_pathways_dict[row[\"pw0\"]] \n", + " pw1_genes = kegg_pathways_dict[row[\"pw1\"]]\n", + " overlap = pw0_genes & pw1_genes\n", + " if overlap:\n", + " n_overlapping += 1\n", + " jaccard = float(len(overlap)) / (len(pw0_genes) + len(pw1_genes) - len(overlap))\n", + " edge_jaccards.append(jaccard) \n", + " \n", + "print(\"For the PAO1 KEGG pathway-pathway co-occurrence network:\")\n", + "print(\"Number of distinct pathways in the network: {0}\".format(\n", + " len(pathways_in_kegg_network)))\n", + "print(\"Number of edges in the network: {0}\".format(\n", + " pao1_kegg_network.shape[0]))\n", + "print(\"Number of edges in the network where the 2 pathways \"\n", + " \"share genes: {0} (average similarity by Jaccard Index: {1:.4})\".format(\n", + " n_overlapping, np.average(edge_jaccards)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Comparison to a network based only on overlapping genes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we construct a network only from gene overlap (FDR-corrected hypergeometric test < 0.05). \n", + "The PathCORE-T network had 203 edges between 89 pathways. \n", + "The overlap-based network (see below) had 406 edges between 158 pathways. \n", + "Only 35 of the edges in the PathCORE-T network were between pathways that shared genes, with a low average Jaccard Index of 0.035. \n", + "A network constructed using PathCORE-T (with overlap-correction by default) captures pathway co-occurrences not driven by shared genes between pathways. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def create_overlap_based_network(pathway_genes_map, alpha=0.05):\n", + " all_genes = set().union(*pathway_genes_map.values())\n", + " n_genes = len(all_genes)\n", + " \n", + " pvalues_list = []\n", + " pathway_pairs = list(itertools.combinations(\n", + " pathway_genes_map.keys(), 2))\n", + " for pw0, pw1 in pathway_pairs:\n", + " pw0_genes = pathway_genes_map[pw0]\n", + " pw1_genes = pathway_genes_map[pw1]\n", + " n_common = len(pw0_genes & pw1_genes)\n", + " n_pw0 = len(pw0_genes - pw1_genes)\n", + " n_pw1 = len(pw1_genes - pw0_genes)\n", + " n_all_other_genes = n_genes - n_pw0 - n_pw1 - n_common\n", + " contingency_table = np.array(\n", + " [[n_common, n_pw0],\n", + " [n_pw1, n_all_other_genes]])\n", + " _, pvalue = fisher_exact(\n", + " contingency_table, alternative=\"greater\")\n", + " pvalues_list.append(pvalue)\n", + " \n", + " below_alpha, qvalues, _, _ = multipletests(\n", + " pvalues_list, alpha=alpha, method=\"fdr_bh\")\n", + " \n", + " significant_edges = [(pathway_pairs[ix], qvalues[ix]) for ix, is_below \n", + " in enumerate(below_alpha) if is_below]\n", + " return significant_edges" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of edges in the PAO1 KEGG overlap-based network: 406\n", + "Number of pathways in overlap-based network: 158\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pw0pw1adjusted_pval
0Ribosome PAO1Ribosome, bacteria4.826194e-90
1Fatty acid metabolism PAO1Fatty acid biosynthesis PAO15.252269e-41
2Citrate cycle (TCA cycle) PAO1Citrate cycle (TCA cycle, Krebs cycle)6.427679e-40
3Bacterial secretion system PAO1Type II general secretion pathway4.308885e-39
4Citrate cycle, second carbon oxidation, 2-oxog...Citrate cycle (TCA cycle, Krebs cycle)2.499061e-33
5Valine, leucine and isoleucine degradation PAO1Propanoate metabolism PAO16.428247e-33
6Biotin metabolism PAO1Pimeloyl-ACP biosynthesis, BioC-BioH pathway, ...1.409373e-31
7Fatty acid biosynthesis PAO1Fatty acid biosynthesis, elongation1.853222e-31
8Fatty acid degradation PAO1Fatty acid metabolism PAO15.967364e-31
9Citrate cycle (TCA cycle) PAO1Citrate cycle, second carbon oxidation, 2-oxog...1.258273e-29
10Fatty acid degradation PAO1Valine, leucine and isoleucine degradation PAO14.631031e-29
11Valine, leucine and isoleucine degradation PAO1Leucine degradation, leucine => acetoacetate +...1.873092e-27
12Aminoacyl-tRNA biosynthesis PAO1Aminoacyl-tRNA biosynthesis, prokaryotes3.641385e-27
13Fatty acid biosynthesis, elongationPimeloyl-ACP biosynthesis, BioC-BioH pathway, ...3.641385e-27
14Fatty acid metabolism PAO1Fatty acid biosynthesis, elongation1.342633e-25
15Fatty acid degradation PAO1beta-Oxidation1.862063e-25
16Lysine biosynthesis PAO1Lysine biosynthesis, succinyl-DAP pathway, asp...2.719932e-25
17Valine, leucine and isoleucine biosynthesis PAO1Isoleucine biosynthesis, threonine => 2-oxobut...3.267995e-25
18Biotin metabolism PAO1Fatty acid biosynthesis, elongation2.512307e-24
19Phenazine biosynthesis PAO1Pyocyanine biosynthesis, chorismate => pyocyanine4.340715e-24
20Tryptophan metabolism PAO1Lysine degradation PAO11.646385e-23
21Fatty acid biosynthesis PAO1Pimeloyl-ACP biosynthesis, BioC-BioH pathway, ...3.174955e-23
22Quorum sensing PAO1Phenazine biosynthesis PAO15.955826e-23
23Fatty acid metabolism PAO1beta-Oxidation2.398959e-22
24Valine, leucine and isoleucine biosynthesis PAO12-Oxocarboxylic acid metabolism PAO14.864250e-22
25Propanoate metabolism PAO1Fatty acid metabolism PAO11.038392e-21
26Valine, leucine and isoleucine degradation PAO1beta-Alanine metabolism PAO11.144403e-21
27Protein export PAO1Sec (secretion) system1.676715e-21
28Folate biosynthesis PAO1Tetrahydrofolate biosynthesis, GTP => THF1.822326e-21
29Biotin metabolism PAO1Fatty acid biosynthesis PAO12.184256e-20
............
45Arginine biosynthesis PAO1Alanine, aspartate and glutamate metabolism PAO14.212918e-17
46Imipenem resistance, repression of porin OprDCusS-CusR (copper tolerance) two-component reg...8.324803e-17
47Fatty acid degradation PAO1Tryptophan metabolism PAO11.059795e-16
48Valine, leucine and isoleucine biosynthesis PAO1Valine/isoleucine biosynthesis, pyruvate => va...1.397409e-16
49Fatty acid degradation PAO1Benzoate degradation PAO11.608228e-16
50DNA replication PAO1Mismatch repair PAO12.628312e-16
51beta-Alanine metabolism PAO1beta-Oxidation2.898540e-16
52Purine metabolism PAO1Pyrimidine metabolism PAO13.196342e-16
53Purine metabolism PAO1Inosine monophosphate biosynthesis, PRPP + glu...4.428380e-16
54Biotin metabolism PAO1Fatty acid metabolism PAO15.471826e-16
55Pantothenate and CoA biosynthesis PAO1Valine/isoleucine biosynthesis, pyruvate => va...5.844695e-16
56Lysine degradation PAO1Butanoate metabolism PAO15.844695e-16
57DNA replication PAO1DNA polymerase III complex, bacteria8.769749e-16
58Vitamin B6 metabolism PAO1Pyridoxal biosynthesis, erythrose-4P => pyrido...1.052619e-15
59Mismatch repair PAO1DNA polymerase III complex, bacteria3.202582e-15
60Fatty acid degradation PAO1beta-Alanine metabolism PAO13.935127e-15
61Bacterial secretion system PAO1Type III secretion system3.998219e-15
62Synthesis and degradation of ketone bodies PAO1Butanoate metabolism PAO14.094787e-15
63Valine, leucine and isoleucine degradation PAO1Lysine degradation PAO14.094787e-15
64Pyruvate metabolism PAO1Propanoate metabolism PAO14.324502e-15
65Benzoate degradation PAO1Lysine degradation PAO15.940569e-15
662-Oxocarboxylic acid metabolism PAO1Valine/isoleucine biosynthesis, pyruvate => va...8.453133e-15
67Riboflavin metabolism PAO1Riboflavin biosynthesis, GTP => riboflavin/FMN...8.453133e-15
68Phenylalanine, tyrosine and tryptophan biosynt...Tryptophan biosynthesis, chorismate => tryptophan8.453133e-15
69Homologous recombination PAO1DNA replication PAO11.108889e-14
70Citrate cycle (TCA cycle) PAO1Pyruvate oxidation, pyruvate => acetyl-CoA1.157571e-14
71Assimilatory sulfate reduction, sulfate => H2SSulfate-sulfur assimilation1.897639e-14
72Glycolysis / Gluconeogenesis PAO1Pyruvate oxidation, pyruvate => acetyl-CoA3.889847e-14
73Glycolysis / Gluconeogenesis PAO1Gluconeogenesis, oxaloacetate => fructose-6P3.889847e-14
74Homologous recombination PAO1DNA polymerase III complex, bacteria5.099497e-14
\n", + "

75 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " pw0 \\\n", + "0 Ribosome PAO1 \n", + "1 Fatty acid metabolism PAO1 \n", + "2 Citrate cycle (TCA cycle) PAO1 \n", + "3 Bacterial secretion system PAO1 \n", + "4 Citrate cycle, second carbon oxidation, 2-oxog... \n", + "5 Valine, leucine and isoleucine degradation PAO1 \n", + "6 Biotin metabolism PAO1 \n", + "7 Fatty acid biosynthesis PAO1 \n", + "8 Fatty acid degradation PAO1 \n", + "9 Citrate cycle (TCA cycle) PAO1 \n", + "10 Fatty acid degradation PAO1 \n", + "11 Valine, leucine and isoleucine degradation PAO1 \n", + "12 Aminoacyl-tRNA biosynthesis PAO1 \n", + "13 Fatty acid biosynthesis, elongation \n", + "14 Fatty acid metabolism PAO1 \n", + "15 Fatty acid degradation PAO1 \n", + "16 Lysine biosynthesis PAO1 \n", + "17 Valine, leucine and isoleucine biosynthesis PAO1 \n", + "18 Biotin metabolism PAO1 \n", + "19 Phenazine biosynthesis PAO1 \n", + "20 Tryptophan metabolism PAO1 \n", + "21 Fatty acid biosynthesis PAO1 \n", + "22 Quorum sensing PAO1 \n", + "23 Fatty acid metabolism PAO1 \n", + "24 Valine, leucine and isoleucine biosynthesis PAO1 \n", + "25 Propanoate metabolism PAO1 \n", + "26 Valine, leucine and isoleucine degradation PAO1 \n", + "27 Protein export PAO1 \n", + "28 Folate biosynthesis PAO1 \n", + "29 Biotin metabolism PAO1 \n", + ".. ... \n", + "45 Arginine biosynthesis PAO1 \n", + "46 Imipenem resistance, repression of porin OprD \n", + "47 Fatty acid degradation PAO1 \n", + "48 Valine, leucine and isoleucine biosynthesis PAO1 \n", + "49 Fatty acid degradation PAO1 \n", + "50 DNA replication PAO1 \n", + "51 beta-Alanine metabolism PAO1 \n", + "52 Purine metabolism PAO1 \n", + "53 Purine metabolism PAO1 \n", + "54 Biotin metabolism PAO1 \n", + "55 Pantothenate and CoA biosynthesis PAO1 \n", + "56 Lysine degradation PAO1 \n", + "57 DNA replication PAO1 \n", + "58 Vitamin B6 metabolism PAO1 \n", + "59 Mismatch repair PAO1 \n", + "60 Fatty acid degradation PAO1 \n", + "61 Bacterial secretion system PAO1 \n", + "62 Synthesis and degradation of ketone bodies PAO1 \n", + "63 Valine, leucine and isoleucine degradation PAO1 \n", + "64 Pyruvate metabolism PAO1 \n", + "65 Benzoate degradation PAO1 \n", + "66 2-Oxocarboxylic acid metabolism PAO1 \n", + "67 Riboflavin metabolism PAO1 \n", + "68 Phenylalanine, tyrosine and tryptophan biosynt... \n", + "69 Homologous recombination PAO1 \n", + "70 Citrate cycle (TCA cycle) PAO1 \n", + "71 Assimilatory sulfate reduction, sulfate => H2S \n", + "72 Glycolysis / Gluconeogenesis PAO1 \n", + "73 Glycolysis / Gluconeogenesis PAO1 \n", + "74 Homologous recombination PAO1 \n", + "\n", + " pw1 adjusted_pval \n", + "0 Ribosome, bacteria 4.826194e-90 \n", + "1 Fatty acid biosynthesis PAO1 5.252269e-41 \n", + "2 Citrate cycle (TCA cycle, Krebs cycle) 6.427679e-40 \n", + "3 Type II general secretion pathway 4.308885e-39 \n", + "4 Citrate cycle (TCA cycle, Krebs cycle) 2.499061e-33 \n", + "5 Propanoate metabolism PAO1 6.428247e-33 \n", + "6 Pimeloyl-ACP biosynthesis, BioC-BioH pathway, ... 1.409373e-31 \n", + "7 Fatty acid biosynthesis, elongation 1.853222e-31 \n", + "8 Fatty acid metabolism PAO1 5.967364e-31 \n", + "9 Citrate cycle, second carbon oxidation, 2-oxog... 1.258273e-29 \n", + "10 Valine, leucine and isoleucine degradation PAO1 4.631031e-29 \n", + "11 Leucine degradation, leucine => acetoacetate +... 1.873092e-27 \n", + "12 Aminoacyl-tRNA biosynthesis, prokaryotes 3.641385e-27 \n", + "13 Pimeloyl-ACP biosynthesis, BioC-BioH pathway, ... 3.641385e-27 \n", + "14 Fatty acid biosynthesis, elongation 1.342633e-25 \n", + "15 beta-Oxidation 1.862063e-25 \n", + "16 Lysine biosynthesis, succinyl-DAP pathway, asp... 2.719932e-25 \n", + "17 Isoleucine biosynthesis, threonine => 2-oxobut... 3.267995e-25 \n", + "18 Fatty acid biosynthesis, elongation 2.512307e-24 \n", + "19 Pyocyanine biosynthesis, chorismate => pyocyanine 4.340715e-24 \n", + "20 Lysine degradation PAO1 1.646385e-23 \n", + "21 Pimeloyl-ACP biosynthesis, BioC-BioH pathway, ... 3.174955e-23 \n", + "22 Phenazine biosynthesis PAO1 5.955826e-23 \n", + "23 beta-Oxidation 2.398959e-22 \n", + "24 2-Oxocarboxylic acid metabolism PAO1 4.864250e-22 \n", + "25 Fatty acid metabolism PAO1 1.038392e-21 \n", + "26 beta-Alanine metabolism PAO1 1.144403e-21 \n", + "27 Sec (secretion) system 1.676715e-21 \n", + "28 Tetrahydrofolate biosynthesis, GTP => THF 1.822326e-21 \n", + "29 Fatty acid biosynthesis PAO1 2.184256e-20 \n", + ".. ... ... \n", + "45 Alanine, aspartate and glutamate metabolism PAO1 4.212918e-17 \n", + "46 CusS-CusR (copper tolerance) two-component reg... 8.324803e-17 \n", + "47 Tryptophan metabolism PAO1 1.059795e-16 \n", + "48 Valine/isoleucine biosynthesis, pyruvate => va... 1.397409e-16 \n", + "49 Benzoate degradation PAO1 1.608228e-16 \n", + "50 Mismatch repair PAO1 2.628312e-16 \n", + "51 beta-Oxidation 2.898540e-16 \n", + "52 Pyrimidine metabolism PAO1 3.196342e-16 \n", + "53 Inosine monophosphate biosynthesis, PRPP + glu... 4.428380e-16 \n", + "54 Fatty acid metabolism PAO1 5.471826e-16 \n", + "55 Valine/isoleucine biosynthesis, pyruvate => va... 5.844695e-16 \n", + "56 Butanoate metabolism PAO1 5.844695e-16 \n", + "57 DNA polymerase III complex, bacteria 8.769749e-16 \n", + "58 Pyridoxal biosynthesis, erythrose-4P => pyrido... 1.052619e-15 \n", + "59 DNA polymerase III complex, bacteria 3.202582e-15 \n", + "60 beta-Alanine metabolism PAO1 3.935127e-15 \n", + "61 Type III secretion system 3.998219e-15 \n", + "62 Butanoate metabolism PAO1 4.094787e-15 \n", + "63 Lysine degradation PAO1 4.094787e-15 \n", + "64 Propanoate metabolism PAO1 4.324502e-15 \n", + "65 Lysine degradation PAO1 5.940569e-15 \n", + "66 Valine/isoleucine biosynthesis, pyruvate => va... 8.453133e-15 \n", + "67 Riboflavin biosynthesis, GTP => riboflavin/FMN... 8.453133e-15 \n", + "68 Tryptophan biosynthesis, chorismate => tryptophan 8.453133e-15 \n", + "69 DNA replication PAO1 1.108889e-14 \n", + "70 Pyruvate oxidation, pyruvate => acetyl-CoA 1.157571e-14 \n", + "71 Sulfate-sulfur assimilation 1.897639e-14 \n", + "72 Pyruvate oxidation, pyruvate => acetyl-CoA 3.889847e-14 \n", + "73 Gluconeogenesis, oxaloacetate => fructose-6P 3.889847e-14 \n", + "74 DNA polymerase III complex, bacteria 5.099497e-14 \n", + "\n", + "[75 rows x 3 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "significant_edges = create_overlap_based_network(kegg_pathways_dict, alpha=0.05)\n", + "print(\"Number of edges in the PAO1 KEGG overlap-based network: {0}\".format(\n", + " len(significant_edges)))\n", + "sorted_significant_edges = sorted(significant_edges, key=lambda tup: tup[1])\n", + "\n", + "pathways_in_network = set()\n", + "edges = []\n", + "for (pw0, pw1), adjusted_pval in sorted_significant_edges:\n", + " row = {\"pw0\": pw0, \"pw1\": pw1, \"adjusted_pval\": adjusted_pval}\n", + " pathways_in_network.add(pw0)\n", + " pathways_in_network.add(pw1)\n", + " edges.append(row)\n", + "\n", + "print(\"Number of pathways in overlap-based network: {0}\".format(\n", + " len(pathways_in_network)))\n", + " \n", + "show_N_edges = 75\n", + "edges_df = pd.DataFrame(edges, columns=[\"pw0\", \"pw1\", \"adjusted_pval\"])\n", + "edges_df.head(show_N_edges)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TCGA PID network summary statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pw0pw1weightfeatures
0E2FPLK16.54347819.0 29.0 39.0 44.0 59.0 114.0 115.0 158.0
1AURORA BE2F6.53193619.0 29.0 39.0 44.0 59.0 114.0 115.0 158.0
2AURORA BPLK16.34134719.0 29.0 39.0 44.0 59.0 114.0 115.0 158.0
3E2FFOXM15.97445819.0 29.0 39.0 44.0 59.0 115.0 158.0
4AURORA BFOXM15.87302619.0 29.0 39.0 44.0 59.0 115.0 158.0
\n", + "
" + ], + "text/plain": [ + " pw0 pw1 weight features\n", + "0 E2F PLK1 6.543478 19.0 29.0 39.0 44.0 59.0 114.0 115.0 158.0\n", + "1 AURORA B E2F 6.531936 19.0 29.0 39.0 44.0 59.0 114.0 115.0 158.0\n", + "2 AURORA B PLK1 6.341347 19.0 29.0 39.0 44.0 59.0 114.0 115.0 158.0\n", + "3 E2F FOXM1 5.974458 19.0 29.0 39.0 44.0 59.0 115.0 158.0\n", + "4 AURORA B FOXM1 5.873026 19.0 29.0 39.0 44.0 59.0 115.0 158.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tcga_pid_network = pd.read_table(tcga_pid_edges_file)\n", + "tcga_pid_network.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# shorten the PID pathway names so that they match the ones\n", + "# we use in the publication\n", + "def shorten_tcga_pid(pathway_name):\n", + " REMOVE_SUFFIX = \"PATHWAY\"\n", + " pathway_short = None\n", + " split_on_underscores = pathway_name.split(\"_\")\n", + " if split_on_underscores[-1] == REMOVE_SUFFIX:\n", + " pathway_short = \" \".join(split_on_underscores[:-1])\n", + " else:\n", + " pathway_short = \" \".join(split_on_underscores)\n", + " return pathway_short\n", + "\n", + "pid_pathways_dict = load_pathway_definitions_file(\n", + " pid_pathways, shorten_tcga_pid)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For the TCGA PID pathway-pathway co-occurrence network:\n", + "Number of distinct pathways in the network: 57\n", + "Number of edges in the network: 119\n", + "Number of edges in the network where the 2 pathways share genes: 96 (average similarity by Jaccard Index: 0.05783)\n" + ] + } + ], + "source": [ + "pathways_in_pid_network = set(\n", + " tcga_pid_network[\"pw0\"].tolist() + tcga_pid_network[\"pw1\"].tolist())\n", + "\n", + "n_overlapping = 0\n", + "edge_jaccards = []\n", + "for index, row in tcga_pid_network.iterrows():\n", + " pw0_genes = pid_pathways_dict[row[\"pw0\"]] \n", + " pw1_genes = pid_pathways_dict[row[\"pw1\"]]\n", + " overlap = pw0_genes & pw1_genes\n", + " if overlap:\n", + " n_overlapping += 1\n", + " jaccard = float(len(overlap)) / (len(pw0_genes) + len(pw1_genes) - len(overlap))\n", + " edge_jaccards.append(jaccard)\n", + "\n", + "print(\"For the TCGA PID pathway-pathway co-occurrence network:\")\n", + "print(\"Number of distinct pathways in the network: {0}\".format(\n", + " len(pathways_in_pid_network)))\n", + "print(\"Number of edges in the network: {0}\".format(\n", + " tcga_pid_network.shape[0]))\n", + "print(\"Number of edges in the network where the 2 pathways \"\n", + " \"share genes: {0} (average similarity by Jaccard Index: {1:.4})\".format(\n", + " n_overlapping, np.average(edge_jaccards)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Comparison to a network based only on overlapping genes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just as we did for the PAO1 KEGG case, we construct a network only from gene overlap (FDR-corrected hypergeometric test < 0.05) for the TCGA PID case. \n", + "The PathCORE-T network had 119 edges between 57 pathways.\n", + "The overlap-based network (see below) had 3826 edges between 196 pathways. \n", + "The fact that the overlap-based network is so dense suggests that there is a high degree of overlap between PID pathways.\n", + "96 of the edges in the PathCORE-T network were between pathways that shared genes, but the average Jaccard Index for these pathway pairs was only 0.058. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of edges in the PID overlap-based network: 3826\n", + "Number of pathways in overlap-based network: 196\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pw0pw1adjusted_pval
0TCRCD8 TCR2.070913e-76
1ERBB1 DOWNSTREAMPDGFRB1.431885e-53
2IL8 CXCR2IL8 CXCR12.000459e-42
3AVB3 INTEGRINSYNDECAN 14.320553e-38
4ENDOTHELINLYSOPHOSPHOLIPID4.192069e-34
5CDC42RAC14.192069e-34
6GMCSFIL2 1PATHWAY3.790383e-26
7FCER1BCR 5PATHWAY5.974713e-26
8GMCSFIL35.974713e-26
9CDC42ERBB1 DOWNSTREAM5.974713e-26
10INTEGRIN1INTEGRIN37.590876e-26
11S1P S1P3S1P S1P24.782879e-25
12NFAT TFPATHWAYTCR CALCIUM4.782879e-25
13ERBB1 DOWNSTREAMERBB2 ERBB36.337655e-25
14ERBB1 RECEPTOR PROXIMALPDGFRB9.436802e-25
15SHP2IL2 1PATHWAY3.021094e-24
16KITEPO3.176346e-24
17ER NONGENOMICTHROMBIN PAR14.363902e-24
18S1P S1P3S1P S1P14.408738e-24
19TXA2PATHWAYIL8 CXCR18.932892e-24
20IL2 PI3KIL2 STAT51.063465e-23
21TRAILFAS2.236480e-23
22LYSOPHOSPHOLIPIDER NONGENOMIC3.703095e-23
23ENDOTHELINS1P S1P28.081708e-23
24IL12 2PATHWAYIL12 STAT49.125227e-23
25METFAK1.355788e-22
26THROMBIN PAR4THROMBIN PAR11.460504e-22
27ERBB2 ERBB3PDGFRB1.460504e-22
28FRAAP13.839984e-22
29HIV NEFCASPASE3.911065e-22
............
45METRET2.760806e-20
46IL27IL232.888862e-20
47ERBB1 DOWNSTREAMPI3K PLC TRK3.243767e-20
48INSULINMET3.516756e-20
49CONERHODOPSIN3.516756e-20
50METIGF14.361016e-20
51ERBB1 RECEPTOR PROXIMALERBB2 ERBB34.361016e-20
52SHP2TRKR5.513524e-20
53TXA2PATHWAYIL8 CXCR26.168136e-20
54ER NONGENOMICAR NONGENOMIC6.339960e-20
55IL12 2PATHWAYIL236.622137e-20
56INSULINIGF11.835380e-19
57IL2 1PATHWAYERBB2 ERBB32.239092e-19
58CERAMIDEHIV NEF2.297568e-19
59FCER1MET2.615614e-19
60ENDOTHELINS1P S1P36.077232e-19
61ERBB1 RECEPTOR PROXIMALERBB1 INTERNALIZATION7.317938e-19
62RETPDGFRB1.245196e-18
63S1P METAS1P S1P21.469832e-18
64NETRINFAK1.654028e-18
65TCPTPERBB1 RECEPTOR PROXIMAL1.743474e-18
66BETA CATENIN DEGWNT CANONICAL2.032783e-18
67TCR RASCD8 TCR DOWNSTREAM2.089632e-18
68FCER1GMCSF2.128036e-18
69ENDOTHELINTHROMBIN PAR12.170068e-18
70PI3KCIPDGFRB2.352243e-18
71PDGFRBRAC12.430969e-18
72RETFAK2.462213e-18
73ERBB2 ERBB3CXCR32.604203e-18
74EPHB FWDRET3.328702e-18
\n", + "

75 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " pw0 pw1 adjusted_pval\n", + "0 TCR CD8 TCR 2.070913e-76\n", + "1 ERBB1 DOWNSTREAM PDGFRB 1.431885e-53\n", + "2 IL8 CXCR2 IL8 CXCR1 2.000459e-42\n", + "3 AVB3 INTEGRIN SYNDECAN 1 4.320553e-38\n", + "4 ENDOTHELIN LYSOPHOSPHOLIPID 4.192069e-34\n", + "5 CDC42 RAC1 4.192069e-34\n", + "6 GMCSF IL2 1PATHWAY 3.790383e-26\n", + "7 FCER1 BCR 5PATHWAY 5.974713e-26\n", + "8 GMCSF IL3 5.974713e-26\n", + "9 CDC42 ERBB1 DOWNSTREAM 5.974713e-26\n", + "10 INTEGRIN1 INTEGRIN3 7.590876e-26\n", + "11 S1P S1P3 S1P S1P2 4.782879e-25\n", + "12 NFAT TFPATHWAY TCR CALCIUM 4.782879e-25\n", + "13 ERBB1 DOWNSTREAM ERBB2 ERBB3 6.337655e-25\n", + "14 ERBB1 RECEPTOR PROXIMAL PDGFRB 9.436802e-25\n", + "15 SHP2 IL2 1PATHWAY 3.021094e-24\n", + "16 KIT EPO 3.176346e-24\n", + "17 ER NONGENOMIC THROMBIN PAR1 4.363902e-24\n", + "18 S1P S1P3 S1P S1P1 4.408738e-24\n", + "19 TXA2PATHWAY IL8 CXCR1 8.932892e-24\n", + "20 IL2 PI3K IL2 STAT5 1.063465e-23\n", + "21 TRAIL FAS 2.236480e-23\n", + "22 LYSOPHOSPHOLIPID ER NONGENOMIC 3.703095e-23\n", + "23 ENDOTHELIN S1P S1P2 8.081708e-23\n", + "24 IL12 2PATHWAY IL12 STAT4 9.125227e-23\n", + "25 MET FAK 1.355788e-22\n", + "26 THROMBIN PAR4 THROMBIN PAR1 1.460504e-22\n", + "27 ERBB2 ERBB3 PDGFRB 1.460504e-22\n", + "28 FRA AP1 3.839984e-22\n", + "29 HIV NEF CASPASE 3.911065e-22\n", + ".. ... ... ...\n", + "45 MET RET 2.760806e-20\n", + "46 IL27 IL23 2.888862e-20\n", + "47 ERBB1 DOWNSTREAM PI3K PLC TRK 3.243767e-20\n", + "48 INSULIN MET 3.516756e-20\n", + "49 CONE RHODOPSIN 3.516756e-20\n", + "50 MET IGF1 4.361016e-20\n", + "51 ERBB1 RECEPTOR PROXIMAL ERBB2 ERBB3 4.361016e-20\n", + "52 SHP2 TRKR 5.513524e-20\n", + "53 TXA2PATHWAY IL8 CXCR2 6.168136e-20\n", + "54 ER NONGENOMIC AR NONGENOMIC 6.339960e-20\n", + "55 IL12 2PATHWAY IL23 6.622137e-20\n", + "56 INSULIN IGF1 1.835380e-19\n", + "57 IL2 1PATHWAY ERBB2 ERBB3 2.239092e-19\n", + "58 CERAMIDE HIV NEF 2.297568e-19\n", + "59 FCER1 MET 2.615614e-19\n", + "60 ENDOTHELIN S1P S1P3 6.077232e-19\n", + "61 ERBB1 RECEPTOR PROXIMAL ERBB1 INTERNALIZATION 7.317938e-19\n", + "62 RET PDGFRB 1.245196e-18\n", + "63 S1P META S1P S1P2 1.469832e-18\n", + "64 NETRIN FAK 1.654028e-18\n", + "65 TCPTP ERBB1 RECEPTOR PROXIMAL 1.743474e-18\n", + "66 BETA CATENIN DEG WNT CANONICAL 2.032783e-18\n", + "67 TCR RAS CD8 TCR DOWNSTREAM 2.089632e-18\n", + "68 FCER1 GMCSF 2.128036e-18\n", + "69 ENDOTHELIN THROMBIN PAR1 2.170068e-18\n", + "70 PI3KCI PDGFRB 2.352243e-18\n", + "71 PDGFRB RAC1 2.430969e-18\n", + "72 RET FAK 2.462213e-18\n", + "73 ERBB2 ERBB3 CXCR3 2.604203e-18\n", + "74 EPHB FWD RET 3.328702e-18\n", + "\n", + "[75 rows x 3 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "significant_edges = create_overlap_based_network(pid_pathways_dict, alpha=0.05)\n", + "print(\"Number of edges in the PID overlap-based network: {0}\".format(\n", + " len(significant_edges)))\n", + "sorted_significant_edges = sorted(significant_edges, key=lambda tup: tup[1])\n", + "\n", + "pathways_in_network = set()\n", + "edges = []\n", + "for (pw0, pw1), adjusted_pval in sorted_significant_edges:\n", + " row = {\"pw0\": pw0, \"pw1\": pw1, \"adjusted_pval\": adjusted_pval}\n", + " pathways_in_network.add(pw0)\n", + " pathways_in_network.add(pw1)\n", + " edges.append(row)\n", + "\n", + "print(\"Number of pathways in overlap-based network: {0}\".format(\n", + " len(pathways_in_network)))\n", + " \n", + "show_N_edges = 75\n", + "edges_df = pd.DataFrame(edges, columns=[\"pw0\", \"pw1\", \"adjusted_pval\"])\n", + "edges_df.head(show_N_edges)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [default]", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter-notebooks/Supplemental3_TCGA_NMF_k=24.ipynb b/jupyter-notebooks/Supplemental3_TCGA_NMF_k=24.ipynb new file mode 100644 index 0000000..92a5d40 --- /dev/null +++ b/jupyter-notebooks/Supplemental3_TCGA_NMF_k=24.ipynb @@ -0,0 +1,1356 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example: applying the PathCORE-T software to 10 _k_=24 NMF models of the normalized TCGA dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Automatically created module for IPython interactive environment\n" + ] + } + ], + "source": [ + "print(__doc__)\n", + "\n", + "from copy import deepcopy\n", + "from functools import partial\n", + "import os\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "from pathcore import CoNetwork\n", + "from pathcore import aggregate_permuted_network, \\\n", + " network_edges_permutation_test\n", + "from pathcore import pathway_enrichment_with_overlap_correction\n", + "import seaborn as sns\n", + "from sklearn.decomposition import NMF, PCA" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This example is run after the TCGA dataset has been downloaded and normalized.\n", + "You can download the file from the Zenodo record [here](https://zenodo.org/record/56735) or use the [shell script in the `../data` directory](https://github.com/greenelab/PathCORE-T-analysis/blob/master/data/download_data.sh) (keep in mind this \n", + "script will download more than just the TCGA dataset). \n", + "\n", + "After downloading the file, use the script [`get_normalized_TCGA_dataset.py`](https://github.com/greenelab/PathCORE-T-analysis/blob/master/data/get_normalized_TCGA_dataset.py)\n", + "to get the normalized dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "data_dir = os.path.join(\"..\", \"data\")\n", + "tcga_data_dir = os.path.join(data_dir, \"tcga_data\")\n", + "\n", + "data_file = os.path.join(tcga_data_dir, \"HiSeqV2_minmaxscale_normalized\")\n", + "pathways_file = os.path.join(tcga_data_dir, \"PID_pathway_definitions.txt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the normalized dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "data_df = pd.read_table(data_file, header=0)\n", + "index_on = data_df.columns[0]\n", + "data_df.set_index(index_on, inplace=True)\n", + "data_df = data_df.sort_index()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis: determining the number of NMF components by examining the principal components of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Visualize the fraction of total variance in the data explained by each principal component in Principal Components Analysis (PCA) to determine an appropriate number of NMF components. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n_components = 50\n", + "pca = PCA(n_components=n_components, random_state=42)\n", + "pca.fit(data_df.T)\n", + "variance_explained = pca.explained_variance_ratio_\n", + "\n", + "plt.scatter(\n", + " list(range(1, len(variance_explained) + 1)),\n", + " variance_explained)\n", + "plt.xlabel('Principal component number')\n", + "plt.ylabel('Proportion of variance')\n", + "plt.title('PCA n_components={0}'.format(n_components))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The proportion of variance explained by each component, explicitly:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.11266259, 0.06688258, 0.06086373, 0.0460368 , 0.03688498,\n", + " 0.03573801, 0.0307545 , 0.02571392, 0.0227316 , 0.02125907,\n", + " 0.01804485, 0.01618074, 0.01360996, 0.01336723, 0.01063505,\n", + " 0.01049298, 0.0100946 , 0.00853679, 0.00747129, 0.0066962 ,\n", + " 0.00634571, 0.0061404 , 0.0056798 , 0.0055327 , 0.00497176,\n", + " 0.00472375, 0.00457551, 0.00427963, 0.00379434, 0.00369664,\n", + " 0.00347115, 0.00325509, 0.00310033, 0.00308135, 0.00295372,\n", + " 0.0028504 , 0.00279685, 0.00268549, 0.00256166, 0.00248202,\n", + " 0.00241397, 0.00225573, 0.00222781, 0.00217936, 0.002158 ,\n", + " 0.00213512, 0.0019845 , 0.00192908, 0.00188141, 0.00182891])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variance_explained" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the proportion of variance explained by a PC falls below 0.005 (0.5%) at 24 components. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.59835608102161053" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(variance_explained[:24])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On the other hand, the total proportion of variance explained by 24 PCs is only 0.60. If we look at the proportion of variance explained by _k_=300, the number of components in the TCGA NMF-based example of our manuscript:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Percent variance explained by k=300: 0.806375026754258\n" + ] + } + ], + "source": [ + "n_components = 300\n", + "pca = PCA(n_components=n_components, random_state=42)\n", + "pca.fit(data_df.T)\n", + "print(\"Percent variance explained by k={0}: {1}\".format(\n", + " n_components, sum(pca.explained_variance_ratio_)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We note that we would need an extremely large number of PCs to explain 90% of the variance in the data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PathCORE-T analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we would like to examine the results of PathCORE-T\n", + "when we limit the number of NMF components to the number of PCs that\n", + "each explain greater than 0.5% of the variance in the data.\n", + "\n", + "Ahead of creating this notebook, we found that the creation of a single\n", + "_k_=24 NMF model resulted in 0 significant edges after permutation testing\n", + "in PathCORE-T. This is because a given pathway-pathway relationship was\n", + "overrepresented in at most 2 of the NMF components based on the NMF\n", + "gene signature we specified in the paper (genes with weight 2 standard\n", + "deviations above the component's mean weight).\n", + "\n", + "We proceed here with the construction of 10 _k_=24 NMF models (each initialized\n", + "with different random seeds). We found that for models with very few components,\n", + "PathCORE-T analysis can identify meaningful edges by aggregating the results\n", + "from multiple models. This analysis is similar to what we did for the PAO1\n", + "eADAGE-based example in the PathCORE-T manuscript." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# initialize constants for the PathCORE-T analysis\n", + "n_models = 10\n", + "n_features = 24\n", + "\n", + "gene_signature_std = 2.0\n", + "\n", + "n_permutations = 10000\n", + "permutation_test_alpha = 0.05" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Example of a key-value pair in the `pathway_definitions_map` dict:\n", + "('FANCONI_PATHWAY', {'RAD17', 'FANCD2', 'BRCA1', 'FANCM', 'HUS1', 'BRCA2', 'RFC2', 'FANCB', 'PALB2', 'FAN1', 'FANCE', 'UBE2T', 'FANCL', 'RAD9A', 'APITD1', 'TOP3A', 'RAD1', 'C17orf70', 'RMI1', 'ATM', 'TOPBP1', 'SSPO', 'XRCC3', 'NBN', 'FANCF', 'RFC4', 'FANCC', 'WDR48', 'RFC3', 'USP1', 'RFC5', 'BLM', 'RPA2', 'FANCI', 'C19orf40', 'MRE11A', 'H2AFX', 'HES1', 'FANCA', 'RPA1', 'CHEK1', 'ATR', 'FBXW11', 'ATRIP', 'BRIP1', 'FANCG', 'RAD50'})\n" + ] + } + ], + "source": [ + "pathway_definitions_df = pd.read_table(\n", + " pathways_file, header=None, names=[\"pw\", \"size\", \"genes\"])\n", + "pathway_definitions_df[\"genes\"] = pathway_definitions_df[\"genes\"].map(\n", + " lambda x: x.split(\";\"))\n", + "pathway_definitions_df.set_index(\"pw\", inplace=True)\n", + "\n", + "pathway_definitions_map = {}\n", + "for index, row in pathway_definitions_df.iterrows():\n", + " pathway_definitions_map[index] = set(row[\"genes\"])\n", + "\n", + "print(\"Example of a key-value pair in the `pathway_definitions_map` dict:\")\n", + "print(list(pathway_definitions_map.items())[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 35min 50s, sys: 21 s, total: 36min 11s\n", + "Wall time: 18min 30s\n" + ] + } + ], + "source": [ + "%%time\n", + "models = []\n", + "for rseed in range(n_models):\n", + " model = NMF(n_components=n_features,\n", + " init=\"nndsvda\",\n", + " solver=\"cd\",\n", + " random_state=rseed)\n", + " model.fit_transform(data_df.T)\n", + " models.append(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def get_NMF_feature_weights(model):\n", + " gene_weights_across_components = {}\n", + " for index, gene_weights in enumerate(model.components_.T):\n", + " gene = data_df.index[index]\n", + " gene_weights_across_components[gene] = list(gene_weights)\n", + " weights_df = pd.DataFrame.from_dict(gene_weights_across_components,\n", + " orient=\"index\")\n", + " return weights_df\n", + "\n", + "model_weights = []\n", + "for m in models:\n", + " model_weights.append(get_NMF_feature_weights(m))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_pathways_overrepresented_in_features(current_weight_matrix, pathway_definitions,\n", + " partial_function_signature,\n", + " alpha=0.05, correct_all_genes=True,\n", + " metadata=False):\n", + " \"\"\"\n", + " This method is a simplification of the method already provided in the\n", + " PathCORE-T-analysis repository.\n", + " See documentation:\n", + " https://github.com/greenelab/PathCORE-T-analysis/blob/master/run_network_creation.py#L155\n", + " \n", + " Modifications:\n", + " * Removed the `overlap_correction` parameter for this example\n", + " - overlap correction will be applied by default.\n", + " * `current_weight_matrix` is just a pandas.DataFrame rather\n", + " than a tuple of a filename and a pandas.DataFrame\n", + "\n", + " We kept some of the parameters (alpha, correct_all_genes, metadata)\n", + " so that users interested in running the notebook themselves\n", + " could examine differences in results that occurs with parameter\n", + " changes and/or view the metadata that accompanies this analysis.\n", + " \"\"\"\n", + " n_genes, _ = current_weight_matrix.shape\n", + " significant_pathways_df = pd.DataFrame()\n", + " feature_metadata = {}\n", + " for feature in current_weight_matrix:\n", + " feature_df, additional = \\\n", + " pathway_enrichment_with_overlap_correction(\n", + " current_weight_matrix[feature], pathway_definitions,\n", + " partial_function_signature,\n", + " alpha=alpha, correct_all_genes=correct_all_genes,\n", + " metadata=metadata)\n", + " if feature_df is not None:\n", + " feature_df.loc[:, \"feature\"] = pd.Series(\n", + " [feature] * len(feature_df.index), index=feature_df.index)\n", + " significant_pathways_df = pd.concat(\n", + " [significant_pathways_df, feature_df], axis=0)\n", + " if additional:\n", + " feature_metadata[feature] = additional\n", + " significant_pathways_df.reset_index(drop=True, inplace=True)\n", + " return {\"significant_pathways\": significant_pathways_df,\n", + " \"feature_metadata\": feature_metadata}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pathway overrepresentation analysis applied to each component of each model." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "79 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "98 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "62 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "83 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "56 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "138 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "83 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "56 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "138 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "83 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "79 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "56 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "140 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "62 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "79 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "62 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "79 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "62 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "62 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "83 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "148 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "56 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "138 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "97 adjustments made to a vector of length 196 containing the raw weight values in a call to 'update_probabilities'\n", + "CPU times: user 1min 18s, sys: 259 ms, total: 1min 18s\n", + "Wall time: 1min 19s\n" + ] + } + ], + "source": [ + "%%time\n", + "def NMF_gene_signature(feature_weight_vector):\n", + " mean = feature_weight_vector.mean()\n", + " cutoff = gene_signature_std * feature_weight_vector.std()\n", + " positive_gene_signature = set(\n", + " feature_weight_vector[(feature_weight_vector >=\n", + " mean + cutoff)].index)\n", + " return (positive_gene_signature, set())\n", + "\n", + "model_pathways = []\n", + "for weights in model_weights:\n", + " feature_significant_pathways = get_pathways_overrepresented_in_features(\n", + " weights, pathway_definitions_map, NMF_gene_signature)\n", + " model_pathways.append(feature_significant_pathways[\"significant_pathways\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Network construction" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "aggregate_network = None\n", + "networks = []\n", + "for mp in model_pathways:\n", + " model_network = CoNetwork(\n", + " n_features, significant_pathways=mp)\n", + " networks.append(model_network)\n", + " if aggregate_network is None:\n", + " aggregate_network = deepcopy(model_network)\n", + " else:\n", + " aggregate_network.aggregate(model_network)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The pathway co-occurrence network contains 85 pathways.\n", + "Number of edges in the network: 591\n", + "Number of edges with a weight above 1 (i.e. the pathway-pathway relationship appears in more than one feature): 457\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pw0pw1weight
2A6B1_A6B4_INTEGRIN_PATHWAYTAP63_PATHWAY28
69IL12_2PATHWAYTOLL_ENDOGENOUS_PATHWAY20
245AVB3_INTEGRIN_PATHWAYINTEGRIN1_PATHWAY20
58FCER1_PATHWAYIL12_2PATHWAY19
19IL12_2PATHWAYIL4_2PATHWAY19
\n", + "
" + ], + "text/plain": [ + " pw0 pw1 weight\n", + "2 A6B1_A6B4_INTEGRIN_PATHWAY TAP63_PATHWAY 28\n", + "69 IL12_2PATHWAY TOLL_ENDOGENOUS_PATHWAY 20\n", + "245 AVB3_INTEGRIN_PATHWAY INTEGRIN1_PATHWAY 20\n", + "58 FCER1_PATHWAY IL12_2PATHWAY 19\n", + "19 IL12_2PATHWAY IL4_2PATHWAY 19" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_network_df = aggregate_network.to_dataframe()\n", + "print(\"Number of edges in the network: {0}\".format(len(model_network_df)))\n", + "\n", + "edges_above_one = model_network_df[model_network_df.weight > 1]\n", + "print(\"Number of edges with a weight above 1 \"\n", + " \"(i.e. the pathway-pathway relationship appears \"\n", + " \"in more than one feature): {0}\".format(\n", + " len(edges_above_one)))\n", + "edges_above_one.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Permutation test" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 13min 23s, sys: 6.91 s, total: 13min 30s\n", + "Wall time: 13min 36s\n" + ] + } + ], + "source": [ + "%%time\n", + "permutations = []\n", + "for i in range(10000):\n", + " permutations.append(aggregate_permuted_network(networks))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "364 edges are significant under the null distribution, generated from 10000 permutations, for alpha = 0.05.\n" + ] + } + ], + "source": [ + "final_network = network_edges_permutation_test(\n", + " aggregate_network, permutations, permutation_test_alpha,\n", + " n_networks=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
odds ratiopw0pw1
02.351743P53_DOWNSTREAM_PATHWAYTAP63_PATHWAY
14.448298NECTIN_PATHWAYTAP63_PATHWAY
22.868206A6B1_A6B4_INTEGRIN_PATHWAYTAP63_PATHWAY
32.488682NFAT_TFPATHWAYTAP63_PATHWAY
44.995847NECTIN_PATHWAYP53_DOWNSTREAM_PATHWAY
53.144205NFAT_TFPATHWAYP53_DOWNSTREAM_PATHWAY
62.776606A6B1_A6B4_INTEGRIN_PATHWAYNECTIN_PATHWAY
75.436900NECTIN_PATHWAYNFAT_TFPATHWAY
85.312139CXCR4_PATHWAYIL4_2PATHWAY
92.878846IL4_2PATHWAYTCR_PATHWAY
105.734020FCER1_PATHWAYIL4_2PATHWAY
115.668813IL4_2PATHWAYTOLL_ENDOGENOUS_PATHWAY
124.523027CXCR3_PATHWAYIL4_2PATHWAY
132.556614IL4_2PATHWAYTNF_PATHWAY
144.529039BCR_5PATHWAYIL4_2PATHWAY
153.019050AMB2_NEUTROPHILS_PATHWAYIL4_2PATHWAY
165.647587IL12_2PATHWAYIL4_2PATHWAY
172.548007CD8_TCR_DOWNSTREAM_PATHWAYIL4_2PATHWAY
184.535527GMCSF_PATHWAYIL4_2PATHWAY
193.922989IL4_2PATHWAYINTEGRIN2_PATHWAY
202.571253IL4_2PATHWAYNFKAPPAB_CANONICAL_PATHWAY
212.667375IL4_2PATHWAYNFAT_TFPATHWAY
224.426628CXCR4_PATHWAYTCR_PATHWAY
236.317905CXCR4_PATHWAYFCER1_PATHWAY
246.487510CXCR4_PATHWAYTOLL_ENDOGENOUS_PATHWAY
256.138554CXCR3_PATHWAYCXCR4_PATHWAY
262.783930CXCR4_PATHWAYTNF_PATHWAY
276.091954BCR_5PATHWAYCXCR4_PATHWAY
283.375254AMB2_NEUTROPHILS_PATHWAYCXCR4_PATHWAY
296.497712CXCR4_PATHWAYIL12_2PATHWAY
............
3343.650933INTEGRIN1_PATHWAYVEGF_VEGFR_PATHWAY
3352.724625P53_DOWNSTREAM_PATHWAYVEGF_VEGFR_PATHWAY
3362.788094CXCR4_PATHWAYVEGF_VEGFR_PATHWAY
3373.793708AVB3_INTEGRIN_PATHWAYVEGF_VEGFR_PATHWAY
3382.492259IL4_2PATHWAYVEGF_VEGFR_PATHWAY
3392.703262FCER1_PATHWAYVEGF_VEGFR_PATHWAY
3403.245342UPA_UPAR_PATHWAYVEGF_VEGFR_PATHWAY
3413.355540INTEGRIN_A9B1_PATHWAYVEGF_VEGFR_PATHWAY
3422.656234TOLL_ENDOGENOUS_PATHWAYVEGF_VEGFR_PATHWAY
3434.024036AP1_PATHWAYVEGF_VEGFR_PATHWAY
3442.647261IL12_2PATHWAYVEGF_VEGFR_PATHWAY
3453.764931INTEGRIN3_PATHWAYVEGF_VEGFR_PATHWAY
3462.772934SYNDECAN_1_PATHWAYVEGF_VEGFR_PATHWAY
3472.598337AURORA_A_PATHWAYMYC_PATHWAY
3482.337737AVB3_INTEGRIN_PATHWAYS1P_S1P3_PATHWAY
3492.745209S1P_S1P3_PATHWAYSHP2_PATHWAY
3502.414777SHP2_PATHWAYVEGF_VEGFR_PATHWAY
3511.932478ENDOTHELIN_PATHWAYS1P_S1P3_PATHWAY
3521.937712ENDOTHELIN_PATHWAYVEGF_VEGFR_PATHWAY
3532.776596ALPHA_SYNUCLEIN_PATHWAYS1P_S1P3_PATHWAY
3542.384337INTEGRIN1_PATHWAYS1P_S1P3_PATHWAY
3552.796682ILK_PATHWAYS1P_S1P3_PATHWAY
3562.429528ILK_PATHWAYVEGF_VEGFR_PATHWAY
3572.742710ALK1_PATHWAYS1P_S1P3_PATHWAY
3581.926230RET_PATHWAYS1P_S1P3_PATHWAY
3591.848386RET_PATHWAYVEGF_VEGFR_PATHWAY
3602.808824ANTHRAX_PATHWAYS1P_S1P3_PATHWAY
3611.855163S1P_S1P3_PATHWAYVEGF_VEGFR_PATHWAY
3622.685021ANTHRAX_PATHWAYVEGF_VEGFR_PATHWAY
3631.935808MTOR_4PATHWAYSMAD2_3PATHWAY
\n", + "

364 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " odds ratio pw0 pw1\n", + "0 2.351743 P53_DOWNSTREAM_PATHWAY TAP63_PATHWAY\n", + "1 4.448298 NECTIN_PATHWAY TAP63_PATHWAY\n", + "2 2.868206 A6B1_A6B4_INTEGRIN_PATHWAY TAP63_PATHWAY\n", + "3 2.488682 NFAT_TFPATHWAY TAP63_PATHWAY\n", + "4 4.995847 NECTIN_PATHWAY P53_DOWNSTREAM_PATHWAY\n", + "5 3.144205 NFAT_TFPATHWAY P53_DOWNSTREAM_PATHWAY\n", + "6 2.776606 A6B1_A6B4_INTEGRIN_PATHWAY NECTIN_PATHWAY\n", + "7 5.436900 NECTIN_PATHWAY NFAT_TFPATHWAY\n", + "8 5.312139 CXCR4_PATHWAY IL4_2PATHWAY\n", + "9 2.878846 IL4_2PATHWAY TCR_PATHWAY\n", + "10 5.734020 FCER1_PATHWAY IL4_2PATHWAY\n", + "11 5.668813 IL4_2PATHWAY TOLL_ENDOGENOUS_PATHWAY\n", + "12 4.523027 CXCR3_PATHWAY IL4_2PATHWAY\n", + "13 2.556614 IL4_2PATHWAY TNF_PATHWAY\n", + "14 4.529039 BCR_5PATHWAY IL4_2PATHWAY\n", + "15 3.019050 AMB2_NEUTROPHILS_PATHWAY IL4_2PATHWAY\n", + "16 5.647587 IL12_2PATHWAY IL4_2PATHWAY\n", + "17 2.548007 CD8_TCR_DOWNSTREAM_PATHWAY IL4_2PATHWAY\n", + "18 4.535527 GMCSF_PATHWAY IL4_2PATHWAY\n", + "19 3.922989 IL4_2PATHWAY INTEGRIN2_PATHWAY\n", + "20 2.571253 IL4_2PATHWAY NFKAPPAB_CANONICAL_PATHWAY\n", + "21 2.667375 IL4_2PATHWAY NFAT_TFPATHWAY\n", + "22 4.426628 CXCR4_PATHWAY TCR_PATHWAY\n", + "23 6.317905 CXCR4_PATHWAY FCER1_PATHWAY\n", + "24 6.487510 CXCR4_PATHWAY TOLL_ENDOGENOUS_PATHWAY\n", + "25 6.138554 CXCR3_PATHWAY CXCR4_PATHWAY\n", + "26 2.783930 CXCR4_PATHWAY TNF_PATHWAY\n", + "27 6.091954 BCR_5PATHWAY CXCR4_PATHWAY\n", + "28 3.375254 AMB2_NEUTROPHILS_PATHWAY CXCR4_PATHWAY\n", + "29 6.497712 CXCR4_PATHWAY IL12_2PATHWAY\n", + ".. ... ... ...\n", + "334 3.650933 INTEGRIN1_PATHWAY VEGF_VEGFR_PATHWAY\n", + "335 2.724625 P53_DOWNSTREAM_PATHWAY VEGF_VEGFR_PATHWAY\n", + "336 2.788094 CXCR4_PATHWAY VEGF_VEGFR_PATHWAY\n", + "337 3.793708 AVB3_INTEGRIN_PATHWAY VEGF_VEGFR_PATHWAY\n", + "338 2.492259 IL4_2PATHWAY VEGF_VEGFR_PATHWAY\n", + "339 2.703262 FCER1_PATHWAY VEGF_VEGFR_PATHWAY\n", + "340 3.245342 UPA_UPAR_PATHWAY VEGF_VEGFR_PATHWAY\n", + "341 3.355540 INTEGRIN_A9B1_PATHWAY VEGF_VEGFR_PATHWAY\n", + "342 2.656234 TOLL_ENDOGENOUS_PATHWAY VEGF_VEGFR_PATHWAY\n", + "343 4.024036 AP1_PATHWAY VEGF_VEGFR_PATHWAY\n", + "344 2.647261 IL12_2PATHWAY VEGF_VEGFR_PATHWAY\n", + "345 3.764931 INTEGRIN3_PATHWAY VEGF_VEGFR_PATHWAY\n", + "346 2.772934 SYNDECAN_1_PATHWAY VEGF_VEGFR_PATHWAY\n", + "347 2.598337 AURORA_A_PATHWAY MYC_PATHWAY\n", + "348 2.337737 AVB3_INTEGRIN_PATHWAY S1P_S1P3_PATHWAY\n", + "349 2.745209 S1P_S1P3_PATHWAY SHP2_PATHWAY\n", + "350 2.414777 SHP2_PATHWAY VEGF_VEGFR_PATHWAY\n", + "351 1.932478 ENDOTHELIN_PATHWAY S1P_S1P3_PATHWAY\n", + "352 1.937712 ENDOTHELIN_PATHWAY VEGF_VEGFR_PATHWAY\n", + "353 2.776596 ALPHA_SYNUCLEIN_PATHWAY S1P_S1P3_PATHWAY\n", + "354 2.384337 INTEGRIN1_PATHWAY S1P_S1P3_PATHWAY\n", + "355 2.796682 ILK_PATHWAY S1P_S1P3_PATHWAY\n", + "356 2.429528 ILK_PATHWAY VEGF_VEGFR_PATHWAY\n", + "357 2.742710 ALK1_PATHWAY S1P_S1P3_PATHWAY\n", + "358 1.926230 RET_PATHWAY S1P_S1P3_PATHWAY\n", + "359 1.848386 RET_PATHWAY VEGF_VEGFR_PATHWAY\n", + "360 2.808824 ANTHRAX_PATHWAY S1P_S1P3_PATHWAY\n", + "361 1.855163 S1P_S1P3_PATHWAY VEGF_VEGFR_PATHWAY\n", + "362 2.685021 ANTHRAX_PATHWAY VEGF_VEGFR_PATHWAY\n", + "363 1.935808 MTOR_4PATHWAY SMAD2_3PATHWAY\n", + "\n", + "[364 rows x 3 columns]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "significant_edges = []\n", + "for edge_id, edge_obj in final_network.edges.items():\n", + " if edge_obj.significant:\n", + " pw0, pw1 = final_network.get_edge_pathways(edge_id)\n", + " significant_edges.append({\"pw0\": pw0, \"pw1\": pw1, \"odds ratio\": edge_obj.weight})\n", + "significant_edges_df = pd.DataFrame(significant_edges)\n", + "significant_edges_df.sort_values(\"odds ratio\", ascending=False)\n", + "significant_edges_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check which edges the _k_=24 NMF-based TCGA PID network has in common with the _k_=300 NMF-based TCGA PID network " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of edges in the manuscript's k=300 NMF-based TCGA PID network: 119\n" + ] + } + ], + "source": [ + "NMF_k300_edges_file = os.path.join(tcga_data_dir,\n", + " \"NMF_analysis\",\n", + " \"permutation_test_N=10000\",\n", + " \"significant_edges.tsv\")\n", + "NMF_k300_edges = {}\n", + "with open(NMF_k300_edges_file, 'r') as file_handle:\n", + " file_handle.readline()\n", + " for line in file_handle:\n", + " cols = line.strip().split('\\t')\n", + " NMF_k300_edges[(cols[0], cols[1])] = float(cols[-1])\n", + "print(\"Number of edges in the manuscript's k=300 \"\n", + " \"NMF-based TCGA PID network: {0}\".format(\n", + " len(NMF_k300_edges)))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# shorten the PID pathway names so that they match the ones\n", + "# we use in the publication\n", + "def tcga_shorten_pid(pathway_name):\n", + " REMOVE_SUFFIX = \"PATHWAY\"\n", + " pathway_short = None\n", + " split_on_underscores = pathway_name.split(\"_\")\n", + " if split_on_underscores[-1] == REMOVE_SUFFIX:\n", + " pathway_short = \" \".join(split_on_underscores[:-1])\n", + " else:\n", + " pathway_short = \" \".join(split_on_underscores)\n", + " return pathway_short\n", + "\n", + "NMF_k24_edges = {}\n", + "for edge_id, edge_obj in final_network.edges.items():\n", + " if edge_obj.significant:\n", + " pw0, pw1 = final_network.get_edge_pathways(edge_id)\n", + " pw0 = tcga_shorten_pid(pw0)\n", + " pw1 = tcga_shorten_pid(pw1)\n", + " NMF_k24_edges[(pw0, pw1)] = edge_obj.weight" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Common edges: 65\n" + ] + } + ], + "source": [ + "set_of_k24_edges = set(NMF_k24_edges.keys())\n", + "set_of_k300_edges = set(NMF_k300_edges.keys())\n", + "common_edges = set_of_k24_edges & set_of_k300_edges\n", + "print(\"Common edges: {0}\".format(len(common_edges)))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "remaining_k300_edges = set_of_k300_edges - set_of_k24_edges" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "remaining_k24_edges = set_of_k24_edges - set_of_k300_edges" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The edges that the two networks share have a higher weight, on average, than the edges that the two networks do not share:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average weight of edges in the k=300 NMF-based network common to the k=300 and k=24 NMF-based networks: 3.77\n", + "Average weight of edges in the k=24 NMF-based network common to the k=300 and k=24 NMF-based networks: 5.38\n" + ] + } + ], + "source": [ + "common_k300_edge_weights = [] \n", + "common_k24_edge_weights = []\n", + "for e in common_edges:\n", + " common_k300_edge_weights.append(NMF_k300_edges[e])\n", + " common_k24_edge_weights.append(NMF_k24_edges[e])\n", + "print(\"Average weight of edges in the k=300 NMF-based network \"\n", + " \"common to the k=300 and k=24 NMF-based networks: {0:.3}\".format(\n", + " np.average(common_k300_edge_weights)))\n", + "print(\"Average weight of edges in the k=24 NMF-based network \"\n", + " \"common to the k=300 and k=24 NMF-based networks: {0:.3}\".format(\n", + " np.average(common_k24_edge_weights)))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average weight of edges in the k=300 NMF-based network not in the k=24 network: 2.76\n" + ] + } + ], + "source": [ + "remaining_k300_edge_weights = [] \n", + "for e in remaining_k300_edges:\n", + " remaining_k300_edge_weights.append(NMF_k300_edges[e])\n", + "print(\"Average weight of edges in the k=300 NMF-based network \"\n", + " \"not in the k=24 network: {0:.3}\".format(\n", + " np.average(remaining_k300_edge_weights)))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average weight of edges in the k=24 NMF-based network not in the k=300 network: 3.75\n" + ] + } + ], + "source": [ + "remaining_k24_edge_weights = [] \n", + "for e in remaining_k24_edges:\n", + " remaining_k24_edge_weights.append(NMF_k24_edges[e])\n", + "print(\"Average weight of edges in the k=24 NMF-based network \"\n", + " \"not in the k=300 network: {0:.3}\".format(\n", + " np.average(remaining_k24_edge_weights)))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [default]", + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter-notebooks/Supplemental_PAO1_FastICA_example.ipynb b/jupyter-notebooks/Supplemental_PAO1_FastICA_example.ipynb index f0dd324..3a731ab 100644 --- a/jupyter-notebooks/Supplemental_PAO1_FastICA_example.ipynb +++ b/jupyter-notebooks/Supplemental_PAO1_FastICA_example.ipynb @@ -23,7 +23,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This example is run after the normalized _P. aeruginosa_ compendium has been downloaded. You can download the compendium from the Zenodo record [here](https://zenodo.org/record/583694) or use the [shell script in the `../data` directory](https://github.com/greenelab/PathCORE-T-analysis/blob/master/data/download_data.sh) (keep in mind this script will download more than just the compendium). " + "This example is run after the normalized _P. aeruginosa_ compendium has been downloaded. You can download the compendium from\n", + "the Zenodo record [here](https://zenodo.org/record/583694) or use the [shell script in the `../data` directory](https://github.com/greenelab/PathCORE-T-analysis/blob/master/data/download_data.sh) (keep in mind this \n", + "script will download more than just the compendium). " ] }, { @@ -42,9 +44,11 @@ "source": [ "print(__doc__)\n", "\n", + "\n", "from functools import partial\n", "import os\n", "\n", + "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", @@ -53,7 +57,10 @@ " network_edges_permutation_test\n", "from pathcore import pathway_enrichment_with_overlap_correction\n", "import seaborn as sns\n", - "from sklearn.decomposition import FastICA" + "from sklearn.decomposition import FastICA, PCA\n", + "\n", + "\n", + "sns.set(color_codes=True)" ] }, { @@ -73,7 +80,8 @@ "source": [ "data_dir = os.path.join(\"..\", \"data\")\n", "pao1_data_dir = os.path.join(data_dir, \"pao1_data\")\n", - "gene_compendium = os.path.join(pao1_data_dir, \"all-pseudomonas-gene-normalized.pcl\")\n", + "gene_compendium = os.path.join(\n", + " pao1_data_dir, \"all-pseudomonas-gene-normalized.pcl\")\n", "pathways = os.path.join(pao1_data_dir, \"pseudomonas_KEGG_terms.txt\")" ] }, @@ -435,8 +443,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 9 s, sys: 218 ms, total: 9.22 s\n", - "Wall time: 5.1 s\n" + "CPU times: user 8.47 s, sys: 173 ms, total: 8.65 s\n", + "Wall time: 4.62 s\n" ] } ], @@ -689,7 +697,8 @@ } ], "source": [ - "weight_matrix_df = pd.DataFrame(weight_matrix, index=compendium_df.index)\n", + "weight_matrix_df = pd.DataFrame(\n", + " weight_matrix, index=compendium_df.index)\n", "weight_matrix_df.head()" ] }, @@ -717,14 +726,15 @@ "source": [ "col_averages = np.mean(weight_matrix, axis=0)\n", "print(\"Mean centered at 0: {0}\".format(np.mean(col_averages)))\n", - "print(\"Mean standard deviation of each feature: {0}\".format(np.mean(np.std(weight_matrix, axis=0))))" + "print(\"Mean standard deviation of each feature: {0}\".format(\n", + " np.mean(np.std(weight_matrix, axis=0))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "In order to define an appropriate gene signature rule for NMF features, we want to visualize their weight distributions." + "In order to define an appropriate gene signature rule for ICA features, we want to visualize their weight distributions." ] }, { @@ -736,7 +746,7 @@ "data": { "image/png": "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\nqwuv10tLS8sp53/ooYdYunTpx1r3li1bUE+iKsqZoZK3okxjK1eunOgKdmhoCMuyuO6669i8eTMA\n27Zt47LLLmPPnj3cdttt3HTTTXzlK1+ZOBO/8847J9qG37BhA2vXrmXdunX85V/+Jc899xwAuVyO\nv/mbv+EP/uAPuP3224lGozz66KMMDw9zzz33EI1GK1ByRZneVPJWlGls8eLFdHd3k8/n2bx5M6tW\nrWLVqlUnJe+LL76Yb37zm2zYsIGf/vSn3H333fzDP/zDScvZuHEj27dv58UXX+TRRx9l//79E9PG\nxsa4++67efHFF6mrq+MXv/gF99xzD+FwmEcffZTq6upJLbOinAumffOoinIu03Wd888/n71797J5\n82buuOMOWlpayOVyxONxdu7cyZe//GV6enr42te+NjFfKpU6aTlvvvkm119/PZZlYVkWa9asmZgW\nDodZtmwZAOedd54601aUSaCSt6JMc+/c996zZw//8i//MjHu1VdfJRQKATBz5kxeeOEFoNz3eyQS\nOWkZmqbhOM4pl//u7kaFEOo+t6JMAnXZXFGmuZUrV/LCCy/Q3t4+kWhXrVrFE088wapVq5gzZw7x\neJxt27YB8Oyzz/K3f/u3Jy1j1apVvPTSSxQKBVKpFJs2bUII8YHr1XUd27bPTKEU5RynzrwVZZpr\nb28nFotx++23T4xbuXIl9957L6tWrcKyLP7t3/6Nhx56iHw+j9/v57vf/e5Jy7jyyivZsWMHN910\nE8FgkHA4jMvl+sD1rl69mnvuuYfHH3/8tLXZFUX5eFSvYoqifKidO3fS2dnJTTfdRLFYZN26daxf\nv54FCxZUOjRFOSep5K0oyoeKxWLcd999jIyMIKXkxhtv5M/+7M8qHZainLNU8lYURVGUKUZVWFMU\nRVGUKUYlb0VRFEWZYlTyVhRFUZQpRiVvRVEURZliVPJWFEVRlClGJW9FURRFmWL+P5yW46JNbvyX\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -744,14 +754,29 @@ } ], "source": [ - "sns.set(color_codes=True)\n", - "def plot_feature_weight_distributions(end_feature, dataframe):\n", + "def plot_feature_weight_distributions(plot_n_features, weight_matrix):\n", + " \"\"\"\n", + " Parameters\n", + " ----------\n", + " plot_n_features : int\n", + " The first `plot_n_features` distributions are displayed\n", + " weight_matrix : pandas.DataFrame\n", + " The weight matrix dataframe (rows are genes,\n", + " cols are components)\n", + " \n", + " Returns\n", + " -------\n", + " None\n", + " Displays the weight distributions of the first\n", + " `plot_n_features` features.\n", + " \"\"\"\n", " fig, ax = plt.subplots()\n", - " for i in range(0, end_feature):\n", + " for i in range(0, plot_n_features):\n", " sns.distplot(weight_matrix[:,i])\n", " ax.set_xlabel(\"Weight\")\n", " ax.set_ylabel(\"Number of genes at weight\")\n", " plt.show()\n", + "\n", "plot_feature_weight_distributions(100, weight_matrix)" ] }, @@ -759,9 +784,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Like the weight distribution of an ADAGE/eADAGE feature, an NMF feature is approximately normally distributed.\n", - "Because of this, the gene signature rule we use can be the same as the one used in the ADAGE/eADAGE case\n", - "(see: [`constants/gene_signature_definitions.py`](https://github.com/kathyxchen/PathCORE-T-analysis/blob/master/constants/gene_signature_definitions.py)).\n", + "Like the weight distribution of an ADAGE/eADAGE feature, an ICA feature is approximately normally distributed.\n", + "Because of this, the gene signature rule we use can be the same as the one used in the ADAGE/eADAGE case.\n", + "\n", + "(see: [`constants/gene_signature_definitions.py`](https://github.com/kathyxchen/PathCORE-T-analysis/blob/master/constants/gene_signature_definitions.py))\n", "\n", "This gene signature must be defined as a partial function and passed in as a parameter to the `pathcore.pathway_enrichment_with_overlap_correction` method." ] @@ -775,6 +801,25 @@ "outputs": [], "source": [ "def define_FastICA_gene_signature(std=2.5):\n", + " \"\"\"This method returns a partial function\n", + " that, when applied to a feature's gene weights,\n", + " outputs the feature's gene signature.\n", + " \n", + " Parameters\n", + " ----------\n", + " std : int\n", + " Based on how the weights are distributed in\n", + " the model's features, specify a standard\n", + " deviation for the weight cutoff. \n", + " \n", + " Returns\n", + " -------\n", + " functools.partial\n", + " The partial function should have a return type\n", + " of tup(set, set). One of the sets can be None\n", + " if only one gene signature needs to be specified\n", + " for a feature.\n", + " \"\"\"\n", " def _gene_signature(feature_weight_vector, std):\n", " mean = feature_weight_vector.mean()\n", " cutoff = std * feature_weight_vector.std()\n", @@ -799,7 +844,7 @@ "output_type": "stream", "text": [ "Example of a key-value pair in the `pathway_definitions_map` dict:\n", - "('KEGG-Pathway-pae00072: Synthesis and degradation of ketone bodies - Pseudomonas aeruginosa PAO1', {'PA2003', 'PA3925', 'PA1736', 'PA1999', 'PA2011', 'PA4785', 'PA3589', 'PA2000', 'PA2001', 'PA2553'})\n" + "('KEGG-Pathway-pae00072: Synthesis and degradation of ketone bodies - Pseudomonas aeruginosa PAO1', {'PA1999', 'PA3925', 'PA2553', 'PA3589', 'PA1736', 'PA2001', 'PA2000', 'PA4785', 'PA2011', 'PA2003'})\n" ] } ], @@ -811,8 +856,7 @@ " lambda x: x.split(\";\"))\n", "pathway_definitions_df.set_index(\"pw\", inplace=True)\n", "\n", - "# create a pathway definitions map (key: pathway name, value: set of gene names)\n", - "# from the dataframe.\n", + "# create a pathway definitions map\n", "pathway_definitions_map = {}\n", "for index, row in pathway_definitions_df.iterrows():\n", " pathway_definitions_map[index] = set(row[\"genes\"])\n", @@ -827,11 +871,12 @@ "source": [ "### Define a helper function for running the PathCORE-T analysis workflow\n", "The method `get_pathways_overrepresented_in_features` is a helper function\n", - "that calls the [`pathway_enrichment_with_overlap_correction`](https://github.com/greenelab/PathCORE-T/blob/master/pathcore/feature_pathway_overrepresentation.py#L15) method provided in the [pathcore](https://github.com/greenelab/PathCORE-T) package.\n", + "that calls the [`pathway_enrichment_with_overlap_correction`](https://github.com/greenelab/PathCORE-T/blob/master/pathcore/feature_pathway_overrepresentation.py#L15)\n", + "method provided in the [pathcore](https://github.com/greenelab/PathCORE-T) package.\n", "\n", - "It applies [`pathway_enrichment_with_overlap_correction`](https://github.com/greenelab/PathCORE-T/blob/master/pathcore/feature_pathway_overrepresentation.py#L15) to every feature in the weight matrix and creates\n", - "a pandas.DataFrame of the pathways overrepresented across the entire model (weight matrix of features)\n", - "constructed by FastICA on the compendium. " + "It applies [`pathway_enrichment_with_overlap_correction`](https://github.com/greenelab/PathCORE-T/blob/master/pathcore/feature_pathway_overrepresentation.py#L15) to every feature in the weight matrix\n", + "and creates a pandas.DataFrame of the pathways overrepresented across the entire model\n", + "(weight matrix of features) constructed by FastICA on the compendium. " ] }, { @@ -842,15 +887,16 @@ }, "outputs": [], "source": [ - "def get_pathways_overrepresented_in_features(current_weight_matrix, pathway_definitions,\n", + "def get_pathways_overrepresented_in_features(current_weight_matrix,\n", + " pathway_definitions,\n", " partial_function_signature,\n", - " alpha=0.05, correct_all_genes=True,\n", + " alpha=0.05,\n", + " correct_all_genes=True,\n", " metadata=False):\n", " \"\"\"\n", " This method is a simplification of the method already provided in the\n", " PathCORE-T-analysis repository.\n", - " See documentation:\n", - " https://github.com/greenelab/PathCORE-T-analysis/blob/master/run_network_creation.py#L155\n", + " See documentation in `run_network_creation.py`, line 155\n", " \n", " Modifications:\n", " * Removed the `overlap_correction` parameter for this example\n", @@ -858,7 +904,7 @@ " * `current_weight_matrix` is just a pandas.DataFrame rather\n", " than a tuple of a filename and a pandas.DataFrame\n", "\n", - " We kept some of the parameters (alpha, correct_all_genes, metadata)\n", + " We kept some of the parameters (`alpha`, `correct_all_genes`, `metadata`)\n", " so that users interested in running the notebook themselves\n", " could examine differences in results that occurs with parameter\n", " changes and/or view the metadata that accompanies this analysis.\n", @@ -869,9 +915,11 @@ " for feature in current_weight_matrix:\n", " feature_df, additional = \\\n", " pathway_enrichment_with_overlap_correction(\n", - " current_weight_matrix[feature], pathway_definitions,\n", + " current_weight_matrix[feature],\n", + " pathway_definitions,\n", " partial_function_signature,\n", - " alpha=alpha, correct_all_genes=correct_all_genes,\n", + " alpha=alpha,\n", + " correct_all_genes=correct_all_genes,\n", " metadata=metadata)\n", " if feature_df is not None:\n", " feature_df.loc[:, \"feature\"] = pd.Series(\n", @@ -896,12 +944,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Note**: We have not implemented logging for the overlap correction step yet. \n", + "**Note**: We have not implemented logging for the overlap correction step. \n", + "\n", "The print output from calling `get_pathways_overrepresented_in_features` reports that\n", "an approximation step is taking place in overlap correction\n", - "because numpy is reporting a FloatingPointError when dividing by near-zero probabilities.\n", - "\n", - "[An issue has been created](https://github.com/kathyxchen/crosstalk-correction/issues/2) in the overlap correction (crosstalk correction) repository to address this at a later time." + "because numpy is reporting a FloatingPointError when dividing by near-zero probabilities." ] }, { @@ -976,15 +1023,16 @@ "108 adjustments made to a vector of length 186 containing the raw weight values in a call to 'update_probabilities'\n", "128 adjustments made to a vector of length 186 containing the raw weight values in a call to 'update_probabilities'\n", "133 adjustments made to a vector of length 186 containing the raw weight values in a call to 'update_probabilities'\n", - "CPU times: user 1min 12s, sys: 488 ms, total: 1min 13s\n", - "Wall time: 1min 14s\n" + "CPU times: user 1min 9s, sys: 601 ms, total: 1min 9s\n", + "Wall time: 1min 12s\n" ] } ], "source": [ "%%time\n", "feature_significant_pathways_info = get_pathways_overrepresented_in_features(\n", - " weight_matrix_df, pathway_definitions_map,\n", + " weight_matrix_df,\n", + " pathway_definitions_map,\n", " define_FastICA_gene_signature(gene_signature_std))" ] }, @@ -1015,7 +1063,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`significant_pathways` is a DataFrame that reports on the pathways significant in each of the NMF features." + "`significant_pathways` is a DataFrame that reports on the pathways significant in each of the ICA features." ] }, { @@ -1062,10 +1110,10 @@ " \n", " \n", " 1\n", - " 1.598473e-04\n", + " 4.652635e-20\n", " pos\n", - " 1.982107e-02\n", - " KEGG-Pathway-pae00520: Amino sugar and nucleot...\n", + " 1.730780e-17\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " 0.0\n", " \n", " \n", @@ -1078,18 +1126,18 @@ " \n", " \n", " 3\n", - " 4.652635e-20\n", + " 1.598473e-04\n", " pos\n", - " 1.730780e-17\n", - " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " 1.982107e-02\n", + " KEGG-Pathway-pae00520: Amino sugar and nucleot...\n", " 0.0\n", " \n", " \n", " 4\n", - " 1.454534e-04\n", + " 2.110037e-13\n", " neg\n", - " 1.082174e-02\n", - " KEGG-Pathway-pae02040: Flagellar assembly - Ps...\n", + " 3.924668e-11\n", + " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", " 1.0\n", " \n", " \n", @@ -1099,17 +1147,17 @@ "text/plain": [ " p-value side q-value \\\n", "0 3.487335e-06 pos 6.486444e-04 \n", - "1 1.598473e-04 pos 1.982107e-02 \n", + "1 4.652635e-20 pos 1.730780e-17 \n", "2 3.259411e-04 pos 3.031252e-02 \n", - "3 4.652635e-20 pos 1.730780e-17 \n", - "4 1.454534e-04 neg 1.082174e-02 \n", + "3 1.598473e-04 pos 1.982107e-02 \n", + "4 2.110037e-13 neg 3.924668e-11 \n", "\n", " pathway feature \n", "0 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... 0.0 \n", - "1 KEGG-Pathway-pae00520: Amino sugar and nucleot... 0.0 \n", + "1 KEGG-Pathway-pae00280: Valine, leucine and iso... 0.0 \n", "2 KEGG-Module-M00334: Type VI secretion system 0.0 \n", - "3 KEGG-Pathway-pae00280: Valine, leucine and iso... 0.0 \n", - "4 KEGG-Pathway-pae02040: Flagellar assembly - Ps... 1.0 " + "3 KEGG-Pathway-pae00520: Amino sugar and nucleot... 0.0 \n", + "4 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... 1.0 " ] }, "execution_count": 15, @@ -1150,9 +1198,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "The pathway co-occurrence network contains 91 pathways.\n", - "Number of edges in the network: 393\n", - "Number of edges with a weight value above 1 (i.e. the pathway-pathway relationship appears in more than one feature): 112\n" + "The pathway co-occurrence network contains 90 pathways.\n", + "Number of edges in the network: 411\n", + "Number of edges with a weight value above 1 (i.e. the pathway-pathway relationship appears in more than one feature): 108\n" ] }, { @@ -1184,14 +1232,14 @@ " \n", " \n", " \n", - " 11\n", + " 8\n", " KEGG-Module-M00178: Ribosome, bacteria\n", " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", - " 23\n", - " 1.0 14.0 49.0 56.0 65.0 66.0 118.0 119.0 120.0...\n", + " 21\n", + " 1.0 49.0 56.0 65.0 66.0 118.0 119.0 120.0 127....\n", " \n", " \n", - " 2\n", + " 0\n", " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " 10\n", @@ -1205,18 +1253,18 @@ " 0.0 30.0 36.0 60.0 101.0 114.0 156.0 187.0 196...\n", " \n", " \n", - " 13\n", - " KEGG-Module-M00178: Ribosome, bacteria\n", + " 9\n", " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", + " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", " 9\n", - " 1.0 49.0 119.0 127.0 146.0 214.0 243.0 266.0 2...\n", + " 1.0 49.0 65.0 119.0 127.0 146.0 214.0 243.0 266.0\n", " \n", " \n", - " 139\n", - " KEGG-Pathway-pae00190: Oxidative phosphorylati...\n", - " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", + " 123\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", " 9\n", - " 56.0 66.0 118.0 140.0 146.0 194.0 277.0 285.0 ...\n", + " 51.0 73.0 104.0 112.0 121.0 163.0 232.0 240.0 ...\n", " \n", " \n", "\n", @@ -1224,25 +1272,25 @@ ], "text/plain": [ " pw0 \\\n", - "11 KEGG-Module-M00178: Ribosome, bacteria \n", - "2 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "8 KEGG-Module-M00178: Ribosome, bacteria \n", + "0 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", "1 KEGG-Module-M00334: Type VI secretion system \n", - "13 KEGG-Module-M00178: Ribosome, bacteria \n", - "139 KEGG-Pathway-pae00190: Oxidative phosphorylati... \n", + "9 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", + "123 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", "\n", " pw1 weight \\\n", - "11 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... 23 \n", - "2 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... 10 \n", + "8 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... 21 \n", + "0 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... 10 \n", "1 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... 10 \n", - "13 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... 9 \n", - "139 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... 9 \n", + "9 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... 9 \n", + "123 KEGG-Pathway-pae00627: Aminobenzoate degradati... 9 \n", "\n", " features \n", - "11 1.0 14.0 49.0 56.0 65.0 66.0 118.0 119.0 120.0... \n", - "2 0.0 47.0 51.0 111.0 112.0 187.0 192.0 196.0 23... \n", + "8 1.0 49.0 56.0 65.0 66.0 118.0 119.0 120.0 127.... \n", + "0 0.0 47.0 51.0 111.0 112.0 187.0 192.0 196.0 23... \n", "1 0.0 30.0 36.0 60.0 101.0 114.0 156.0 187.0 196... \n", - "13 1.0 49.0 119.0 127.0 146.0 214.0 243.0 266.0 2... \n", - "139 56.0 66.0 118.0 140.0 146.0 194.0 277.0 285.0 ... " + "9 1.0 49.0 65.0 119.0 127.0 146.0 214.0 243.0 266.0 \n", + "123 51.0 73.0 104.0 112.0 121.0 163.0 232.0 240.0 ... " ] }, "execution_count": 17, @@ -1252,7 +1300,8 @@ ], "source": [ "model_network_df = model_network.to_dataframe()\n", - "print(\"Number of edges in the network: {0}\".format(len(model_network_df)))\n", + "print(\"Number of edges in the network: {0}\".format(\n", + " len(model_network_df)))\n", "\n", "edges_above_one = model_network_df[model_network_df.weight > 1]\n", "print(\"Number of edges with a weight value above 1 \"\n", @@ -1267,9 +1316,12 @@ "metadata": {}, "source": [ "### PathCORE-T permutation test (based on [this script](https://github.com/greenelab/PathCORE-T-analysis/blob/master/run_permutation_test.py#L146))\n", - "The permutation test is used to evaluate whether each edge observed in the network (`model_network_df`) at a given weight occurs more than we would expect by chance. By generating `n_permutations` (see cell [4]) of null networks, we can determine the null edge weight distribution of each observed edge. Edges that are insignificant under the null distribution are discarded from the network. \n", + "The permutation test is used to evaluate whether each edge observed in the network (`model_network_df`) at a given weight occurs more than we would expect by chance.\n", + "By generating `n_permutations` (see cell [4]) of null networks, we can determine the null edge weight distribution of each observed edge.\n", + "Edges that are insignificant under the null distribution are discarded from the network. \n", "\n", - "Significance is determined by collecting the p-values of every observed edge and applying a false discovery rate correction (Benjamini--Hochberg) to that list of p-values. Edges with a q-value below the specified alpha (`permutation_test_alpha` in cell [4]) are significant." + "Significance is determined by collecting the p-values of every observed edge and applying a false discovery rate correction (Benjamini--Hochberg) to that list of p-values.\n", + "Edges with a q-value below the specified alpha (`permutation_test_alpha` in cell [4]) are significant." ] }, { @@ -1281,8 +1333,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 56.2 s, sys: 514 ms, total: 56.7 s\n", - "Wall time: 58 s\n" + "CPU times: user 54.5 s, sys: 567 ms, total: 55 s\n", + "Wall time: 56.8 s\n" ] } ], @@ -1306,7 +1358,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "64 edges are significant under the null distribution, generated from 1000 permutations, for alpha = 0.05.\n" + "60 edges are significant under the null distribution, generated from 1000 permutations, for alpha = 0.05.\n" ] } ], @@ -1320,7 +1372,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Edges in the network after the permutation test are weighted by their **odds ratios**. The odds ratio is computed by dividing the observed edge weight by the expected edge weight (the average of its non-zero edge weight distribution). If the observed edge does not show up in any of the permuted networks, divide by 1 (no change)." + "Edges in the network after the permutation test are weighted by their **odds ratios**.\n", + "The odds ratio is computed by dividing the observed edge weight by the expected edge weight (the average of its non-zero edge weight distribution).\n", + "If the observed edge does not show up in any of the permuted networks, divide by 1 (no change)." ] }, { @@ -1357,438 +1411,430 @@ " \n", " \n", " 0\n", - " 4.701705\n", - " KEGG-Module-M00334: Type VI secretion system\n", + " 3.298083\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " \n", " \n", " 1\n", - " 3.211068\n", - " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " 4.622554\n", + " KEGG-Module-M00334: Type VI secretion system\n", " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " \n", " \n", " 2\n", - " 3.151659\n", + " 3.210784\n", " KEGG-Module-M00334: Type VI secretion system\n", " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " \n", " \n", " 3\n", - " 6.614958\n", - " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", + " 6.083333\n", + " KEGG-Module-M00009: Citrate cycle (TCA cycle, ...\n", " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", " \n", " \n", " 4\n", - " 15.144718\n", + " 13.937360\n", " KEGG-Module-M00178: Ribosome, bacteria\n", " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", " \n", " \n", " 5\n", - " 5.657264\n", - " KEGG-Module-M00009: Citrate cycle (TCA cycle, ...\n", + " 6.984479\n", + " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", " \n", " \n", " 6\n", - " 6.711864\n", + " 7.092105\n", + " KEGG-Module-M00009: Citrate cycle (TCA cycle, ...\n", " KEGG-Module-M00178: Ribosome, bacteria\n", - " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", " \n", " \n", " 7\n", - " 6.059917\n", + " 6.445910\n", " KEGG-Module-M00009: Citrate cycle (TCA cycle, ...\n", " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", " \n", " \n", " 8\n", - " 6.061103\n", - " KEGG-Module-M00009: Citrate cycle (TCA cycle, ...\n", + " 6.941584\n", " KEGG-Module-M00178: Ribosome, bacteria\n", + " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", " \n", " \n", " 9\n", - " 1.000000\n", - " KEGG-Module-M00721: Cationic antimicrobial pep...\n", - " KEGG-Pathway-pae01212: Fatty acid metabolism -...\n", + " 2.858824\n", + " KEGG-Module-M00242: Zinc transport system\n", + " KEGG-Pathway-pae01053: Biosynthesis of siderop...\n", " \n", " \n", " 10\n", - " 3.474843\n", - " KEGG-Pathway-pae00020: Citrate cycle (TCA cycl...\n", - " KEGG-Pathway-pae00190: Oxidative phosphorylati...\n", + " 2.742647\n", + " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", + " KEGG-Pathway-pae00910: Nitrogen metabolism - P...\n", " \n", " \n", " 11\n", - " 2.934307\n", - " KEGG-Module-M00242: Zinc transport system\n", - " KEGG-Pathway-pae01053: Biosynthesis of siderop...\n", + " 2.847059\n", + " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", + " KEGG-Pathway-pae00460: Cyanoamino acid metabol...\n", " \n", " \n", " 12\n", - " 3.204678\n", - " KEGG-Module-M00334: Type VI secretion system\n", - " KEGG-Pathway-pae00910: Nitrogen metabolism - P...\n", + " 5.080439\n", + " KEGG-Module-M00644: Vanadium resistance, efflu...\n", + " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " \n", " \n", " 13\n", - " 2.935345\n", - " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", - " KEGG-Pathway-pae00460: Cyanoamino acid metabol...\n", + " 2.000000\n", + " KEGG-Module-M00156: Cytochrome c oxidase, cbb3...\n", + " KEGG-Pathway-pae00220: Arginine biosynthesis -...\n", " \n", " \n", " 14\n", - " 2.522508\n", - " KEGG-Module-M00334: Type VI secretion system\n", - " KEGG-Pathway-pae00640: Propanoate metabolism -...\n", + " 1.933775\n", + " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", + " KEGG-Pathway-pae03070: Bacterial secretion sys...\n", " \n", " \n", " 15\n", - " 5.039251\n", - " KEGG-Module-M00644: Vanadium resistance, efflu...\n", + " 3.506390\n", + " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " \n", " \n", " 16\n", - " 3.570840\n", - " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", + " 3.942839\n", + " KEGG-Pathway-pae00460: Cyanoamino acid metabol...\n", " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " \n", " \n", " 17\n", - " 4.018605\n", - " KEGG-Pathway-pae00460: Cyanoamino acid metabol...\n", - " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", + " 1.977901\n", + " KEGG-Pathway-pae00350: Tyrosine metabolism - P...\n", + " KEGG-Pathway-pae00630: Glyoxylate and dicarbox...\n", " \n", " \n", " 18\n", - " 1.000000\n", - " KEGG-Module-M00156: Cytochrome c oxidase, cbb3...\n", - " KEGG-Pathway-pae00460: Cyanoamino acid metabol...\n", + " 2.931034\n", + " KEGG-Module-M00222: Phosphate transport system\n", + " KEGG-Module-M00223: Phosphonate transport system\n", " \n", " \n", " 19\n", - " 1.952381\n", - " KEGG-Pathway-pae00350: Tyrosine metabolism - P...\n", - " KEGG-Pathway-pae00630: Glyoxylate and dicarbox...\n", + " 4.969925\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", " \n", " \n", " 20\n", - " 1.929825\n", - " KEGG-Module-M00157: F-type ATPase, prokaryotes...\n", - " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", + " 6.007212\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", " \n", " \n", " 21\n", - " 4.628959\n", - " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", - " KEGG-Pathway-pae00405: Phenazine biosynthesis ...\n", + " 2.832061\n", + " KEGG-Module-M00644: Vanadium resistance, efflu...\n", + " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", " \n", " \n", " 22\n", - " 2.712531\n", - " KEGG-Module-M00644: Vanadium resistance, efflu...\n", - " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", + " 5.378837\n", + " KEGG-Pathway-pae00190: Oxidative phosphorylati...\n", + " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", " \n", " \n", " 23\n", - " 5.842825\n", - " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", - " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", + " 4.503772\n", + " KEGG-Module-M00178: Ribosome, bacteria\n", + " KEGG-Pathway-pae00190: Oxidative phosphorylati...\n", " \n", " \n", " 24\n", - " 2.962963\n", - " KEGG-Module-M00222: Phosphate transport system\n", - " KEGG-Module-M00223: Phosphonate transport system\n", + " 3.755319\n", + " KEGG-Module-M00328: Hemophore/metalloprotease ...\n", + " KEGG-Pathway-pae01053: Biosynthesis of siderop...\n", " \n", " \n", " 25\n", - " 5.247273\n", - " KEGG-Pathway-pae00190: Oxidative phosphorylati...\n", - " KEGG-Pathway-pae03010: Ribosome - Pseudomonas ...\n", + " 3.851429\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " KEGG-Pathway-pae00340: Histidine metabolism - ...\n", " \n", " \n", " 26\n", - " 4.603593\n", - " KEGG-Module-M00178: Ribosome, bacteria\n", - " KEGG-Pathway-pae00190: Oxidative phosphorylati...\n", + " 3.863415\n", + " KEGG-Pathway-pae00340: Histidine metabolism - ...\n", + " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", " \n", " \n", " 27\n", - " 3.667482\n", - " KEGG-Module-M00328: Hemophore/metalloprotease ...\n", - " KEGG-Pathway-pae01053: Biosynthesis of siderop...\n", + " 3.000000\n", + " KEGG-Pathway-pae00340: Histidine metabolism - ...\n", + " KEGG-Pathway-pae00362: Benzoate degradation - ...\n", " \n", " \n", " 28\n", - " 4.438944\n", + " 4.546279\n", " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " KEGG-Pathway-pae00362: Benzoate degradation - ...\n", " \n", " \n", " 29\n", - " 3.846154\n", - " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", - " KEGG-Pathway-pae00340: Histidine metabolism - ...\n", + " 5.793103\n", + " KEGG-Pathway-pae00362: Benzoate degradation - ...\n", + " KEGG-Pathway-pae00627: Aminobenzoate degradati...\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " 30\n", + " 4.159420\n", + " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", + " KEGG-Pathway-pae00640: Propanoate metabolism -...\n", " \n", " \n", - " 34\n", - " 2.832563\n", + " 31\n", + " 2.752243\n", " KEGG-Pathway-pae02024: Quorum sensing - Pseudo...\n", " KEGG-Pathway-pae02040: Flagellar assembly - Ps...\n", " \n", " \n", - " 35\n", - " 2.939394\n", + " 32\n", + " 2.970297\n", " KEGG-Module-M00222: Phosphate transport system\n", " KEGG-Pathway-pae00440: Phosphonate and phosphi...\n", " \n", " \n", - " 36\n", - " 3.335263\n", + " 33\n", + " 3.450815\n", " KEGG-Pathway-pae00520: Amino sugar and nucleot...\n", " KEGG-Pathway-pae02040: Flagellar assembly - Ps...\n", " \n", " \n", - " 37\n", - " 2.000000\n", - " KEGG-Module-M00208: Glycine betaine/proline tr...\n", - " KEGG-Pathway-pae00680: Methane metabolism - Ps...\n", - " \n", - " \n", - " 38\n", + " 34\n", " 3.000000\n", " KEGG-Module-M00208: Glycine betaine/proline tr...\n", " KEGG-Pathway-pae00260: Glycine, serine and thr...\n", " \n", " \n", - " 39\n", - " 3.000000\n", + " 35\n", + " 2.000000\n", + " KEGG-Module-M00709: Macrolide resistance, MacA...\n", " KEGG-Pathway-pae00260: Glycine, serine and thr...\n", - " KEGG-Pathway-pae00680: Methane metabolism - Ps...\n", " \n", " \n", - " 40\n", - " 1.973333\n", + " 36\n", + " 1.916667\n", " KEGG-Module-M00242: Zinc transport system\n", " KEGG-Pathway-pae00260: Glycine, serine and thr...\n", " \n", " \n", - " 41\n", + " 37\n", " 2.000000\n", " KEGG-Module-M00242: Zinc transport system\n", " KEGG-Module-M00709: Macrolide resistance, MacA...\n", " \n", " \n", - " 42\n", - " 2.000000\n", - " KEGG-Module-M00709: Macrolide resistance, MacA...\n", - " KEGG-Pathway-pae00260: Glycine, serine and thr...\n", - " \n", - " \n", - " 43\n", + " 38\n", " 2.000000\n", " KEGG-Pathway-pae00910: Nitrogen metabolism - P...\n", " KEGG-Pathway-pae04122: Sulfur relay system - P...\n", " \n", " \n", - " 44\n", + " 39\n", + " 1.925134\n", + " KEGG-Pathway-pae00030: Pentose phosphate pathw...\n", + " KEGG-Pathway-pae00920: Sulfur metabolism - Pse...\n", + " \n", + " \n", + " 40\n", " 2.000000\n", " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " KEGG-Pathway-pae01501: beta-Lactam resistance ...\n", " \n", " \n", - " 45\n", + " 41\n", " 1.000000\n", " KEGG-Pathway-pae00625: Chloroalkane and chloro...\n", " KEGG-Pathway-pae01501: beta-Lactam resistance ...\n", " \n", " \n", - " 46\n", - " 1.974359\n", + " 42\n", + " 1.939024\n", " KEGG-Pathway-pae00630: Glyoxylate and dicarbox...\n", " KEGG-Pathway-pae00640: Propanoate metabolism -...\n", " \n", " \n", - " 47\n", - " 3.414781\n", + " 43\n", + " 2.580101\n", " KEGG-Module-M00324: Dipeptide transport system\n", " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " \n", " \n", - " 48\n", - " 1.936255\n", + " 44\n", + " 1.968872\n", " KEGG-Pathway-pae00280: Valine, leucine and iso...\n", " KEGG-Pathway-pae00643: Styrene degradation - P...\n", " \n", " \n", - " 49\n", + " 45\n", " 2.000000\n", " KEGG-Module-M00324: Dipeptide transport system\n", " KEGG-Pathway-pae00643: Styrene degradation - P...\n", " \n", " \n", - " 50\n", - " 2.700000\n", + " 46\n", + " 1.951807\n", + " KEGG-Pathway-pae00260: Glycine, serine and thr...\n", + " KEGG-Pathway-pae00680: Methane metabolism - Ps...\n", + " \n", + " \n", + " 47\n", + " 2.727862\n", " KEGG-Module-M00324: Dipeptide transport system\n", " KEGG-Module-M00334: Type VI secretion system\n", " \n", " \n", - " 51\n", + " 48\n", " 2.000000\n", " KEGG-Module-M00188: NitT/TauT family transport...\n", " KEGG-Pathway-pae00920: Sulfur metabolism - Pse...\n", " \n", " \n", - " 52\n", + " 49\n", " 1.000000\n", " KEGG-Module-M00188: NitT/TauT family transport...\n", " KEGG-Pathway-pae00550: Peptidoglycan biosynthe...\n", " \n", " \n", - " 53\n", - " 1.960784\n", - " KEGG-Pathway-pae00440: Phosphonate and phosphi...\n", - " KEGG-Pathway-pae00564: Glycerophospholipid met...\n", - " \n", - " \n", - " 54\n", + " 50\n", " 2.000000\n", " KEGG-Module-M00223: Phosphonate transport system\n", " KEGG-Pathway-pae00564: Glycerophospholipid met...\n", " \n", " \n", - " 55\n", - " 2.000000\n", + " 51\n", + " 1.965517\n", " KEGG-Module-M00331: Type II general secretion ...\n", " KEGG-Pathway-pae00564: Glycerophospholipid met...\n", " \n", " \n", - " 56\n", - " 1.928571\n", - " KEGG-Module-M00223: Phosphonate transport system\n", + " 52\n", + " 1.956522\n", " KEGG-Pathway-pae00440: Phosphonate and phosphi...\n", + " KEGG-Pathway-pae00564: Glycerophospholipid met...\n", " \n", " \n", - " 57\n", - " 1.921569\n", + " 53\n", + " 1.928571\n", + " KEGG-Module-M00223: Phosphonate transport system\n", " KEGG-Module-M00331: Type II general secretion ...\n", - " KEGG-Pathway-pae00440: Phosphonate and phosphi...\n", " \n", " \n", - " 58\n", - " 1.913043\n", + " 54\n", + " 1.981982\n", " KEGG-Module-M00223: Phosphonate transport system\n", + " KEGG-Pathway-pae00440: Phosphonate and phosphi...\n", + " \n", + " \n", + " 55\n", + " 2.976562\n", " KEGG-Module-M00331: Type II general secretion ...\n", + " KEGG-Pathway-pae00440: Phosphonate and phosphi...\n", " \n", " \n", - " 59\n", - " 1.959732\n", + " 56\n", + " 1.971429\n", " KEGG-Pathway-pae00030: Pentose phosphate pathw...\n", " KEGG-Pathway-pae01210: 2-Oxocarboxylic acid me...\n", " \n", " \n", - " 60\n", - " 2.947977\n", + " 57\n", + " 1.975309\n", " KEGG-Module-M00324: Dipeptide transport system\n", " KEGG-Pathway-pae00640: Propanoate metabolism -...\n", " \n", " \n", - " 61\n", - " 3.913043\n", + " 58\n", + " 3.963636\n", " KEGG-Module-M00236: Putative polar amino acid ...\n", " KEGG-Pathway-pae00920: Sulfur metabolism - Pse...\n", " \n", " \n", - " 62\n", - " 1.000000\n", - " KEGG-Pathway-pae00450: Selenocompound metaboli...\n", - " KEGG-Pathway-pae00860: Porphyrin and chlorophy...\n", - " \n", - " \n", - " 63\n", + " 59\n", " 1.000000\n", - " KEGG-Module-M00188: NitT/TauT family transport...\n", - " KEGG-Module-M00238: D-Methionine transport system\n", + " KEGG-Pathway-pae00780: Biotin metabolism - Pse...\n", + " KEGG-Pathway-pae01212: Fatty acid metabolism -...\n", " \n", " \n", "\n", - "

64 rows × 3 columns

\n", "" ], "text/plain": [ " odds ratio pw0 \\\n", - "0 4.701705 KEGG-Module-M00334: Type VI secretion system \n", - "1 3.211068 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "2 3.151659 KEGG-Module-M00334: Type VI secretion system \n", - "3 6.614958 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", - "4 15.144718 KEGG-Module-M00178: Ribosome, bacteria \n", - "5 5.657264 KEGG-Module-M00009: Citrate cycle (TCA cycle, ... \n", - "6 6.711864 KEGG-Module-M00178: Ribosome, bacteria \n", - "7 6.059917 KEGG-Module-M00009: Citrate cycle (TCA cycle, ... \n", - "8 6.061103 KEGG-Module-M00009: Citrate cycle (TCA cycle, ... \n", - "9 1.000000 KEGG-Module-M00721: Cationic antimicrobial pep... \n", - "10 3.474843 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", - "11 2.934307 KEGG-Module-M00242: Zinc transport system \n", - "12 3.204678 KEGG-Module-M00334: Type VI secretion system \n", - "13 2.935345 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", - "14 2.522508 KEGG-Module-M00334: Type VI secretion system \n", - "15 5.039251 KEGG-Module-M00644: Vanadium resistance, efflu... \n", - "16 3.570840 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", - "17 4.018605 KEGG-Pathway-pae00460: Cyanoamino acid metabol... \n", - "18 1.000000 KEGG-Module-M00156: Cytochrome c oxidase, cbb3... \n", - "19 1.952381 KEGG-Pathway-pae00350: Tyrosine metabolism - P... \n", - "20 1.929825 KEGG-Module-M00157: F-type ATPase, prokaryotes... \n", - "21 4.628959 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "22 2.712531 KEGG-Module-M00644: Vanadium resistance, efflu... \n", - "23 5.842825 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "24 2.962963 KEGG-Module-M00222: Phosphate transport system \n", - "25 5.247273 KEGG-Pathway-pae00190: Oxidative phosphorylati... \n", - "26 4.603593 KEGG-Module-M00178: Ribosome, bacteria \n", - "27 3.667482 KEGG-Module-M00328: Hemophore/metalloprotease ... \n", - "28 4.438944 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "29 3.846154 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - ".. ... ... \n", - "34 2.832563 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", - "35 2.939394 KEGG-Module-M00222: Phosphate transport system \n", - "36 3.335263 KEGG-Pathway-pae00520: Amino sugar and nucleot... \n", - "37 2.000000 KEGG-Module-M00208: Glycine betaine/proline tr... \n", - "38 3.000000 KEGG-Module-M00208: Glycine betaine/proline tr... \n", - "39 3.000000 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", - "40 1.973333 KEGG-Module-M00242: Zinc transport system \n", - "41 2.000000 KEGG-Module-M00242: Zinc transport system \n", - "42 2.000000 KEGG-Module-M00709: Macrolide resistance, MacA... \n", - "43 2.000000 KEGG-Pathway-pae00910: Nitrogen metabolism - P... \n", - "44 2.000000 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "45 1.000000 KEGG-Pathway-pae00625: Chloroalkane and chloro... \n", - "46 1.974359 KEGG-Pathway-pae00630: Glyoxylate and dicarbox... \n", - "47 3.414781 KEGG-Module-M00324: Dipeptide transport system \n", - "48 1.936255 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "49 2.000000 KEGG-Module-M00324: Dipeptide transport system \n", - "50 2.700000 KEGG-Module-M00324: Dipeptide transport system \n", - "51 2.000000 KEGG-Module-M00188: NitT/TauT family transport... \n", - "52 1.000000 KEGG-Module-M00188: NitT/TauT family transport... \n", - "53 1.960784 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", - "54 2.000000 KEGG-Module-M00223: Phosphonate transport system \n", - "55 2.000000 KEGG-Module-M00331: Type II general secretion ... \n", - "56 1.928571 KEGG-Module-M00223: Phosphonate transport system \n", - "57 1.921569 KEGG-Module-M00331: Type II general secretion ... \n", - "58 1.913043 KEGG-Module-M00223: Phosphonate transport system \n", - "59 1.959732 KEGG-Pathway-pae00030: Pentose phosphate pathw... \n", - "60 2.947977 KEGG-Module-M00324: Dipeptide transport system \n", - "61 3.913043 KEGG-Module-M00236: Putative polar amino acid ... \n", - "62 1.000000 KEGG-Pathway-pae00450: Selenocompound metaboli... \n", - "63 1.000000 KEGG-Module-M00188: NitT/TauT family transport... \n", + "0 3.298083 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "1 4.622554 KEGG-Module-M00334: Type VI secretion system \n", + "2 3.210784 KEGG-Module-M00334: Type VI secretion system \n", + "3 6.083333 KEGG-Module-M00009: Citrate cycle (TCA cycle, ... \n", + "4 13.937360 KEGG-Module-M00178: Ribosome, bacteria \n", + "5 6.984479 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", + "6 7.092105 KEGG-Module-M00009: Citrate cycle (TCA cycle, ... \n", + "7 6.445910 KEGG-Module-M00009: Citrate cycle (TCA cycle, ... \n", + "8 6.941584 KEGG-Module-M00178: Ribosome, bacteria \n", + "9 2.858824 KEGG-Module-M00242: Zinc transport system \n", + "10 2.742647 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", + "11 2.847059 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", + "12 5.080439 KEGG-Module-M00644: Vanadium resistance, efflu... \n", + "13 2.000000 KEGG-Module-M00156: Cytochrome c oxidase, cbb3... \n", + "14 1.933775 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", + "15 3.506390 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", + "16 3.942839 KEGG-Pathway-pae00460: Cyanoamino acid metabol... \n", + "17 1.977901 KEGG-Pathway-pae00350: Tyrosine metabolism - P... \n", + "18 2.931034 KEGG-Module-M00222: Phosphate transport system \n", + "19 4.969925 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "20 6.007212 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "21 2.832061 KEGG-Module-M00644: Vanadium resistance, efflu... \n", + "22 5.378837 KEGG-Pathway-pae00190: Oxidative phosphorylati... \n", + "23 4.503772 KEGG-Module-M00178: Ribosome, bacteria \n", + "24 3.755319 KEGG-Module-M00328: Hemophore/metalloprotease ... \n", + "25 3.851429 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "26 3.863415 KEGG-Pathway-pae00340: Histidine metabolism - ... \n", + "27 3.000000 KEGG-Pathway-pae00340: Histidine metabolism - ... \n", + "28 4.546279 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "29 5.793103 KEGG-Pathway-pae00362: Benzoate degradation - ... \n", + "30 4.159420 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "31 2.752243 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", + "32 2.970297 KEGG-Module-M00222: Phosphate transport system \n", + "33 3.450815 KEGG-Pathway-pae00520: Amino sugar and nucleot... \n", + "34 3.000000 KEGG-Module-M00208: Glycine betaine/proline tr... \n", + "35 2.000000 KEGG-Module-M00709: Macrolide resistance, MacA... \n", + "36 1.916667 KEGG-Module-M00242: Zinc transport system \n", + "37 2.000000 KEGG-Module-M00242: Zinc transport system \n", + "38 2.000000 KEGG-Pathway-pae00910: Nitrogen metabolism - P... \n", + "39 1.925134 KEGG-Pathway-pae00030: Pentose phosphate pathw... \n", + "40 2.000000 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "41 1.000000 KEGG-Pathway-pae00625: Chloroalkane and chloro... \n", + "42 1.939024 KEGG-Pathway-pae00630: Glyoxylate and dicarbox... \n", + "43 2.580101 KEGG-Module-M00324: Dipeptide transport system \n", + "44 1.968872 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "45 2.000000 KEGG-Module-M00324: Dipeptide transport system \n", + "46 1.951807 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", + "47 2.727862 KEGG-Module-M00324: Dipeptide transport system \n", + "48 2.000000 KEGG-Module-M00188: NitT/TauT family transport... \n", + "49 1.000000 KEGG-Module-M00188: NitT/TauT family transport... \n", + "50 2.000000 KEGG-Module-M00223: Phosphonate transport system \n", + "51 1.965517 KEGG-Module-M00331: Type II general secretion ... \n", + "52 1.956522 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", + "53 1.928571 KEGG-Module-M00223: Phosphonate transport system \n", + "54 1.981982 KEGG-Module-M00223: Phosphonate transport system \n", + "55 2.976562 KEGG-Module-M00331: Type II general secretion ... \n", + "56 1.971429 KEGG-Pathway-pae00030: Pentose phosphate pathw... \n", + "57 1.975309 KEGG-Module-M00324: Dipeptide transport system \n", + "58 3.963636 KEGG-Module-M00236: Putative polar amino acid ... \n", + "59 1.000000 KEGG-Pathway-pae00780: Biotin metabolism - Pse... \n", "\n", " pw1 \n", "0 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", @@ -1797,63 +1843,60 @@ "3 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... \n", "4 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... \n", "5 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... \n", - "6 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", + "6 KEGG-Module-M00178: Ribosome, bacteria \n", "7 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", - "8 KEGG-Module-M00178: Ribosome, bacteria \n", - "9 KEGG-Pathway-pae01212: Fatty acid metabolism -... \n", - "10 KEGG-Pathway-pae00190: Oxidative phosphorylati... \n", - "11 KEGG-Pathway-pae01053: Biosynthesis of siderop... \n", - "12 KEGG-Pathway-pae00910: Nitrogen metabolism - P... \n", - "13 KEGG-Pathway-pae00460: Cyanoamino acid metabol... \n", - "14 KEGG-Pathway-pae00640: Propanoate metabolism -... \n", + "8 KEGG-Pathway-pae00020: Citrate cycle (TCA cycl... \n", + "9 KEGG-Pathway-pae01053: Biosynthesis of siderop... \n", + "10 KEGG-Pathway-pae00910: Nitrogen metabolism - P... \n", + "11 KEGG-Pathway-pae00460: Cyanoamino acid metabol... \n", + "12 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", + "13 KEGG-Pathway-pae00220: Arginine biosynthesis -... \n", + "14 KEGG-Pathway-pae03070: Bacterial secretion sys... \n", "15 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", "16 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", - "17 KEGG-Pathway-pae02024: Quorum sensing - Pseudo... \n", - "18 KEGG-Pathway-pae00460: Cyanoamino acid metabol... \n", - "19 KEGG-Pathway-pae00630: Glyoxylate and dicarbox... \n", - "20 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... \n", - "21 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", - "22 KEGG-Pathway-pae00627: Aminobenzoate degradati... \n", - "23 KEGG-Pathway-pae00627: Aminobenzoate degradati... \n", - "24 KEGG-Module-M00223: Phosphonate transport system \n", - "25 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... \n", - "26 KEGG-Pathway-pae00190: Oxidative phosphorylati... \n", - "27 KEGG-Pathway-pae01053: Biosynthesis of siderop... \n", + "17 KEGG-Pathway-pae00630: Glyoxylate and dicarbox... \n", + "18 KEGG-Module-M00223: Phosphonate transport system \n", + "19 KEGG-Pathway-pae00405: Phenazine biosynthesis ... \n", + "20 KEGG-Pathway-pae00627: Aminobenzoate degradati... \n", + "21 KEGG-Pathway-pae00627: Aminobenzoate degradati... \n", + "22 KEGG-Pathway-pae03010: Ribosome - Pseudomonas ... \n", + "23 KEGG-Pathway-pae00190: Oxidative phosphorylati... \n", + "24 KEGG-Pathway-pae01053: Biosynthesis of siderop... \n", + "25 KEGG-Pathway-pae00340: Histidine metabolism - ... \n", + "26 KEGG-Pathway-pae00627: Aminobenzoate degradati... \n", + "27 KEGG-Pathway-pae00362: Benzoate degradation - ... \n", "28 KEGG-Pathway-pae00362: Benzoate degradation - ... \n", - "29 KEGG-Pathway-pae00340: Histidine metabolism - ... \n", - ".. ... \n", - "34 KEGG-Pathway-pae02040: Flagellar assembly - Ps... \n", - "35 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", - "36 KEGG-Pathway-pae02040: Flagellar assembly - Ps... \n", - "37 KEGG-Pathway-pae00680: Methane metabolism - Ps... \n", - "38 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", - "39 KEGG-Pathway-pae00680: Methane metabolism - Ps... \n", - "40 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", - "41 KEGG-Module-M00709: Macrolide resistance, MacA... \n", - "42 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", - "43 KEGG-Pathway-pae04122: Sulfur relay system - P... \n", - "44 KEGG-Pathway-pae01501: beta-Lactam resistance ... \n", - "45 KEGG-Pathway-pae01501: beta-Lactam resistance ... \n", - "46 KEGG-Pathway-pae00640: Propanoate metabolism -... \n", - "47 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", - "48 KEGG-Pathway-pae00643: Styrene degradation - P... \n", - "49 KEGG-Pathway-pae00643: Styrene degradation - P... \n", - "50 KEGG-Module-M00334: Type VI secretion system \n", - "51 KEGG-Pathway-pae00920: Sulfur metabolism - Pse... \n", - "52 KEGG-Pathway-pae00550: Peptidoglycan biosynthe... \n", - "53 KEGG-Pathway-pae00564: Glycerophospholipid met... \n", - "54 KEGG-Pathway-pae00564: Glycerophospholipid met... \n", - "55 KEGG-Pathway-pae00564: Glycerophospholipid met... \n", - "56 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", - "57 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", - "58 KEGG-Module-M00331: Type II general secretion ... \n", - "59 KEGG-Pathway-pae01210: 2-Oxocarboxylic acid me... \n", - "60 KEGG-Pathway-pae00640: Propanoate metabolism -... \n", - "61 KEGG-Pathway-pae00920: Sulfur metabolism - Pse... \n", - "62 KEGG-Pathway-pae00860: Porphyrin and chlorophy... \n", - "63 KEGG-Module-M00238: D-Methionine transport system \n", - "\n", - "[64 rows x 3 columns]" + "29 KEGG-Pathway-pae00627: Aminobenzoate degradati... \n", + "30 KEGG-Pathway-pae00640: Propanoate metabolism -... \n", + "31 KEGG-Pathway-pae02040: Flagellar assembly - Ps... \n", + "32 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", + "33 KEGG-Pathway-pae02040: Flagellar assembly - Ps... \n", + "34 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", + "35 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", + "36 KEGG-Pathway-pae00260: Glycine, serine and thr... \n", + "37 KEGG-Module-M00709: Macrolide resistance, MacA... \n", + "38 KEGG-Pathway-pae04122: Sulfur relay system - P... \n", + "39 KEGG-Pathway-pae00920: Sulfur metabolism - Pse... \n", + "40 KEGG-Pathway-pae01501: beta-Lactam resistance ... \n", + "41 KEGG-Pathway-pae01501: beta-Lactam resistance ... \n", + "42 KEGG-Pathway-pae00640: Propanoate metabolism -... \n", + "43 KEGG-Pathway-pae00280: Valine, leucine and iso... \n", + "44 KEGG-Pathway-pae00643: Styrene degradation - P... \n", + "45 KEGG-Pathway-pae00643: Styrene degradation - P... \n", + "46 KEGG-Pathway-pae00680: Methane metabolism - Ps... \n", + "47 KEGG-Module-M00334: Type VI secretion system \n", + "48 KEGG-Pathway-pae00920: Sulfur metabolism - Pse... \n", + "49 KEGG-Pathway-pae00550: Peptidoglycan biosynthe... \n", + "50 KEGG-Pathway-pae00564: Glycerophospholipid met... \n", + "51 KEGG-Pathway-pae00564: Glycerophospholipid met... \n", + "52 KEGG-Pathway-pae00564: Glycerophospholipid met... \n", + "53 KEGG-Module-M00331: Type II general secretion ... \n", + "54 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", + "55 KEGG-Pathway-pae00440: Phosphonate and phosphi... \n", + "56 KEGG-Pathway-pae01210: 2-Oxocarboxylic acid me... \n", + "57 KEGG-Pathway-pae00640: Propanoate metabolism -... \n", + "58 KEGG-Pathway-pae00920: Sulfur metabolism - Pse... \n", + "59 KEGG-Pathway-pae01212: Fatty acid metabolism -... " ] }, "execution_count": 20, @@ -1866,7 +1909,9 @@ "for edge_id, edge_obj in final_network.edges.items():\n", " if edge_obj.significant:\n", " pw0, pw1 = final_network.get_edge_pathways(edge_id)\n", - " significant_edges.append({\"pw0\": pw0, \"pw1\": pw1, \"odds ratio\": edge_obj.weight})\n", + " significant_edges.append({\"pw0\": pw0,\n", + " \"pw1\": pw1,\n", + " \"odds ratio\": edge_obj.weight})\n", "significant_edges_df = pd.DataFrame(significant_edges)\n", "significant_edges_df.sort_values(\"odds ratio\", ascending=False)\n", "significant_edges_df" @@ -1876,7 +1921,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" },