{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Regulome Explorer Notebook \n", "\n", "This notebook computes significant association scores between pairwise data types available in the PanCancer Atlas dataset of ISB-CGC. The specific statistical tests implmeneted are described ['here'](https://isb-cancer-genomics-cloud.readthedocs.io/en/latest/sections/RegulomeExplorerNotebooks.html#standard-pairwise-statistics), and a description of the original Regulomen Explorer is avaiable ['here'](https://isb-cancer-genomics-cloud.readthedocs.io/en/latest/sections/RegulomeExplorerNotebooks.html#id5).\n", "\n", "The output of the notebook is a table of significacnt associations specified by correltions and p-values. This notebook also performs a more detailed analysis from a user specified pair of features names generating figures and additional statistics." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Authentication\n", "The first step is to authorize 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) and alternative authentication methods can be found [here](https://googleapis.github.io/google-cloud-python/latest/core/auth.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import Python libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "%matplotlib inline\n", "from google.cloud import bigquery\n", "import pandas as pd\n", "import re_module.bq_functions as regulome" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Specify Parameters\n", "The parameters for this experiment are the cancer type (study), a list of genes, a couple of molecular features (), the significance level, and the minimum number of samples required for the statistical analysis. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d67f15cabead4ce2b0c07e971942e4df", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Select Feature1 '), Dropdown(options=('Gene Expression', 'Somatic Copy Num…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "36c0b62829b7434ca629eeedd0662244", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Feature1 labels '), Text(value='IGF2, ADAM6', placeholder='Type gene names…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8056c84c1e7040cfae961cd70455d65a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Select Feature2 '), Dropdown(options=('Gene Expression', 'Somatic Mutation…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "34f11c505ac34b95936a6e862a60d2af", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Select a study '), Dropdown(index=30, options=('ACC', 'BLCA', 'BRCA', 'CES…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "454af58f8a9c4f35aa3c8de863605543", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Significance level '), SelectionSlider(continuous_update=False, index=1, o…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3c536964291c45b487f4587bf6995294", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Minimum number of samples'), IntSlider(value=25, max=50, min=5)))" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d2a6f40c1c6d4b01bdbec375c743bbe6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Cohort list'), FileUpload(value={}, description='Upload')))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "[study, feature1, feature2, gene_names, size, cohortlist, significance] = regulome.makeWidgets()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Build the query\n", "The Bigquery query to compute associations between feature 1 and 2 are created using functions in the 'regulome' module. Please refer to our github repository to access the notebooks with description of the methods used for each possible combination of features available in TCGA: https://github.com/isb-cgc/Community-Notebooks/tree/master/RegulomeExplorer." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CREATE TEMP FUNCTION erfcc(x FLOAT64)\n", "RETURNS FLOAT64\n", "LANGUAGE js AS \"\"\"\n", " \n", " var t; \n", " var z; \n", " var ans;\n", " z = Math.abs(x) ;\n", " t = 1.0 / (1.0 + 0.5*z ) ;\n", " \n", " ans= t * Math.exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+\n", "t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+\n", "t*(-0.82215223+t*0.17087277)))))))));\n", " \n", " if ( x >= 0 ) {\n", " return ans ;\n", " } else {\n", " return 2.0 - ans;\n", " }\n", "\"\"\";\n", "\n", "WITH\n", "table1 AS (\n", "SELECT\n", " symbol,\n", " (RANK() OVER (PARTITION BY symbol ORDER BY data ASC)) + (COUNT(*) OVER ( PARTITION BY symbol, CAST(data as STRING)) - 1)/2.0 AS rnkdata,\n", " ParticipantBarcode\n", "FROM (\n", " SELECT\n", " Symbol AS symbol, \n", " AVG( LOG10( normalized_count + 1 ) ) AS data,\n", " ParticipantBarcode AS ParticipantBarcode\n", " FROM `pancancer-atlas.Filtered.EBpp_AdjustPANCAN_IlluminaHiSeq_RNASeqV2_genExp_filtered`\n", " WHERE Study = 'PAAD' # cohort \n", " AND Symbol IN UNNEST(@GENELIST) # labels \n", " AND normalized_count IS NOT NULL \n", " GROUP BY\n", " ParticipantBarcode, symbol\n", " )\n", ")\n", ",\n", "table2 AS (\n", "SELECT\n", " symbol,\n", " (RANK() OVER (PARTITION BY symbol ORDER BY data ASC)) + (COUNT(*) OVER ( PARTITION BY symbol, CAST(data as STRING)) - 1)/2.0 AS rnkdata,\n", " ParticipantBarcode\n", "FROM (\n", " SELECT\n", " Symbol AS symbol, \n", " AVG( LOG10( normalized_count + 1 ) ) AS data,\n", " ParticipantBarcode AS ParticipantBarcode\n", " FROM `pancancer-atlas.Filtered.EBpp_AdjustPANCAN_IlluminaHiSeq_RNASeqV2_genExp_filtered`\n", " WHERE Study = 'PAAD' # cohort \n", " AND Symbol IS NOT NULL # labels \n", " AND normalized_count IS NOT NULL \n", " GROUP BY\n", " ParticipantBarcode, symbol\n", " )\n", ")\n", ",\n", "summ_table AS (\n", "SELECT \n", " n1.symbol as symbol1,\n", " n2.symbol as symbol2,\n", " COUNT( n1.ParticipantBarcode ) as n,\n", " CORR(n1.rnkdata , n2.rnkdata) as correlation\n", " \n", "FROM\n", " table1 AS n1\n", "INNER JOIN\n", " table2 AS n2\n", "ON\n", " n1.ParticipantBarcode = n2.ParticipantBarcode\n", " AND n2.symbol NOT IN UNNEST(@GENELIST)\n", "GROUP BY\n", " symbol1, symbol2\n", "UNION ALL\n", "SELECT \n", " n1.symbol as symbol1,\n", " n2.symbol as symbol2,\n", " COUNT( n1.ParticipantBarcode ) as n,\n", " CORR(n1.rnkdata , n2.rnkdata) as correlation\n", " \n", "FROM\n", " table1 AS n1\n", "INNER JOIN\n", " table1 AS n2\n", "ON\n", " n1.ParticipantBarcode = n2.ParticipantBarcode\n", " AND n1.symbol < n2.symbol\n", "GROUP BY\n", " symbol1, symbol2\n", ")\n", "SELECT symbol1, symbol2, n, correlation\n", "FROM summ_table\n", "WHERE \n", " n > 25 AND n < 500 AND NOT IS_NAN( correlation)\n", "GROUP BY 1,2,3,4\n", "HAVING `cgc-05-0042.functions.significance_level_ttest2`(n-2, ABS(correlation)*SQRT((n-2)/((1+correlation)*(1-correlation)))) <= 0.05\n", "UNION ALL\n", "SELECT symbol1, symbol2, n, correlation \n", "FROM summ_table\n", "WHERE \n", " n >= 500 AND NOT IS_NAN( correlation)\n", "GROUP BY 1,2,3,4\n", "HAVING erfcc( ABS(correlation)*SQRT(n)/1.414213562373095 ) <= 0.05\n", "ORDER BY ABS(correlation) DESC\n", "\n" ] } ], "source": [ "SampleList, PatientList = regulome.readcohort( cohortlist )\n", "LabelList = [ x.strip() for x in gene_names.value.split(',') ]\n", "\n", "funct1 = regulome.approx_significant_level( )\n", "table1, table2 = regulome.get_feature_tables(study.value,feature1.value,feature2.value,SampleList,PatientList,LabelList)\n", "str_summarized = regulome.get_summarized_pancanatlas( feature1.value, feature2.value )\n", "str_stats = regulome.get_stat_pancanatlas(feature1.value, feature2.value, size.value, significance.value )\n", "\n", "sql = (funct1 + 'WITH' + table1 + ',' + table2 + ',' + str_summarized + str_stats)\n", "print(sql)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run the Bigquery" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " in runQuery ... \n", " this query processed 7757877633 bytes \n", " Approx. elpased time : 5605 miliseconds \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", "
symbol1symbol2ncorrelationp-value
0SMAD4WDR71510.7387070.000000
1SMAD4ZNF241510.7324360.000000
2SMAD4TSHZ11510.7272850.000000
3SMAD4DTNA1510.7239870.000000
4SMAD4ELAC11510.7143810.000000
..................
11757SMAD4FAM111A151-0.1599060.049848
11758SMAD4ACER31510.1598780.049888
11759SMAD4LBR1510.1598400.049944
11760SMAD4TIMD41510.1598300.049957
11761SMAD4SSX4151-0.1598200.049972
\n", "

11762 rows × 5 columns

\n", "
" ], "text/plain": [ " symbol1 symbol2 n correlation p-value\n", "0 SMAD4 WDR7 151 0.738707 0.000000\n", "1 SMAD4 ZNF24 151 0.732436 0.000000\n", "2 SMAD4 TSHZ1 151 0.727285 0.000000\n", "3 SMAD4 DTNA 151 0.723987 0.000000\n", "4 SMAD4 ELAC1 151 0.714381 0.000000\n", "... ... ... ... ... ...\n", "11757 SMAD4 FAM111A 151 -0.159906 0.049848\n", "11758 SMAD4 ACER3 151 0.159878 0.049888\n", "11759 SMAD4 LBR 151 0.159840 0.049944\n", "11760 SMAD4 TIMD4 151 0.159830 0.049957\n", "11761 SMAD4 SSX4 151 -0.159820 0.049972\n", "\n", "[11762 rows x 5 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bqclient = bigquery.Client()\n", "df_results = regulome.runQuery ( bqclient, sql, LabelList, SampleList, PatientList, dryRun=False )\n", "regulome.pvalues_dataframe( df_results )\n", "df_results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analyze a pair of labels\n", "From the table above please select a pair of features names to perform a statistical analysis and display the data. You can print the variable 'pair_query' to obtain the query used to retrieve the data. \n", "**pair_query** is the query used to retreive the necessary data for the statistical test. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "07e247b24bd04c419e9872a89cc9469b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Type label 1 '), Text(value='', placeholder='label name')))" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "86310807c04c4b7b836c4a12bf647f74", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value='Type label 2 '), Text(value='', placeholder='label name')))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "[name1 , name2 ] = regulome.makeWidgetsPair()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " in runQuery ... \n", " this query processed 7757877633 bytes \n", " Approx. elpased time : 1264 miliseconds \n", "SpearmanrResult(correlation=0.7387068665040083, pvalue=2.6102587012639067e-27)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pair_query = regulome.get_query_pair(name1.value,name2.value,study.value,SampleList,feature1.value,feature2.value)\n", "#print(pair_query)\n", "df_pair = regulome.runQuery( bqclient, pair_query, LabelList, SampleList, PatientList, dryRun=False )\n", "regulome.plot_statistics_pair ( df_pair, feature2.value, name1.value, name2.value, size.value )\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }