{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "How_to_use_the_Targetome_and_Reactome_BQ_datasets.ipynb", "provenance": [], "collapsed_sections": [], "authorship_tag": "ABX9TyO/sUEpmSiCwz+mCeeR/uBH", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "qgwv4lK5V8Zc" }, "source": [ "# How to use the Targetome and Reactome BigQuery datasets\n", "Check out other notebooks at our [Community Notebooks Repository](https://github.com/isb-cgc/Community-Notebooks)!\n", "\n", "- **Title:** How to use the Targetome and Reactome BigQuery datasets\n", "- **Author:** John Phan\n", "- **Created:** 2021-07-23\n", "- **Purpose:** Demonstrate basic usage of the Targetome and Reactome BigQuery datasets\n", "- **URL:** https://github.com/isb-cgc/Community-Notebooks/blob/master/Notebooks/How_to_use_the_Targetome_and_Reactome_BQ_datasets.ipynb\n", "\n", "This notebook demonstrates basic usage of the Targetome and Reactome BigQuery datasets. Joint analysis of these datasets can provide a powerful tool for identifying pathways affected by cancer drugs via known drug targets (i.e., genes or proteins). \n", "\n", "The Cancer Targetome dataset is a curation of cancer drug and target (e.g., protein, RNA, DNA) interactions, supported by either experimental or literature evidence. More information about the Targetome study can be found here: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5759325/. The original data can be found here: https://github.com/ablucher/The-Cancer-Targetome.\n", "\n", "The Reactome is an open-source, manually curated, and peer-reviewed pathway database. More information can be found here: https://reactome.org/. " ] }, { "cell_type": "markdown", "metadata": { "id": "1zVfEL8i8__O" }, "source": [ "# Initialize Notebook Environment\n", "\n", "Before running the analysis, we need to load depdnencies, authenticate to BigQuery, and customize notebook parameters." ] }, { "cell_type": "markdown", "metadata": { "id": "TJmCyMPjNwjw" }, "source": [ "## Import Dependencies" ] }, { "cell_type": "code", "metadata": { "id": "LNlADvO-gken" }, "source": [ "# GCP Libraries\n", "from google.cloud import bigquery\n", "from google.colab import auth\n", "\n", "# Data Analytics\n", "import numpy as np\n", "from scipy import stats\n", "\n", "# Visualization\n", "import matplotlib.pyplot as plt\n", "import matplotlib\n", "import seaborn as sns" ], "execution_count": 1, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "LBHnu8bZDEcE" }, "source": [ "## Authenticate\n", "\n", "Before using BigQuery, we need to get authorization for access to BigQuery and the Google Cloud. For more information see ['Quick Start Guide to ISB-CGC'](https://isb-cancer-genomics-cloud.readthedocs.io/en/latest/sections/HowToGetStartedonISB-CGC.html). Alternative authentication methods can be found [here](https://googleapis.dev/python/google-api-core/latest/auth.html)." ] }, { "cell_type": "code", "metadata": { "id": "M6BEFHj2dd5a" }, "source": [ "# if you're using Google Colab, authenticate to gcloud with the following\n", "auth.authenticate_user()\n", "\n", "# alternatively, use the gcloud SDK\n", "#!gcloud auth application-default login" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "RWuECMsRptWJ" }, "source": [ "## Parameters\n", "\n", "Customize the following parameters based on your notebook, execution environment, or project." ] }, { "cell_type": "code", "metadata": { "id": "veP6gPatu2iW" }, "source": [ "# set the google project that will be billed for this notebook's computations\n", "google_project = 'google-project' ## Change me" ], "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "F6zTODbDq3g9" }, "source": [ "## BigQuery Client\n", "\n", "Create the BigQuery client." ] }, { "cell_type": "code", "metadata": { "id": "HNkfSXedwzbC" }, "source": [ "# Create a client to access the data within BigQuery\n", "client = bigquery.Client(google_project)" ], "execution_count": 4, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "5OCZiJyNOF4i" }, "source": [ "# Targetome Analysis" ] }, { "cell_type": "markdown", "metadata": { "id": "i4jPuJnUYkju" }, "source": [ "## Identify Drugs Interacting w/ Target\n", "\n", "The following query identifies all cancer drugs that have been found to interact with a specific target. In this example, the target is MS4A1, a gene that encodes a member of the membrane-spanning 4A gene family. Each identified drug is also associated with a literature evidence, identified by its PubMed ID. " ] }, { "cell_type": "code", "metadata": { "id": "Q13ninrpb1hH" }, "source": [ "# set parameters for query\n", "target_name = 'MS4A1' # target for which we want to identify drugs" ], "execution_count": 5, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "WYKK8nT7Rzpa" }, "source": [ "# run query and put results in data frame\n", "drug_interactions = client.query((\"\"\"\n", " SELECT\n", " inter.targetName,\n", " inter.drugName,\n", " src.PubMedID\n", "\n", " FROM\n", " `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.sources_v1` AS src\n", " -- link interactions to literature sources\n", " ON inter.sourceID = src.sourceID\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.target_synonyms_v1` AS targsyn\n", " -- filter for interactions that match target\n", " ON inter.targetID = targsyn.targetID\n", " \n", " WHERE\n", " LOWER(targsyn.synonym) = LOWER('{target_name}')\n", "\n", " ORDER BY drugName ASC\n", "\"\"\").format(\n", " target_name=target_name\n", ")).result().to_dataframe()" ], "execution_count": 6, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 669 }, "id": "XKmbMwbic2sN", "outputId": "ec7d73dc-9355-48a3-c807-6117a69a3584" }, "source": [ "# display result data frame\n", "drug_interactions" ], "execution_count": 7, "outputs": [ { "output_type": "execute_result", "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", "
targetNamedrugNamePubMedID
0MS4A1Ibritumomab TiuxetanNA_IUPHAR
1MS4A1Ibritumomab Tiuxetan11752352
2MS4A1Ibritumomab Tiuxetan12011122
3MS4A1Ibritumomab Tiuxetan15045033
4MS4A1Ibritumomab Tiuxetan20113680
5MS4A1Ibritumomab Tiuxetan10541376
6MS4A1Ibritumomab Tiuxetan11418316
7MS4A1Ibritumomab Tiuxetan11879282
8MS4A1Obinutuzumab23537278
9MS4A1Obinutuzumab21378274
10MS4A1Obinutuzumab19513948
11MS4A1ObinutuzumabNA_TTD
12MS4A1Ofatumumab17768100
13MS4A1Ofatumumab19427037
14MS4A1Ofatumumab18388516
15MS4A1OfatumumabNA_TTD
16MS4A1Rituximab11752352
17MS4A1Rituximab20350667
18MS4A1Rituximab20350663
19MS4A1RituximabNA_TTD
\n", "
" ], "text/plain": [ " targetName drugName PubMedID\n", "0 MS4A1 Ibritumomab Tiuxetan NA_IUPHAR\n", "1 MS4A1 Ibritumomab Tiuxetan 11752352\n", "2 MS4A1 Ibritumomab Tiuxetan 12011122\n", "3 MS4A1 Ibritumomab Tiuxetan 15045033\n", "4 MS4A1 Ibritumomab Tiuxetan 20113680\n", "5 MS4A1 Ibritumomab Tiuxetan 10541376\n", "6 MS4A1 Ibritumomab Tiuxetan 11418316\n", "7 MS4A1 Ibritumomab Tiuxetan 11879282\n", "8 MS4A1 Obinutuzumab 23537278\n", "9 MS4A1 Obinutuzumab 21378274\n", "10 MS4A1 Obinutuzumab 19513948\n", "11 MS4A1 Obinutuzumab NA_TTD\n", "12 MS4A1 Ofatumumab 17768100\n", "13 MS4A1 Ofatumumab 19427037\n", "14 MS4A1 Ofatumumab 18388516\n", "15 MS4A1 Ofatumumab NA_TTD\n", "16 MS4A1 Rituximab 11752352\n", "17 MS4A1 Rituximab 20350667\n", "18 MS4A1 Rituximab 20350663\n", "19 MS4A1 Rituximab NA_TTD" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "markdown", "metadata": { "id": "nbxHgDDeBbA7" }, "source": [ "## Identify Interactions Supported by Experiments w/ Exact Binding Values\n", "\n", "As reported in Blucher et al. (https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5759325/) Figure 2, Level III Exact interactions refer to interactions annotated with exact (“=”) binding values reported, rather than “<” or “>”. There are approximately 2000 of these interactions. The following query identifies these interactions. " ] }, { "cell_type": "code", "metadata": { "id": "kpYwsxrICHwd" }, "source": [ "# run query and put results in data frame\n", "exact_interactions = client.query((\"\"\"\n", " SELECT\n", " DISTINCT\n", " inter.interactionID,\n", " inter.drugName,\n", " inter.targetName\n", "\n", " FROM\n", " `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- filter for interactions with experiments\n", " ON inter.expID = exp.expID\n", "\n", " WHERE\n", " -- filter for exact binding evidence\n", " exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", " \n", " -- filter for only human targets\n", " AND inter.targetSpecies = 'Homo sapiens'\n", "\n", " ORDER BY\n", " targetName ASC,\n", " drugName ASC\n", "\"\"\")).result().to_dataframe()" ], "execution_count": 8, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 419 }, "id": "-17ga4JskFIo", "outputId": "60d50fbc-ad50-4d83-80f5-e33d82a9e975" }, "source": [ "# display result data frame\n", "exact_interactions" ], "execution_count": 9, "outputs": [ { "output_type": "execute_result", "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", "
interactionIDdrugNametargetName
02130FlutamideAADAC
11921AxitinibAAK1
21538BosutinibAAK1
31616CrizotinibAAK1
41061Erlotinib HydrochlorideAAK1
............
2023865Sorafenib TosylateZAK
2024866VandetanibZAK
20255936BosutinibZAP70
20266782CeritinibZAP70
20274879CrizotinibZAP70
\n", "

2028 rows × 3 columns

\n", "
" ], "text/plain": [ " interactionID drugName targetName\n", "0 2130 Flutamide AADAC\n", "1 1921 Axitinib AAK1\n", "2 1538 Bosutinib AAK1\n", "3 1616 Crizotinib AAK1\n", "4 1061 Erlotinib Hydrochloride AAK1\n", "... ... ... ...\n", "2023 865 Sorafenib Tosylate ZAK\n", "2024 866 Vandetanib ZAK\n", "2025 5936 Bosutinib ZAP70\n", "2026 6782 Ceritinib ZAP70\n", "2027 4879 Crizotinib ZAP70\n", "\n", "[2028 rows x 3 columns]" ] }, "metadata": {}, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "Z1Nr4RTDJbcY" }, "source": [ "## Experimental Evidence Supporting Target Binding for Imatinib\n", "\n", "The Cancer Targetome database can help identify drugs with strong interactions supported by experimental data. Blucher et al. highlight the drub imatinib, a protein kinase inhibitor, as an example. Imatinib is involved in 87 interactions supported by experimental binding evidence under 100nM. The following query identifies all 87 interactions. " ] }, { "cell_type": "code", "metadata": { "id": "4unk8cQ6oiVG" }, "source": [ "# set parameters for query\n", "drug_name = 'imatinib'" ], "execution_count": 10, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "0gKYgFLbJ1tj" }, "source": [ "# run query and put results in data frame\n", "drug_interactions = client.query((\"\"\"\n", " SELECT\n", " DISTINCT\n", " inter.* EXCEPT (sourceID),\n", " exp.exp_assayType,\n", " exp.exp_assayValueMedian\n", "\n", " FROM\n", " `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- filter for interactions with experimental evidence\n", " ON inter.expID = exp.expID\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.drug_synonyms_v1` AS drugsyn\n", " -- filter for interactions matching drug id\n", " ON inter.drugID = drugsyn.drugID\n", "\n", " WHERE\n", " -- filter by drug name\n", " LOWER(drugsyn.synonym) = LOWER('{drug_name}')\n", "\n", " -- make sure that all assay ranges are at or below 100nM\n", " AND exp.exp_assayValueMedian <= 100\n", " AND (exp.exp_assayValueLow <= 100 OR exp.exp_assayValueLow is null)\n", " AND (exp.exp_assayValueHigh <= 100 OR exp.exp_assayValueHigh is null)\n", "\n", " -- make sure the assay type is known (KD, Ki, IC50, or EC50)\n", " AND exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", "\n", " -- limit to just experiments in humans\n", " AND inter.targetSpecies = 'Homo sapiens'\n", "\n", " ORDER BY inter.targetName ASC\n", "\"\"\").format(\n", " drug_name=drug_name\n", ")).result().to_dataframe()" ], "execution_count": 11, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 609 }, "id": "SFue9YfqpDtZ", "outputId": "e01575bf-ffaf-45cc-c446-099a64ff4595" }, "source": [ "# display result data frame\n", "drug_interactions" ], "execution_count": 12, "outputs": [ { "output_type": "execute_result", "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", "
interactionIDdrugIDtargetIDinteractionTypedrugNamedrug_approvalDatedrug_atcClassIDdrug_atcClassNamedrug_atcClassStatusdrug_epcClassIDdrug_epcClassNametargetNametargetTypetarget_uniprotIDtargetSpeciesexpIDexp_assayTypeexp_assayValueMedian
06913InhibitionImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorABL1ProteinP00519Homo sapiens1687KD2.2
16913InhibitionImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorABL1ProteinP00519Homo sapiens1691KD14.0
26913InhibitionImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorABL1ProteinP00519Homo sapiens1709KD44.0
36913InhibitionImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorABL1ProteinP00519Homo sapiens1722KD62.0
46913InhibitionImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorABL1ProteinP00519Homo sapiens1755IC501.1
.........................................................
824059195NoneImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorPDGFRBProteinP09619Homo sapiens5354IC5072.0
834059195NoneImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorPDGFRBProteinP09619Homo sapiens9815KD14.0
844059195NoneImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorPDGFRBProteinP09619Homo sapiens12275KD14.0
85674291841NoneImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorSLC47A1ProteinQ96FL8Homo sapiens14365IC5040.0
86674291841NoneImatinib Mesylate2001-05-10L01XEProtein kinase inhibitorsApprovedN0000175605Kinase InhibitorSLC47A1ProteinQ96FL8Homo sapiens14369IC5050.0
\n", "

87 rows × 18 columns

\n", "
" ], "text/plain": [ " interactionID drugID targetID ... expID exp_assayType exp_assayValueMedian\n", "0 6 91 3 ... 1687 KD 2.2\n", "1 6 91 3 ... 1691 KD 14.0\n", "2 6 91 3 ... 1709 KD 44.0\n", "3 6 91 3 ... 1722 KD 62.0\n", "4 6 91 3 ... 1755 IC50 1.1\n", ".. ... ... ... ... ... ... ...\n", "82 405 91 95 ... 5354 IC50 72.0\n", "83 405 91 95 ... 9815 KD 14.0\n", "84 405 91 95 ... 12275 KD 14.0\n", "85 6742 91 841 ... 14365 IC50 40.0\n", "86 6742 91 841 ... 14369 IC50 50.0\n", "\n", "[87 rows x 18 columns]" ] }, "metadata": {}, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "0o1sbaAbSq6U" }, "source": [ "## Plot Histogram of Experimental Evidence for Imatinib Interactions\n", "\n", "Figure 3A in Blucher et al. breaks down the interactions for imatinib by assay type (KD, Ki, IC50, and EC50). We can see that ABL1, the canonical target for imatinib, has low nanomolar assay evidence for all four assay types." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 471 }, "id": "hxck_lUkSz1b", "outputId": "c5daebe4-9347-4be2-b48e-17d65e769a53" }, "source": [ "# assign colors to each unique target to maintain\n", "# legend consistency across subplots\n", "sns_palette = sns.color_palette('husl', 14)\n", "colors = {\n", " key: sns_palette[i] for i, key in enumerate(\n", " drug_interactions['targetName'].unique()\n", " )\n", "}\n", "\n", "# create a subplot with 4 rows and 1 column\n", "fig, axes = plt.subplots(4, 1, figsize=(10, 6))\n", "fig.tight_layout()\n", "\n", "# plot KD data\n", "KD_data = drug_interactions[\n", " (drug_interactions['exp_assayType']=='KD')\n", "][['targetName', 'exp_assayValueMedian']]\n", "sns.histplot(\n", " data=KD_data, ax=axes[0], x='exp_assayValueMedian', stat=\"count\",\n", " hue='targetName', multiple=\"stack\", bins=np.arange(0, 101, 1),\n", " palette=colors, element=\"bars\", legend=False\n", ")\n", "axes[0].set_xlabel('Binding Assay Value (nM), KD')\n", "axes[0].set_xlim([0,100])\n", "axes[0].set_ylim([0,6])\n", "\n", "# plot Ki data\n", "Ki_data = drug_interactions[\n", " (drug_interactions['exp_assayType']=='Ki')\n", "][['targetName', 'exp_assayValueMedian']]\n", "sns.histplot(\n", " data=Ki_data, ax=axes[1], x='exp_assayValueMedian', stat=\"count\", \n", " hue='targetName', multiple=\"stack\", bins=np.arange(0, 101, 1),\n", " palette=colors, element=\"bars\", legend=False\n", ")\n", "axes[1].set_xlabel('Binding Assay Value (nM), Ki')\n", "axes[1].set_xlim([0,100])\n", "axes[1].set_ylim([0,6])\n", "\n", "# plot IC50 data\n", "IC50_data = drug_interactions[\n", " (drug_interactions['exp_assayType']=='IC50')\n", "][['targetName', 'exp_assayValueMedian']]\n", "sns.histplot(\n", " data=IC50_data, ax=axes[2], x='exp_assayValueMedian', stat=\"count\",\n", " hue='targetName', multiple=\"stack\", bins=np.arange(0, 101, 1),\n", " palette=colors, element=\"bars\", legend=False\n", ")\n", "axes[2].set_xlabel('Binding Assay Value (nM), IC50')\n", "axes[2].set_xlim([0,100])\n", "axes[2].set_ylim([0,6])\n", "\n", "# plot EC50 data\n", "EC50_data = drug_interactions[\n", " (drug_interactions['exp_assayType']=='EC50')\n", "][['targetName', 'exp_assayValueMedian']]\n", "sns.histplot(\n", " data=EC50_data, ax=axes[3], x='exp_assayValueMedian', stat=\"count\",\n", " hue='targetName', multiple=\"stack\", bins=np.arange(0, 101, 1),\n", " palette=colors, element=\"bars\", legend=False\n", ")\n", "axes[3].set_xlabel('Binding Assay Value (nM), EC50')\n", "axes[3].set_xlim([0,100])\n", "axes[3].set_ylim([0,6])\n", "\n", "# create a shared legend for all 4 subplots\n", "patches = [\n", " matplotlib.patches.Patch(color=colors[key], label=key) for key in colors\n", "]\n", "fig.legend(handles=patches, loc='center left', bbox_to_anchor=(1.05, 0.5))" ], "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 13 }, { "output_type": "display_data", "data": { "image/png": "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vKPKq1VLIS/vYBwikhPRsVyfRUREoOwkql4pddUj2YGZ1QJeBe50993F6919LDAWoE6D+n7N9GeOamPBjQ8xpkf/sO1f+NjDJdYN+ucrkYQYU3u374g6vsa1kpj8+0vD1t3+5uqoYyitvYtHvsO/blwQtu6sF3tEva+KVNJ7Wxn+7hXtqt7XMeynTx9V/qfXb41DNLHX67Jr+OnAo4/39Qkn5/FKbBzL9VlERATKHs4338xuLl5oZr8Ewn/z/u56yYQSqJfcfdqxhSgiIiIiIlJ5lNUTdSfwmpldy7dJUzZQDehX2oZmZsCzwGfu/ujxBioiIiIiIlIZlJpEufsW4Fwz6w60D4r/7u7vRdB2N+A6YImZfRqU3e/upU6NLiIiIiIiUplF9Jwod58JRDWbgbt/BNixBCUiIiIiIlJZlXVPlIiIiIiIiBShJEpERERERCQKSqJERERERESioCRKREREREQkCkqiREREREREoqAkSkREREREJApKokRERERERKIQ0XOiqpI7brqZvdt3hK2r1aghTzz71wqO6LtmfDSHmnVqhq1rXrseP8r+/lHl//pgHmd/+O+w2+w5VK7hHZMOnTvy1cpVYevOaHUmSz5ZXCFxlPS3L++/e2JiIkeOHIl6u+o1arJ/395yi+NYVPZ/HyLReOu9d8n88MOwdXsL8o+pzYq6jhyrGjVrcWD/vqPKK/L6UqdePfbs2hW2rlmdelxyQfejyivy/SvpPYLKcR0ub6Udb5Nadbj0wouOKq8s57NIPCmJKmbv9h2M6dE/bN2gf75SwdEcrVnDmvR67sawdQuvfyVs7N0++5zvP/NO2G1y7riiXOM7Fs3atqDrU5eFrVv95MIKi6Okv315/91/cclAnu72eNi6s17sQe8nXg1b9+XY+8s1jmNR2f99iESj68VX8NOBT4ete33CrcfUZkVdR47Veb0vp/UtI44qr8jryw8u7kWrXw8NWzfvluvi/v6V9B5B5bgOl7fSjnfOry+O+99DpLLScD4REREREZEoKIkSERERERGJgpIoERERERGRKCiJEhERERERiYKSKBERERERkSgoiRIREREREYmCkigREREREZEoxDSJMrOeZva5ma00s/tiuS8REREREZGKELMkyswSgaeBS4BMYICZZcZqfyIiIiIiIhUhlj1R5wAr3f0rdz8ETAb6xnB/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iJxIggkJkt39oJmdSei+orbBPUgVGccphHqaMtz9SEXuOxJm9howzN2/PM52+gGd3f13wfI77n5xecQoIiISC7Ecznc6oZuOnw+m7h1nZjVjuD8RkfJSA/jIzBYR6m0aHIcEaiChYYn/pzImUIH7CE0wcbySCM1qCIASKBERqexi2ROVTegBlN3cfY6ZjQZ2F/5PY5H1biH0PA9q1qzZJSMjIybxiIiIiEjVtmDBgu3uHm6SopPOggULmiQlJY0jNOOqJpOLzhFgaUFBwS+7dOkSdoKiWN4TtQHY4O5zguWphHkivbuPBcYCZGdn+/z584uvIiIiIiJy3MxsbbxjqChJSUnjmjVrdlbjxo13JiQk6NaaKBw5csS2bduWuXnz5nFAn3DrxCwrDaazXW9mbYOiiwg9w0VERERERGKrfePGjXcrgYpeQkKCN27ceBehXrywYj073+2EHixZjdDDJ2+I8f5ERERERAQSlEAdu+C9K7HDKabjI939U3fPdveO7v7TUp5zIiIiIiIiJ5mJEyfWM7MuCxcuTAX4/PPPq6WmpnbOyMjIbNu2bWanTp0yFi1alAKQk5NTu3v37kc9g3DEiBGNTz311PZm1mXTpk2x7gSKSKUIQkREREREYufgA09ksf9g+X33r5FakPp/71hU1mqTJ09u0Llz570TJkxo0KlTp40A6enpeStWrFgO8MgjjzR6+OGHm0+bNm1NSW2cf/75e6+44opdF154YduS1qlomqlDRERERORkV54JVITt7dq1K2HevHm1nn/++TWvvfZag3Dr7N69O7FevXqHS2unW7duB9q2bVuhjxopi3qiRERERESk3E2aNKneBRdcsKtjx4559evXL/j3v/9do0mTJgXr169PycjIyNy3b1/CwYMHE2bNmrUi3rFGSz1RIiIiIiJS7qZMmdJgwIABOwGuuOKKrydOnNgAvh3Ot379+qUjRoxYf+ONN54W30ijp54oEREREREpV1u2bEn8+OOPa3/++efVb7vtNg4fPmxm5nfdddd3Hl47YMCAb+64446WcQrzmKknSkREREREytXEiRPr9+vX7+uNGzcuyc3NXbJ58+bFLVq0OLR69epqRdebMWNG7fT09Lx4xXms1BMlIiIiIiLl6pVXXmlwzz33bC5a1rdv350jR45sXnhPlLuTnJzsY8aMWVu4zuzZs+s0bdq0Y+HySy+9tOrjjz+u+eSTTzbbsWNHclZWVmb37t13/e1vf1tLHJl75XkGV3Z2ts+fPz/eYYiIiIjIScjMFrh7drzjqAiLFi1ak5WVtb1wOV5TnJ/IFi1a1CgrK6tluDr1RImIiIiInORO9oSnoumeKBERERERkSgoiRIREREREYmCkigREREREZEoKIkSERERERGJgpIoERERERGRKCiJEhERERGRmJg4cWI9M+uycOHCVIDPP/+8WmpqaueMjIzMtm3bZnbq1Clj0aJFKQA5OTm1u3fv3qp4G3369Dm9ZcuW7Vu3bt2uf//+LfPy8qyij6M4TXEuIiIiInKS2zXywiw/sKvcvvtb9boFdX/7XpnTpk+ePLlB586d906YMKFBp06dNgKkp6fnrVixYjnAI4880ujhhx9uPm3atDUltXHttdd+/frrr68G6Nu37+mPP/54o3vvvXdbOR3KMYl5T5SZJZrZQjPLifW+RERERETkaOWZQEXa3q5duxLmzZtX6/nnn1/z2muvNQi3zu7duxPr1at3uLR2rr766l0JCQkkJCSQnZ29b8OGDdWONe7yUhE9UUOAz4A6FbAvERERERGpBCZNmlTvggsu2NWxY8e8+vXrF/z73/+u0aRJk4L169enZGRkZO7bty/h4MGDCbNmzVoRSXt5eXn2t7/9reGjjz66PtaxlyWmPVFm1gK4FBgXy/2IiIiIiEjlMmXKlAYDBgzYCXDFFVd8PXHixAbw7XC+9evXLx0xYsT6G2+88bRI2vvFL35x6g9+8IO9PXv23BvLuCMRURJlZt0iKQvjcWAYcKSUtm8xs/lmNn/btrgObRQRERERkXKwZcuWxI8//rj2rbfeelpaWlqHp556qtmbb75Z392/s96AAQO+mT9/fq2y2hs6dGjz7du3J/31r3+Ney8URN4T9WSEZf9lZr2Bre6+oLT13H2su2e7e3bjxo0jDEdERERERCqriRMn1u/Xr9/XGzduXJKbm7tk8+bNi1u0aHFo9erV37mfacaMGbXT09PzSmvr0UcfbfTee+/Vff31179KTEyMbeARKvWeKDPrCpwLNDazu4pU1QHKOoJuQB8z6wWkAnXM7EV3//nxBCwiIiIiIpXbK6+80uCee+7ZXLSsb9++O0eOHNm88J4odyc5OdnHjBmztnCd2bNn12natGnHwuWXXnpp1bBhw05r3rx5XnZ29lkAvXv33jlq1KhNFXc0RytrYolqQK1gvdpFyncDV5a2obv/FvgtgJldANytBEpEREREpOJZ9boF5T3FeWn1c+bM+aJ42QMPPLD1gQce2FrSNr17995z8ODBT4qXFxQUlDqyLR5KfSPd/QPgAzN7wd3XlrauiIiIiIhUTpE800kiF2k2mmJmY4GWRbdx9wsj2djd3wfejzI2ERERERGRSifSJOoVYAyhqcpLfRiWiIiIiIjIySzSJKrA3Z+JaSQiIiIiIiIngEinOH/TzAabWXMza1D4E9PIREREREREKqFIe6J+Efy+p0iZA2eUbzgiIiIiIiKVW0Q9Ue5+epgfJVAiIiIiIlKidevWJfXu3fuM9PT09u3atTvr/PPPb7V48eIUgOHDhzdJSUnpvGPHjv8+f3bz5s2J3//+99vUqFGj08CBA0+NX+Sli6gnyswGhit39wnlG46IiIiIiJS3ec9emFVwsPyeE5WUWrfgezeVPm36kSNH6NOnT6trrrlmR05OzlcAs2fPrr5x48bkjh075k2dOrVB+/bt97344ov1hgwZsgOgRo0aPnz48I2LFi2qvnTp0urlFW95i/SeqO8V+TkPeAjoE6OYRERERESkHJVnAhVpezk5ObWTkpJ82LBh2wrLunbteqBnz557ly1blrJ///7E4cOH506ZMuW/cy3UqVPnyMUXX7w3NTX1SHnGW94iHc53e5Gfm4HOQK3YhiYiIiIiIieqxYsXV8/Kytofrm7ChAn1+/Xr93XPnj33rl69OnX9+vXlmuTFWqQ9UcXtA04vz0BERERERKRqmDZtWsOBAwd+nZiYSK9evXZOnDixfrxjikak90S9SWg2PoBE4CxgSqyCEhERERGRE1uHDh0OvP7660clR3Pnzq2+du3alJ49e7YByM/PtxYtWhy6//77tx3dSuUUaU/UKODPwc8I4Efufl/MohIRERERkRPaZZddtufQoUM2atSoRoVlc+bMqX777benDx06dGNubu6S3NzcJVu3bl28ZcuW5C+++KJaPOONRqT3RH0ArABqA/WBQ7EMSkRERERETmwJCQlMnz591XvvvVcnPT29fatWrdrde++9aXPnzq191VVXfVN03UsuuWTn+PHjGwCkpaV1+N3vfpc+derUhk2bNu24YMGC1PgcQckiHc53FfAI8D5g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+75i690C3AJQs2bNLhkZGTGJR0RERESqtgULFmx393ATE5101BN1/OLSExW03Rm43d3nmNloQv9T+buiK7n7WELJFtnZ2T5//vyjGhIREREROV5mtjbeMcjJIZaz820ANrj7nGB5KqGkSkRERERE5IQVsyQqeA7IejNrGxRdRGhon4iIiIiIyAkr1s+Juh14ycwWA2cDI2K8PxERERERqQQSExO7FD4nqm3btpkPPvhg08OHQ48HzMnJqV27du2zC58TlZ2d3fbll1+uW7jtXXfddUqTJk06ZmRkZJ555pnt/vKXvzQorPvVr37V4vTTT2/Xpk2bzJ/85Cdnbt++PbGijy2mz4ly90+B7FjuQ0REREREStcj55WsXYcOleNzoqoV/LN3/0WlrZOSknJkxYoVywFyc3OT+vfvf8bu3bsTH3vssY0A2dnZe2fOnLkSYNasWdX79+/fqkaNGmsKH7g7aNCgLcOHD9+yZMmSlK5du2Zef/31O1NSUvziiy/e/dRTT21ITk7m17/+ddrvfve7Zs8880xuyZGUv1j3RImIiIiISJyVZwJ1LO2lpaUVjBs3bs3zzz/f5MiRo5/Wce655x645557Nj711FNNitd16NAhLzU19Uhhj9Pll1++Ozk5GYCuXbvuy83NrXZsR3HslESJiIiIiEjMZWZmHjp8+DC5ublhE7Bzzjln/6pVq1KLl3/00Uc1TjvttINpaWkFxeteeOGFRj179twVi3hLE9PhfCIiIiIiIpEo/vzaMWPGNJ00aVKjNWvWpEyePHll8fXvvffeZomJiT5o0KCvKyzIgHqiREREREQk5pYvX14tMTGRcD1KAPPmzavRqlWrg4XLgwYN2rJy5cpl48ePXzV48OCW+/fvt8K6J554ouE777xTb9q0aasTEio+pVESJSIiIiIiMbVx48akm2+++bQbbrhha7ikZ86cOdUfeeSRU2699datxeuuvfbaXR06dNj39NNPNwSYOnVqndGjRzd76623VtauXfvoG6wqgIbziYiIiIhIucvLy0vIyMjILCgosMTERL/66qt3PPjgg1sK6+fPn1/rrLPOyjxw4EBCw4YN8x955JF1hTPzFffQQw9tuu6668646667tt91112nHjp0KOHCCy9sA9C5c+e9kyZNWldRxwVKokRERERETnp1q1UrKO8pzsta5/DhwwtK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IiIiIilz4MABZs+eXa9Dhw5749Xn5+fvP3jwIAUFBZnLly+v2a1btz0l7W/8+PFZke58M2bMqBdbP2vWrHp9+/b9Oun605/+1HDAgAH/vfLKK7e/9dZb9b/66is70nNSdz4RERERESlzX331VZW8vLx8gFNPPXXn8OHDP092Hx07dszbtWtXRq9evXZMmjRpHRTfnW/IkCEtDxw4YHv27KmyYMGCZQD79u2zt99+u/4TTzyx7rjjjivq3Lnz7pkzZ9YbNGjQl0dybmqJEhERERGRMhcZ+7RixYplkydPXlejRvwHzy1btqxaRkYG2dnZhW3btt07f/78WpG6xYsXr7j//vs37NixI6O0402ZMmXNunXrlvTv33/bT37yk5MAZs6cWW/nzp0Z7du3b5ednd1h3rx5dZ599tkj7tKX0iTKzPqY2UozW21m96TyWCIiIiIicnTZsGFD5vXXX99i6NChW6pUqcIdd9yx5fnnn2/05ptv1o6ss3v37oRzlipVqvDQQw8VfPTRR7UXLlxY49lnn234yCOPrC0oKFhSUFCw5LPPPlvy97//vV5kpsDDlbIkyswygMeBvkA+MMjM8lN1PBERERERqfgi3fxatWrV7qyzzmrTu3fvHaNHj94AcNJJJxVOnTp1zX333dfspJNOat+lS5e8mTNnHjd8+PAtie6/Tp06fuONN27+5S9/ecJ7771Xv3///l+Pj6pXr15R9+7ddz333HP1j+QcUjkmqgew2t3XAJjZc8AlwLIUHlNERERERGJk1qSwrKc4L22dPXv2LIxXfvDgwfklbde7d+/dH3744cp4dQ899NCGeOVz58791vq/+MUvDhkzFfHGG2/8u6TjJyKVSVQ2sC5qeT1wagqPJyIiIiIicZT2TCdJjrnHHd915Ds2uxzo4+7XhctXAae6+y0x690A3BAutgeWpiQgOVo1BpKeyUWOebouJJauCYlH14XEynX3uukOojwsWrTos06dOun6PwKLFi1q3KlTp5x4dalsiSoAmkctNwvLvsXdJwATAMxsnrt3T2FMcpTRNSHx6LqQWLomJB5dFxLLzOalOwY5NqRydr4PgdZmdrKZVQOuAF5O4fFERERERERSLmUtUe5eaGa3ALOBDOApd/84VccTEREREREpD6nszoe7vwq8msQmE1IVixy1dE1IPLouJJauCYlH14XE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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "xqY0iJedOVv9" }, "source": [ "# Integrated Targetome and Reactome Analysis" ] }, { "cell_type": "markdown", "metadata": { "id": "7kVZ88dU85Vs" }, "source": [ "## Identify all Reactome Pathways Targeted by Imatinib\n", "\n", "We can join tables from the Reactome BigQuery dataset to identy all pathways targeted by Imatinib. Targetome UniProt IDs map to Reactome \"physical entities\", which can then be mapped to Reactome pathways. We further filter the physical entity to pathway evidence codes to retain only interactions that have \"Traceable Author Statements\" (TAS) rather than just \"Inferred from Electronic Annotation\" (IEA) to avoid evidence that have not been manually curated. " ] }, { "cell_type": "code", "metadata": { "id": "933QxR4tTzFc" }, "source": [ "# set parameters for query\n", "drug_name = 'imatinib'" ], "execution_count": 14, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "ZwJGDXql9j6P" }, "source": [ "# run query and put results in data frame\n", "drug_pathways = client.query((\"\"\"\n", " SELECT\n", " DISTINCT pathway.*\n", "\n", " FROM\n", " `isb-cgc-bq.reactome_versioned.pathway_v77` as pathway\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` as pe2pathway\n", " -- link pathways to physical entities via intermediate table\n", " ON pathway.stable_id = pe2pathway.pathway_stable_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- link pathways to physical entities\n", " ON pe2pathway.pe_stable_id = pe.stable_id\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", " -- link physical entities to interactions\n", " ON pe.uniprot_id = inter.target_uniprotID\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- link interactions to experiments\n", " ON inter.expID = exp.expID\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.drug_synonyms_v1` AS drugsyn\n", " -- filter for interactions matching drug id\n", " ON inter.drugID = drugsyn.drugID\n", "\n", " WHERE\n", " -- filter by drug name\n", " LOWER(drugsyn.synonym) = LOWER('{drug_name}')\n", "\n", " -- make sure that all assay ranges are at or below 100nM\n", " AND exp.exp_assayValueMedian <= 100\n", " AND (exp.exp_assayValueLow <= 100 OR exp.exp_assayValueLow is null)\n", " AND (exp.exp_assayValueHigh <= 100 OR exp.exp_assayValueHigh is null)\n", "\n", " -- make sure the assay type is known (KD, Ki, IC50, or EC50)\n", " AND exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", "\n", " -- limit to just experiments in humans\n", " AND inter.targetSpecies = 'Homo sapiens'\n", " \n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " AND pe2pathway.evidence_code = 'TAS' \n", " ORDER BY pathway.name ASC \n", "\"\"\").format(\n", " drug_name=drug_name\n", ")).result().to_dataframe()" ], "execution_count": 15, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 589 }, "id": "khdvl_xPWWxM", "outputId": "1fa3ec20-2107-47b3-92b8-893a298b20ce" }, "source": [ "# display result data frame\n", "drug_pathways" ], "execution_count": 16, "outputs": [ { "output_type": "execute_result", "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", "
stable_idurlnamespecieslowest_level
0R-HSA-1280218https://reactome.org/PathwayBrowser/#/R-HSA-12...Adaptive Immune SystemHomo sapiensFalse
1R-HSA-422475https://reactome.org/PathwayBrowser/#/R-HSA-42...Axon guidanceHomo sapiensFalse
2R-HSA-389356https://reactome.org/PathwayBrowser/#/R-HSA-38...CD28 co-stimulationHomo sapiensFalse
3R-HSA-389357https://reactome.org/PathwayBrowser/#/R-HSA-38...CD28 dependent PI3K/Akt signalingHomo sapiensTrue
4R-HSA-389359https://reactome.org/PathwayBrowser/#/R-HSA-38...CD28 dependent Vav1 pathwayHomo sapiensTrue
..................
175R-HSA-8864260https://reactome.org/PathwayBrowser/#/R-HSA-88...Transcriptional regulation by the AP-2 (TFAP2)...Homo sapiensFalse
176R-HSA-202430https://reactome.org/PathwayBrowser/#/R-HSA-20...Translocation of ZAP-70 to Immunological synapseHomo sapiensTrue
177R-HSA-425366https://reactome.org/PathwayBrowser/#/R-HSA-42...Transport of bile salts and organic acids, met...Homo sapiensFalse
178R-HSA-382551https://reactome.org/PathwayBrowser/#/R-HSA-38...Transport of small moleculesHomo sapiensFalse
179R-HSA-5653656https://reactome.org/PathwayBrowser/#/R-HSA-56...Vesicle-mediated transportHomo sapiensFalse
\n", "

180 rows × 5 columns

\n", "
" ], "text/plain": [ " stable_id ... lowest_level\n", "0 R-HSA-1280218 ... False\n", "1 R-HSA-422475 ... False\n", "2 R-HSA-389356 ... False\n", "3 R-HSA-389357 ... True\n", "4 R-HSA-389359 ... True\n", ".. ... ... ...\n", "175 R-HSA-8864260 ... False\n", "176 R-HSA-202430 ... True\n", "177 R-HSA-425366 ... False\n", "178 R-HSA-382551 ... False\n", "179 R-HSA-5653656 ... False\n", "\n", "[180 rows x 5 columns]" ] }, "metadata": {}, "execution_count": 16 } ] }, { "cell_type": "markdown", "metadata": { "id": "4IT_WO6PO0bH" }, "source": [ "If we're only interested in the lowest level pathways, i.e., pathways that are not parents of other pathways in the hierarchy, we can filter by the \"lowest_level\" field in the pathways table." ] }, { "cell_type": "code", "metadata": { "id": "IQcGozM6OzpW" }, "source": [ "# run query and put results in data frame\n", "drug_lowest_pathways = client.query((\"\"\"\n", " SELECT\n", " DISTINCT pathway.*\n", "\n", " FROM\n", " `isb-cgc-bq.reactome_versioned.pathway_v77` as pathway\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` as pe2pathway\n", " -- link pathways to physical entities via intermediate table\n", " ON pathway.stable_id = pe2pathway.pathway_stable_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- link pathways to physical entities\n", " ON pe2pathway.pe_stable_id = pe.stable_id\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", " -- link physical entities to interactions\n", " ON pe.uniprot_id = inter.target_uniprotID\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- link interactions to experiments\n", " ON inter.expID = exp.expID\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.drug_synonyms_v1` AS drugsyn\n", " -- filter for interactions matching drug id\n", " ON inter.drugID = drugsyn.drugID\n", "\n", " WHERE\n", " -- filter by drug name\n", " LOWER(drugsyn.synonym) = LOWER('{drug_name}')\n", "\n", " -- make sure that all assay ranges are at or below 100nM\n", " AND exp.exp_assayValueMedian <= 100\n", " AND (exp.exp_assayValueLow <= 100 OR exp.exp_assayValueLow is null)\n", " AND (exp.exp_assayValueHigh <= 100 OR exp.exp_assayValueHigh is null)\n", "\n", " -- make sure the assay type is known (KD, Ki, IC50, or EC50)\n", " AND exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", "\n", " -- limit to just experiments in humans\n", " AND inter.targetSpecies = 'Homo sapiens'\n", "\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " AND pe2pathway.evidence_code = 'TAS' \n", " \n", " -- filter to include just lowest level pathways\n", " AND pathway.lowest_level = TRUE\n", " ORDER BY pathway.name ASC \n", "\"\"\").format(\n", " drug_name=drug_name\n", ")).result().to_dataframe()" ], "execution_count": 17, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 589 }, "id": "q5bZg8w6Pn7Q", "outputId": "3cdecae6-892b-458f-e11e-dfe7df316de6" }, "source": [ "# display data frame\n", "drug_lowest_pathways" ], "execution_count": 18, "outputs": [ { "output_type": "execute_result", "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", "
stable_idurlnamespecieslowest_level
0R-HSA-389357https://reactome.org/PathwayBrowser/#/R-HSA-38...CD28 dependent PI3K/Akt signalingHomo sapiensTrue
1R-HSA-389359https://reactome.org/PathwayBrowser/#/R-HSA-38...CD28 dependent Vav1 pathwayHomo sapiensTrue
2R-HSA-389513https://reactome.org/PathwayBrowser/#/R-HSA-38...CTLA4 inhibitory signalingHomo sapiensTrue
3R-HSA-8856825https://reactome.org/PathwayBrowser/#/R-HSA-88...Cargo recognition for clathrin-mediated endocy...Homo sapiensTrue
4R-HSA-2219530https://reactome.org/PathwayBrowser/#/R-HSA-22...Constitutive Signaling by Aberrant PI3K in CancerHomo sapiensTrue
..................
75R-HSA-9669934https://reactome.org/PathwayBrowser/#/R-HSA-96...Sunitinib-resistant KIT mutantsHomo sapiensTrue
76R-HSA-9674401https://reactome.org/PathwayBrowser/#/R-HSA-96...Sunitinib-resistant PDGFR mutantsHomo sapiensTrue
77R-HSA-8866910https://reactome.org/PathwayBrowser/#/R-HSA-88...TFAP2 (AP-2) family regulates transcription of...Homo sapiensTrue
78R-HSA-8853884https://reactome.org/PathwayBrowser/#/R-HSA-88...Transcriptional Regulation by VENTXHomo sapiensTrue
79R-HSA-202430https://reactome.org/PathwayBrowser/#/R-HSA-20...Translocation of ZAP-70 to Immunological synapseHomo sapiensTrue
\n", "

80 rows × 5 columns

\n", "
" ], "text/plain": [ " stable_id ... lowest_level\n", "0 R-HSA-389357 ... True\n", "1 R-HSA-389359 ... True\n", "2 R-HSA-389513 ... True\n", "3 R-HSA-8856825 ... True\n", "4 R-HSA-2219530 ... True\n", ".. ... ... ...\n", "75 R-HSA-9669934 ... True\n", "76 R-HSA-9674401 ... True\n", "77 R-HSA-8866910 ... True\n", "78 R-HSA-8853884 ... True\n", "79 R-HSA-202430 ... True\n", "\n", "[80 rows x 5 columns]" ] }, "metadata": {}, "execution_count": 18 } ] }, { "cell_type": "markdown", "metadata": { "id": "ybqSP2aVNE99" }, "source": [ "## Pathway Enrichment Analysis\n", "We can identify pathways that are \"enriched\" with the targets associated with a particular drug. In other words, we can answer the question: given a set of targets for a drug, which pathways contain those targets at a frequency higher than random chance? By calculating the probability that a number of target genes are contained in each pathway, we can identify pathways most likely to be targeted by the drug. \n", "\n", "To do this, we can use a **chi-squared** test to determine if there is a statistically significant difference between the expected frequency of targets in a pathway compared to the observed frequency. \n" ] }, { "cell_type": "code", "metadata": { "id": "sKLy2sxQNIu6" }, "source": [ "# set query parameters\n", "drug_name = 'sorafenib'\n", "lowest_level = True # only show pathways at the lowest level" ], "execution_count": 19, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "jDdXWbOHa32V" }, "source": [ "### Construct SQL Query\n", "\n", "A single query can be used to calculate the chi-squared statistic for all pathways. This query is rather lengthy, but can be broken up into a series of sub-queries to create temporary tables. We step through each query below.\n", "\n", "First, we write a query that simply gets a list of all targets of the drug: " ] }, { "cell_type": "code", "metadata": { "id": "r3NeGvfMbgBp" }, "source": [ "target_list_query = \"\"\"\n", " -- Table that contains a list of all distinct targets of the drug\n", " SELECT\n", " DISTINCT inter.target_uniprotID\n", "\n", " FROM\n", " `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.drug_synonyms_v1` AS drugsyn\n", " -- filter for interactions matching drug id\n", " ON inter.drugID = drugsyn.drugID \n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- filter for interactions with experimental evidence\n", " ON inter.expID = exp.expID \n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- filter for interactions with targets that match a reactome\n", " -- physical entity\n", " ON inter.target_uniprotID = pe.uniprot_id\n", "\n", " WHERE\n", " -- filter by drug name\n", " LOWER(drugsyn.synonym) = LOWER('{drug_name}')\n", "\n", " -- make sure that all assay ranges are at or below 100nM\n", " AND exp.exp_assayValueMedian <= 100\n", " AND (exp.exp_assayValueLow <= 100 OR exp.exp_assayValueLow is null)\n", " AND (exp.exp_assayValueHigh <= 100 OR exp.exp_assayValueHigh is null)\n", "\n", " -- make sure the assay type is known (KD, Ki, IC50, or EC50)\n", " AND exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", "\n", " -- limit to just experiments in humans\n", " AND inter.targetSpecies = 'Homo sapiens'\n", "\"\"\".format(\n", " drug_name=drug_name\n", ").strip(\"\\n\")" ], "execution_count": 20, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wTVNQFJjgQ1y", "outputId": "b46c9057-8a2d-4a9c-ea35-cf0ae6dae03d" }, "source": [ "print(target_list_query)" ], "execution_count": 21, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " -- Table that contains a list of all distinct targets of the drug\n", " SELECT\n", " DISTINCT inter.target_uniprotID\n", "\n", " FROM\n", " `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.drug_synonyms_v1` AS drugsyn\n", " -- filter for interactions matching drug id\n", " ON inter.drugID = drugsyn.drugID \n", "\n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- filter for interactions with experimental evidence\n", " ON inter.expID = exp.expID \n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- filter for interactions with targets that match a reactome\n", " -- physical entity\n", " ON inter.target_uniprotID = pe.uniprot_id\n", "\n", " WHERE\n", " -- filter by drug name\n", " LOWER(drugsyn.synonym) = LOWER('sorafenib')\n", "\n", " -- make sure that all assay ranges are at or below 100nM\n", " AND exp.exp_assayValueMedian <= 100\n", " AND (exp.exp_assayValueLow <= 100 OR exp.exp_assayValueLow is null)\n", " AND (exp.exp_assayValueHigh <= 100 OR exp.exp_assayValueHigh is null)\n", "\n", " -- make sure the assay type is known (KD, Ki, IC50, or EC50)\n", " AND exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", "\n", " -- limit to just experiments in humans\n", " AND inter.targetSpecies = 'Homo sapiens'\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "bY4QCtDfgwBq" }, "source": [ "We then create a query that counts all targets associated with each Reactome pathway. This query depends on the previous \"target_list_query\" sub-query. " ] }, { "cell_type": "code", "metadata": { "id": "H_3xAQdjhJ9s" }, "source": [ "target_pp_query = \"\"\"\n", " -- Table that maps pathways to the total number of drug targets within that pathway\n", " SELECT\n", " COUNT(DISTINCT target_list_query.target_uniprotID) as num_targets,\n", " pathway.stable_id,\n", " pathway.name\n", "\n", " FROM\n", " target_list_query\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- filter for interactions with targets that match a reactome\n", " -- physical entity\n", " ON target_list_query.target_uniprotID = pe.uniprot_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` AS pe2pathway\n", " -- link physical entities to pathways via intermediate table\n", " ON pe.stable_id = pe2pathway.pe_stable_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " -- link physical entities to pathways\n", " ON pe2pathway.pathway_stable_id = pathway.stable_id\n", "\n", " WHERE\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " pe2pathway.evidence_code = 'TAS'\n", "\n", " GROUP BY pathway.stable_id, pathway.name\n", " ORDER BY num_targets DESC\n", "\"\"\".format(\n", " drug_name=drug_name\n", ").strip(\"\\n\")" ], "execution_count": 22, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "v29oHYEukrzy", "outputId": "64c123fa-e9bd-46f1-f9cf-4d8214f90f08" }, "source": [ "print(target_pp_query)" ], "execution_count": 23, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " -- Table that maps pathways to the total number of drug targets within that pathway\n", " SELECT\n", " COUNT(DISTINCT target_list_query.target_uniprotID) as num_targets,\n", " pathway.stable_id,\n", " pathway.name\n", "\n", " FROM\n", " target_list_query\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- filter for interactions with targets that match a reactome\n", " -- physical entity\n", " ON target_list_query.target_uniprotID = pe.uniprot_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` AS pe2pathway\n", " -- link physical entities to pathways via intermediate table\n", " ON pe.stable_id = pe2pathway.pe_stable_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " -- link physical entities to pathways\n", " ON pe2pathway.pathway_stable_id = pathway.stable_id\n", "\n", " WHERE\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " pe2pathway.evidence_code = 'TAS'\n", "\n", " GROUP BY pathway.stable_id, pathway.name\n", " ORDER BY num_targets DESC\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "_XXiAJZUlBxC" }, "source": [ "Now we construct the same queries for proteins that are NOT targets of the drug. These are prefixed with \"not_target\". This query depends on the \"target_list_query\" sub-query." ] }, { "cell_type": "code", "metadata": { "id": "1KyR-_WqlVVn" }, "source": [ "not_target_list_query = \"\"\"\n", " -- Table that contains a list of all proteins that are NOT targets of the drug\n", " -- This query depends on \"target_list_query\", which is created by a previous\n", " -- query.\n", " SELECT\n", " DISTINCT inter.target_uniprotID AS target_uniprotID\n", "\n", " FROM `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " WHERE\n", " inter.targetSpecies = 'Homo sapiens'\n", " \n", " AND inter.target_uniprotID NOT IN (\n", " SELECT target_uniprotID FROM target_list_query\n", " )\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 24, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "92MaTzsAn3es", "outputId": "24f49cc4-b6a7-4900-c762-c8a7f0afe38c" }, "source": [ "print(not_target_list_query)" ], "execution_count": 25, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " -- Table that contains a list of all proteins that are NOT targets of the drug\n", " -- This query depends on \"target_list_query\", which is created by a previous\n", " -- query.\n", " SELECT\n", " DISTINCT inter.target_uniprotID AS target_uniprotID\n", "\n", " FROM `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", "\n", " WHERE\n", " inter.targetSpecies = 'Homo sapiens'\n", " \n", " AND inter.target_uniprotID NOT IN (\n", " SELECT target_uniprotID FROM target_list_query\n", " )\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "mI1SxkGtn-ow" }, "source": [ "not_target_pp_query = \"\"\"\n", " -- Table that maps pathways to the number of proteins that are NOT drug\n", " -- targets in that pathway.\n", " SELECT\n", " COUNT(DISTINCT not_target_list_query.target_uniprotID) AS num_not_targets,\n", " pathway.stable_id,\n", " pathway.name\n", "\n", " FROM not_target_list_query\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " ON not_target_list_query.target_uniprotID = pe.uniprot_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` AS pe2pathway\n", " ON pe.stable_id = pe2pathway.pe_stable_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " ON pe2pathway.pathway_stable_id = pathway.stable_id\n", "\n", " WHERE\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " pe2pathway.evidence_code = 'TAS'\n", "\n", " GROUP BY pathway.stable_id, pathway.name\n", " ORDER BY num_not_targets DESC\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 26, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TgY33Z3ukByC", "outputId": "ee298f11-03f4-43bf-8be8-958d73d3121f" }, "source": [ "print(not_target_pp_query)" ], "execution_count": 27, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " -- Table that maps pathways to the number of proteins that are NOT drug\n", " -- targets in that pathway.\n", " SELECT\n", " COUNT(DISTINCT not_target_list_query.target_uniprotID) AS num_not_targets,\n", " pathway.stable_id,\n", " pathway.name\n", "\n", " FROM not_target_list_query\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " ON not_target_list_query.target_uniprotID = pe.uniprot_id\n", "\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` AS pe2pathway\n", " ON pe.stable_id = pe2pathway.pe_stable_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " ON pe2pathway.pathway_stable_id = pathway.stable_id\n", "\n", " WHERE\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " pe2pathway.evidence_code = 'TAS'\n", "\n", " GROUP BY pathway.stable_id, pathway.name\n", " ORDER BY num_not_targets DESC\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "Z2eN5_UfVgcX" }, "source": [ "For convenience, we create a sub-query to keep the counts of the number of proteins that are targets and the number of proteins that are not targets." ] }, { "cell_type": "code", "metadata": { "id": "VAYDIHsdWLFA" }, "source": [ "target_count_query = \"\"\"\n", " -- Table that contains the counts of # of proteins that are/are not targets\n", " SELECT\n", " target_count,\n", " not_target_count,\n", " target_count + not_target_count AS total_count\n", "\n", " FROM \n", " (SELECT COUNT(*) AS target_count FROM target_list_query),\n", " (SELECT COUNT(*) AS not_target_count FROM not_target_list_query)\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 28, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "qrt8DcUraJm3" }, "source": [ "Now we can create more interesting queries for the contingency matrices that contain the observed and expected values. \n", "\n", "First, the observed contingency table counts for each pathway:" ] }, { "cell_type": "code", "metadata": { "id": "8Dc-wMSZakad" }, "source": [ "observed_query = \"\"\"\n", " -- Table with observed values per pathway in the contingency matrix\n", " SELECT\n", " target_pp_query.num_targets AS in_target_in_pathway,\n", " not_target_pp_query.num_not_targets AS not_target_in_pathway,\n", " target_count_query.target_count - target_pp_query.num_targets AS in_target_not_pathway,\n", " target_count_query.not_target_count - not_target_pp_query.num_not_targets AS not_target_not_pathway,\n", " target_pp_query.stable_id,\n", " target_pp_query.name\n", "\n", " FROM \n", " target_pp_query,\n", " target_count_query\n", "\n", " INNER JOIN not_target_pp_query\n", " ON target_pp_query.stable_id = not_target_pp_query.stable_id\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 29, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "STbl3Toxcq7B" }, "source": [ "Then the observed row and column sums of the contingency table:" ] }, { "cell_type": "code", "metadata": { "id": "4kXNQ4SRcmPK" }, "source": [ "sum_query = \"\"\"\n", " -- Table with summed observed values per pathway in the contingency matrix\n", " SELECT\n", " observed_query.in_target_in_pathway + observed_query.not_target_in_pathway AS pathway_total,\n", " observed_query.in_target_not_pathway + observed_query.not_target_not_pathway AS not_pathway_total,\n", " observed_query.in_target_in_pathway + observed_query.in_target_not_pathway AS target_total,\n", " observed_query.not_target_in_pathway + observed_query.not_target_not_pathway AS not_target_total,\n", " observed_query.stable_id,\n", " observed_query.name\n", "\n", " FROM\n", " observed_query\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 30, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "6HiQlxAudQEk" }, "source": [ "And the expected contingency table values for each pathway:" ] }, { "cell_type": "code", "metadata": { "id": "V0Rj098QdWe6" }, "source": [ "expected_query = \"\"\" \n", " -- Table with the expected values per pathway in the contingency matrix\n", " SELECT \n", " sum_query.target_total * sum_query.pathway_total / target_count_query.total_count AS exp_in_target_in_pathway,\n", " sum_query.not_target_total * sum_query.pathway_total / target_count_query.total_count AS exp_not_target_in_pathway,\n", " sum_query.target_total * sum_query.not_pathway_total / target_count_query.total_count AS exp_in_target_not_pathway,\n", " sum_query.not_target_total * sum_query.not_pathway_total / target_count_query.total_count AS exp_not_target_not_pathway,\n", " sum_query.stable_id,\n", " sum_query.name\n", "\n", " FROM \n", " sum_query, target_count_query\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 31, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wC57CDA6d_4H" }, "source": [ "Finally, we can calculate the chi-squared statistic for each pathway:" ] }, { "cell_type": "code", "metadata": { "id": "kxlrSyiTd_Ia" }, "source": [ "chi_squared_query = \"\"\"\n", " -- Table with the chi-squared statistic for each pathway\n", " SELECT\n", " -- Chi squared statistic with Yates' correction\n", " POW(ABS(observed_query.in_target_in_pathway - expected_query.exp_in_target_in_pathway) - 0.5, 2) / expected_query.exp_in_target_in_pathway \n", " + POW(ABS(observed_query.not_target_in_pathway - expected_query.exp_not_target_in_pathway) - 0.5, 2) / expected_query.exp_not_target_in_pathway\n", " + POW(ABS(observed_query.in_target_not_pathway - expected_query.exp_in_target_not_pathway) - 0.5, 2) / expected_query.exp_in_target_not_pathway\n", " + POW(ABS(observed_query.not_target_not_pathway - expected_query.exp_not_target_not_pathway) - 0.5, 2) / expected_query.exp_not_target_not_pathway\n", " AS chi_squared_stat,\n", " observed_query.stable_id,\n", " observed_query.name\n", "\n", " FROM observed_query\n", "\n", " INNER JOIN expected_query\n", " ON observed_query.stable_id = expected_query.stable_id\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 32, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "lTRfNbLKuarY" }, "source": [ "The final query optionally adds a filter that removes all pathways that are not at the lowest level of the hierarchy. This helps remove non-specific \"pathways\" such as the generic \"Disease\" pathway." ] }, { "cell_type": "code", "metadata": { "id": "IBpHKWxjvCSx" }, "source": [ "lowest_level_filter = \"\"\"\n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " ON chi_squared_query.stable_id = pathway.stable_id\n", "\n", " WHERE pathway.lowest_level = TRUE\n", "\"\"\".strip(\"\\n\")" ], "execution_count": 33, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "V_Qx1J2IvrBT", "outputId": "369415dd-4562-47a1-afa3-f340eb36e7c6" }, "source": [ "print(lowest_level_filter)" ], "execution_count": 34, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " ON chi_squared_query.stable_id = pathway.stable_id\n", "\n", " WHERE pathway.lowest_level = TRUE\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "QsJQyREafSZE" }, "source": [ "Now we can combine all sub-queries into the final query:" ] }, { "cell_type": "code", "metadata": { "id": "dOXXXAmkfcnb" }, "source": [ "final_query = \"\"\"\n", " WITH\n", " target_list_query AS (\n", " {target_list_query}\n", " ),\n", "\n", " target_pp_query AS (\n", " {target_pp_query}\n", " ),\n", "\n", " not_target_list_query AS (\n", " {not_target_list_query}\n", " ),\n", "\n", " not_target_pp_query AS (\n", " {not_target_pp_query}\n", " ),\n", "\n", " target_count_query AS (\n", " {target_count_query}\n", " ),\n", "\n", " observed_query AS (\n", " {observed_query}\n", " ),\n", "\n", " sum_query AS (\n", " {sum_query}\n", " ),\n", "\n", " expected_query AS (\n", " {expected_query}\n", " ),\n", " \n", " chi_squared_query AS (\n", " {chi_squared_query}\n", " )\n", "\n", " SELECT\n", " observed_query.in_target_in_pathway,\n", " observed_query.in_target_not_pathway,\n", " observed_query.not_target_in_pathway,\n", " observed_query.not_target_not_pathway,\n", " chi_squared_query.chi_squared_stat,\n", " chi_squared_query.stable_id,\n", " chi_squared_query.name\n", "\n", " FROM chi_squared_query\n", "\n", " INNER JOIN observed_query\n", " ON chi_squared_query.stable_id = observed_query.stable_id\n", " {lowest_level_filter}\n", " ORDER BY chi_squared_stat DESC\n", "\"\"\".format(\n", " # make final query a little easier to read by removing/adding some white space \n", " target_list_query=\"\\n \".join(target_list_query.strip().splitlines()),\n", " target_pp_query=\"\\n \".join(target_pp_query.strip().splitlines()),\n", " not_target_list_query=\"\\n \".join(not_target_list_query.strip().splitlines()),\n", " not_target_pp_query=\"\\n \".join(not_target_pp_query.strip().splitlines()),\n", " target_count_query=\"\\n \".join(target_count_query.strip().splitlines()),\n", " observed_query=\"\\n \".join(observed_query.strip().splitlines()),\n", " sum_query=\"\\n \".join(sum_query.strip().splitlines()),\n", " expected_query=\"\\n \".join(expected_query.strip().splitlines()),\n", " chi_squared_query=\"\\n \".join(chi_squared_query.strip().splitlines()),\n", " lowest_level_filter=(\n", " \"\\n \"+\"\\n\".join(lowest_level_filter.strip().splitlines())+\"\\n\" if lowest_level else \"\"\n", " )\n", ").strip(\"\\n\")" ], "execution_count": 35, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "fSUidOyTOwMu" }, "source": [ "### Display Final Query" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MfitLyzmgq_P", "outputId": "ea9f957b-ff15-4795-c00f-067d1719ca6c" }, "source": [ "# print the formatted final query\n", "print(final_query)" ], "execution_count": 36, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " WITH\n", " target_list_query AS (\n", " -- Table that contains a list of all distinct targets of the drug\n", " SELECT\n", " DISTINCT inter.target_uniprotID\n", " \n", " FROM\n", " `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", " \n", " INNER JOIN `isb-cgc-bq.targetome_versioned.drug_synonyms_v1` AS drugsyn\n", " -- filter for interactions matching drug id\n", " ON inter.drugID = drugsyn.drugID \n", " \n", " INNER JOIN `isb-cgc-bq.targetome_versioned.experiments_v1` AS exp\n", " -- filter for interactions with experimental evidence\n", " ON inter.expID = exp.expID \n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- filter for interactions with targets that match a reactome\n", " -- physical entity\n", " ON inter.target_uniprotID = pe.uniprot_id\n", " \n", " WHERE\n", " -- filter by drug name\n", " LOWER(drugsyn.synonym) = LOWER('sorafenib')\n", " \n", " -- make sure that all assay ranges are at or below 100nM\n", " AND exp.exp_assayValueMedian <= 100\n", " AND (exp.exp_assayValueLow <= 100 OR exp.exp_assayValueLow is null)\n", " AND (exp.exp_assayValueHigh <= 100 OR exp.exp_assayValueHigh is null)\n", " \n", " -- make sure the assay type is known (KD, Ki, IC50, or EC50)\n", " AND exp.exp_assayType IS NOT NULL\n", " AND exp.exp_assayRelation = '='\n", " \n", " -- limit to just experiments in humans\n", " AND inter.targetSpecies = 'Homo sapiens'\n", " ),\n", "\n", " target_pp_query AS (\n", " -- Table that maps pathways to the total number of drug targets within that pathway\n", " SELECT\n", " COUNT(DISTINCT target_list_query.target_uniprotID) as num_targets,\n", " pathway.stable_id,\n", " pathway.name\n", " \n", " FROM\n", " target_list_query\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " -- filter for interactions with targets that match a reactome\n", " -- physical entity\n", " ON target_list_query.target_uniprotID = pe.uniprot_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` AS pe2pathway\n", " -- link physical entities to pathways via intermediate table\n", " ON pe.stable_id = pe2pathway.pe_stable_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " -- link physical entities to pathways\n", " ON pe2pathway.pathway_stable_id = pathway.stable_id\n", " \n", " WHERE\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " pe2pathway.evidence_code = 'TAS'\n", " \n", " GROUP BY pathway.stable_id, pathway.name\n", " ORDER BY num_targets DESC\n", " ),\n", "\n", " not_target_list_query AS (\n", " -- Table that contains a list of all proteins that are NOT targets of the drug\n", " -- This query depends on \"target_list_query\", which is created by a previous\n", " -- query.\n", " SELECT\n", " DISTINCT inter.target_uniprotID AS target_uniprotID\n", " \n", " FROM `isb-cgc-bq.targetome_versioned.interactions_v1` AS inter\n", " \n", " WHERE\n", " inter.targetSpecies = 'Homo sapiens'\n", " \n", " AND inter.target_uniprotID NOT IN (\n", " SELECT target_uniprotID FROM target_list_query\n", " )\n", " ),\n", "\n", " not_target_pp_query AS (\n", " -- Table that maps pathways to the number of proteins that are NOT drug\n", " -- targets in that pathway.\n", " SELECT\n", " COUNT(DISTINCT not_target_list_query.target_uniprotID) AS num_not_targets,\n", " pathway.stable_id,\n", " pathway.name\n", " \n", " FROM not_target_list_query\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.physical_entity_v77` AS pe\n", " ON not_target_list_query.target_uniprotID = pe.uniprot_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pe_to_pathway_v77` AS pe2pathway\n", " ON pe.stable_id = pe2pathway.pe_stable_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " ON pe2pathway.pathway_stable_id = pathway.stable_id\n", " \n", " WHERE\n", " -- filter by stronger evidence: \"Traceable Author Statement\" \n", " pe2pathway.evidence_code = 'TAS'\n", " \n", " GROUP BY pathway.stable_id, pathway.name\n", " ORDER BY num_not_targets DESC\n", " ),\n", "\n", " target_count_query AS (\n", " -- Table that contains the counts of # of proteins that are/are not targets\n", " SELECT\n", " target_count,\n", " not_target_count,\n", " target_count + not_target_count AS total_count\n", " \n", " FROM \n", " (SELECT COUNT(*) AS target_count FROM target_list_query),\n", " (SELECT COUNT(*) AS not_target_count FROM not_target_list_query)\n", " ),\n", "\n", " observed_query AS (\n", " -- Table with observed values per pathway in the contingency matrix\n", " SELECT\n", " target_pp_query.num_targets AS in_target_in_pathway,\n", " not_target_pp_query.num_not_targets AS not_target_in_pathway,\n", " target_count_query.target_count - target_pp_query.num_targets AS in_target_not_pathway,\n", " target_count_query.not_target_count - not_target_pp_query.num_not_targets AS not_target_not_pathway,\n", " target_pp_query.stable_id,\n", " target_pp_query.name\n", " \n", " FROM \n", " target_pp_query,\n", " target_count_query\n", " \n", " INNER JOIN not_target_pp_query\n", " ON target_pp_query.stable_id = not_target_pp_query.stable_id\n", " ),\n", "\n", " sum_query AS (\n", " -- Table with summed observed values per pathway in the contingency matrix\n", " SELECT\n", " observed_query.in_target_in_pathway + observed_query.not_target_in_pathway AS pathway_total,\n", " observed_query.in_target_not_pathway + observed_query.not_target_not_pathway AS not_pathway_total,\n", " observed_query.in_target_in_pathway + observed_query.in_target_not_pathway AS target_total,\n", " observed_query.not_target_in_pathway + observed_query.not_target_not_pathway AS not_target_total,\n", " observed_query.stable_id,\n", " observed_query.name\n", " \n", " FROM\n", " observed_query\n", " ),\n", "\n", " expected_query AS (\n", " -- Table with the expected values per pathway in the contingency matrix\n", " SELECT \n", " sum_query.target_total * sum_query.pathway_total / target_count_query.total_count AS exp_in_target_in_pathway,\n", " sum_query.not_target_total * sum_query.pathway_total / target_count_query.total_count AS exp_not_target_in_pathway,\n", " sum_query.target_total * sum_query.not_pathway_total / target_count_query.total_count AS exp_in_target_not_pathway,\n", " sum_query.not_target_total * sum_query.not_pathway_total / target_count_query.total_count AS exp_not_target_not_pathway,\n", " sum_query.stable_id,\n", " sum_query.name\n", " \n", " FROM \n", " sum_query, target_count_query\n", " ),\n", " \n", " chi_squared_query AS (\n", " -- Table with the chi-squared statistic for each pathway\n", " SELECT\n", " -- Chi squared statistic with Yates' correction\n", " POW(ABS(observed_query.in_target_in_pathway - expected_query.exp_in_target_in_pathway) - 0.5, 2) / expected_query.exp_in_target_in_pathway \n", " + POW(ABS(observed_query.not_target_in_pathway - expected_query.exp_not_target_in_pathway) - 0.5, 2) / expected_query.exp_not_target_in_pathway\n", " + POW(ABS(observed_query.in_target_not_pathway - expected_query.exp_in_target_not_pathway) - 0.5, 2) / expected_query.exp_in_target_not_pathway\n", " + POW(ABS(observed_query.not_target_not_pathway - expected_query.exp_not_target_not_pathway) - 0.5, 2) / expected_query.exp_not_target_not_pathway\n", " AS chi_squared_stat,\n", " observed_query.stable_id,\n", " observed_query.name\n", " \n", " FROM observed_query\n", " \n", " INNER JOIN expected_query\n", " ON observed_query.stable_id = expected_query.stable_id\n", " )\n", "\n", " SELECT\n", " observed_query.in_target_in_pathway,\n", " observed_query.in_target_not_pathway,\n", " observed_query.not_target_in_pathway,\n", " observed_query.not_target_not_pathway,\n", " chi_squared_query.chi_squared_stat,\n", " chi_squared_query.stable_id,\n", " chi_squared_query.name\n", "\n", " FROM chi_squared_query\n", "\n", " INNER JOIN observed_query\n", " ON chi_squared_query.stable_id = observed_query.stable_id\n", " \n", " INNER JOIN `isb-cgc-bq.reactome_versioned.pathway_v77` AS pathway\n", " ON chi_squared_query.stable_id = pathway.stable_id\n", "\n", " WHERE pathway.lowest_level = TRUE\n", "\n", " ORDER BY chi_squared_stat DESC\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "Fjkbq4FR19in" }, "source": [ "### Execute the Query\n", "\n", "Now execute the query to calculate a chi-squared statistic for each pathway:" ] }, { "cell_type": "code", "metadata": { "id": "Ua5oYRFY1aVu" }, "source": [ "# run query and put results in data frame\n", "chi_squared_pathways = client.query(final_query).result().to_dataframe()" ], "execution_count": 37, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "9Yt-GatY2awc", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "outputId": "ee40e93b-9f65-4091-da0e-166ef56a8b52" }, "source": [ "# display the data frame\n", "chi_squared_pathways" ], "execution_count": 38, "outputs": [ { "output_type": "execute_result", "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", "
in_target_in_pathwayin_target_not_pathwaynot_target_in_pathwaynot_target_not_pathwaychi_squared_statstable_idname
0318367831.192658R-HSA-195399VEGF binds to VEGFR leading to receptor dimeri...
1219168022.942602R-HSA-194306Neurophilin interactions with VEGF and VEGFR
24171466717.232611R-HSA-2219530Constitutive Signaling by Aberrant PI3K in Cancer
3219267916.508319R-HSA-525793Myogenesis
4219467710.101124R-HSA-5674499Negative feedback regulation of MAPK pathway
........................
62120126690.033342R-HSA-1989781PPARA activates gene expression
63120126690.033342R-HSA-2644606Constitutive Signaling by NOTCH1 PEST Domain M...
64120126690.033342R-HSA-2894862Constitutive Signaling by NOTCH1 HD+PEST Domai...
65120206610.027803R-HSA-8939236RUNX1 regulates transcription of genes involve...
66120196620.017134R-HSA-2559580Oxidative Stress Induced Senescence
\n", "

67 rows × 7 columns

\n", "
" ], "text/plain": [ " in_target_in_pathway ... name\n", "0 3 ... VEGF binds to VEGFR leading to receptor dimeri...\n", "1 2 ... Neurophilin interactions with VEGF and VEGFR\n", "2 4 ... Constitutive Signaling by Aberrant PI3K in Cancer\n", "3 2 ... Myogenesis\n", "4 2 ... Negative feedback regulation of MAPK pathway\n", ".. ... ... ...\n", "62 1 ... PPARA activates gene expression\n", "63 1 ... Constitutive Signaling by NOTCH1 PEST Domain M...\n", "64 1 ... Constitutive Signaling by NOTCH1 HD+PEST Domai...\n", "65 1 ... RUNX1 regulates transcription of genes involve...\n", "66 1 ... Oxidative Stress Induced Senescence\n", "\n", "[67 rows x 7 columns]" ] }, "metadata": {}, "execution_count": 38 } ] }, { "cell_type": "markdown", "metadata": { "id": "qM42ztRJDgbM" }, "source": [ "### Calculate P-Values\n", "\n", "BigQuery does not have statistical functions to calculate p-values, so we use the SciPy stats library and update the data frame with a new p-value column:" ] }, { "cell_type": "code", "metadata": { "id": "Beim_ePN2cs7", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "outputId": "68edcc6b-f59b-4416-af2e-30f566575c7f" }, "source": [ "chi_squared_pathways['p_value'] = 1-stats.chi2.cdf(chi_squared_pathways['chi_squared_stat'], 1)\n", "chi_squared_pathways" ], "execution_count": 39, "outputs": [ { "output_type": "execute_result", "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", "
in_target_in_pathwayin_target_not_pathwaynot_target_in_pathwaynot_target_not_pathwaychi_squared_statstable_idnamep_value
0318367831.192658R-HSA-195399VEGF binds to VEGFR leading to receptor dimeri...2.336481e-08
1219168022.942602R-HSA-194306Neurophilin interactions with VEGF and VEGFR1.669114e-06
24171466717.232611R-HSA-2219530Constitutive Signaling by Aberrant PI3K in Cancer3.307106e-05
3219267916.508319R-HSA-525793Myogenesis4.843709e-05
4219467710.101124R-HSA-5674499Negative feedback regulation of MAPK pathway1.481790e-03
...........................
62120126690.033342R-HSA-1989781PPARA activates gene expression8.551126e-01
63120126690.033342R-HSA-2644606Constitutive Signaling by NOTCH1 PEST Domain M...8.551126e-01
64120126690.033342R-HSA-2894862Constitutive Signaling by NOTCH1 HD+PEST Domai...8.551126e-01
65120206610.027803R-HSA-8939236RUNX1 regulates transcription of genes involve...8.675732e-01
66120196620.017134R-HSA-2559580Oxidative Stress Induced Senescence8.958574e-01
\n", "

67 rows × 8 columns

\n", "
" ], "text/plain": [ " in_target_in_pathway ... p_value\n", "0 3 ... 2.336481e-08\n", "1 2 ... 1.669114e-06\n", "2 4 ... 3.307106e-05\n", "3 2 ... 4.843709e-05\n", "4 2 ... 1.481790e-03\n", ".. ... ... ...\n", "62 1 ... 8.551126e-01\n", "63 1 ... 8.551126e-01\n", "64 1 ... 8.551126e-01\n", "65 1 ... 8.675732e-01\n", "66 1 ... 8.958574e-01\n", "\n", "[67 rows x 8 columns]" ] }, "metadata": {}, "execution_count": 39 } ] }, { "cell_type": "markdown", "metadata": { "id": "TqPYE1JZDq5L" }, "source": [ "### Adjust for Multiple Testing\n", "\n", "Since we're testing multiple pathways, we need to adjust the p-value threshold for significance accordingly. The number of pathways tested depends on whether or not we're considering all pathways, or just the lowest level pathways. That count can be obtained with the following query." ] }, { "cell_type": "code", "metadata": { "id": "7KziIxfED8kB" }, "source": [ "# run query and put results in data frame\n", "num_pathways_result = client.query((\"\"\"\n", " SELECT\n", " COUNT (*) AS num_pathways\n", " FROM\n", " `isb-cgc-bq.reactome_versioned.pathway_v77` as pathway\n", " {lowest_level_filter}\n", "\"\"\").format(\n", " lowest_level_filter=(\"WHERE lowest_level = TRUE\" if lowest_level else \"\")\n", ")).result().to_dataframe()" ], "execution_count": 40, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 80 }, "id": "E_7ncwlOEmuG", "outputId": "e3d92d7d-88ed-40c6-9eed-22231db81c38" }, "source": [ "# display data frame\n", "num_pathways_result" ], "execution_count": 41, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
num_pathways
01773
\n", "
" ], "text/plain": [ " num_pathways\n", "0 1773" ] }, "metadata": {}, "execution_count": 41 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7B9__TlA4M9u", "outputId": "5189244f-d1ae-4668-df2f-7d71fe3d98b0" }, "source": [ "# adjust significance threshold for multiple testing, using a p-value of 0.01\n", "num_pathways = num_pathways_result['num_pathways'][0]\n", "significance_threshold = 0.01/num_pathways\n", "print('Significance Threshold: {}'.format(significance_threshold))\n", "\n", "# find all pathways that meet the significance criteria after adjusting for\n", "# multiple testing\n", "significant_pathway_index = chi_squared_pathways['p_value']\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
in_target_in_pathwayin_target_not_pathwaynot_target_in_pathwaynot_target_not_pathwaychi_squared_statstable_idnamep_value
0318367831.192658R-HSA-195399VEGF binds to VEGFR leading to receptor dimeri...2.336481e-08
1219168022.942602R-HSA-194306Neurophilin interactions with VEGF and VEGFR1.669114e-06
\n", "" ], "text/plain": [ " in_target_in_pathway ... p_value\n", "0 3 ... 2.336481e-08\n", "1 2 ... 1.669114e-06\n", "\n", "[2 rows x 8 columns]" ] }, "metadata": {}, "execution_count": 43 } ] }, { "cell_type": "markdown", "metadata": { "id": "if9v8H2T12cp" }, "source": [ "The results of this analysis suggest that at least two pathways may be affected by the drug sorafenib, based on the known targets of the sorafenib." ] }, { "cell_type": "markdown", "metadata": { "id": "s31t8Ed-7cfK" }, "source": [ "### Verify Results by Comparing to SciPy Chi-Squared Function\n", "\n", "We verify these BigQuery results by calculating the same chi-squared statistic using the SciPy package. Comparing the SciPy p-values and statistics to those of the BigQuery-derived results confirms that they are identical." ] }, { "cell_type": "code", "metadata": { "id": "-BPVmeMF1CGO" }, "source": [ "# extract observed values from bigquery result\n", "observed = chi_squared_pathways[[\n", " 'in_target_in_pathway',\n", " 'in_target_not_pathway',\n", " 'not_target_in_pathway',\n", " 'not_target_not_pathway'\n", "]]\n", "\n", "# calculate the chi-squared statistic using the scipy stats package \n", "chi2_stat = []\n", "chi2_pvalue = []\n", "for index, row in observed.iterrows():\n", " stat, pvalue, _, _ = stats.chi2_contingency(\n", " np.reshape(np.matrix(row), (2,2)), correction=True\n", " )\n", " chi2_stat.append(stat)\n", " chi2_pvalue.append(pvalue)\n", "\n", "# add columns to the original data frame\n", "chi_squared_pathways['scipy_stat'] = chi2_stat\n", "chi_squared_pathways['scipy_p_value'] = chi2_pvalue" ], "execution_count": 44, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "WWgNFm6w36s9", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "outputId": "7d2e6fb9-35e4-425b-cc81-7a3c5ee668c7" }, "source": [ "# display the updated data frame\n", "chi_squared_pathways" ], "execution_count": 45, "outputs": [ { "output_type": "execute_result", "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", "
in_target_in_pathwayin_target_not_pathwaynot_target_in_pathwaynot_target_not_pathwaychi_squared_statstable_idnamep_valuescipy_statscipy_p_value
0318367831.192658R-HSA-195399VEGF binds to VEGFR leading to receptor dimeri...2.336481e-0831.1926582.336481e-08
1219168022.942602R-HSA-194306Neurophilin interactions with VEGF and VEGFR1.669114e-0622.9426021.669114e-06
24171466717.232611R-HSA-2219530Constitutive Signaling by Aberrant PI3K in Cancer3.307106e-0517.2326113.307106e-05
3219267916.508319R-HSA-525793Myogenesis4.843709e-0516.5083194.843709e-05
4219467710.101124R-HSA-5674499Negative feedback regulation of MAPK pathway1.481790e-0310.1011241.481790e-03
.................................
62120126690.033342R-HSA-1989781PPARA activates gene expression8.551126e-010.0333428.551126e-01
63120126690.033342R-HSA-2644606Constitutive Signaling by NOTCH1 PEST Domain M...8.551126e-010.0333428.551126e-01
64120126690.033342R-HSA-2894862Constitutive Signaling by NOTCH1 HD+PEST Domai...8.551126e-010.0333428.551126e-01
65120206610.027803R-HSA-8939236RUNX1 regulates transcription of genes involve...8.675732e-010.0278038.675732e-01
66120196620.017134R-HSA-2559580Oxidative Stress Induced Senescence8.958574e-010.0171348.958574e-01
\n", "

67 rows × 10 columns

\n", "
" ], "text/plain": [ " in_target_in_pathway in_target_not_pathway ... scipy_stat scipy_p_value\n", "0 3 18 ... 31.192658 2.336481e-08\n", "1 2 19 ... 22.942602 1.669114e-06\n", "2 4 17 ... 17.232611 3.307106e-05\n", "3 2 19 ... 16.508319 4.843709e-05\n", "4 2 19 ... 10.101124 1.481790e-03\n", ".. ... ... ... ... ...\n", "62 1 20 ... 0.033342 8.551126e-01\n", "63 1 20 ... 0.033342 8.551126e-01\n", "64 1 20 ... 0.033342 8.551126e-01\n", "65 1 20 ... 0.027803 8.675732e-01\n", "66 1 20 ... 0.017134 8.958574e-01\n", "\n", "[67 rows x 10 columns]" ] }, "metadata": {}, "execution_count": 45 } ] }, { "cell_type": "markdown", "metadata": { "id": "6dXWAZhLPEcH" }, "source": [ "# Conclusion\n", "\n", "This notebook demonstrated an integrated analysis of the Targetome and Reactome BigQuery datasets for identification of drug targets, identification of cancer pathways targeted by a drug, and pathway enrichment analysis using a chi-squared statistic." ] } ] }