{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Correlations_Protein_and_Gene_expression-CPTAC.ipynb", "provenance": [], "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "9h1bEFTSoGyu" }, "source": [ "# Compute correlations of protein and gene expression in CPTAC\n", "\n", "\n", "```\n", "Title: Correlations of protein and gene expression in CPTAC \n", "Author: Boris Aguilar\n", "Created: 05-23-2021\n", "Purpose: Compute correlations between proteomic and gene expression available in the PDC \n", "Notes: Runs in Google Colab \n", "```\n", "This notebook uses BigQuery to compute Pearson correlation between protein and gene expression for all the genes in the BigQuery tables of the PDC dataset. We used CCRCC as example; but this can be changed easily for other cancer types." ] }, { "cell_type": "markdown", "metadata": { "id": "BCpeagmasFFs" }, "source": [ "## Modules" ] }, { "cell_type": "code", "metadata": { "id": "losf8GRlZvcM" }, "source": [ "from google.cloud import bigquery\n", "from google.colab import auth\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "import pandas_gbq" ], "execution_count": 1, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "CnzNWzE3zS0H" }, "source": [ "## Google 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.dev/python/google-api-core/latest/auth.html).\n", "\n", "Moreover you need to [create a google cloud](https://cloud.google.com/resource-manager/docs/creating-managing-projects#console) project to be able to run BigQuery queries." ] }, { "cell_type": "code", "metadata": { "id": "2ySNqCskzONP" }, "source": [ "auth.authenticate_user()\n", "my_project_id = \"\" # write your project id here\n", "bqclient = bigquery.Client( my_project_id )" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "v0y0FkrvBn4L" }, "source": [ "## Retrieve protein expression of CCRCC\n", "The following query will retrieve protein expression and case IDs from CPTAC table `quant_proteome_CPTAC_CCRCC_discovery_study_pdc_current`. Moreover, to label samples as Tumor or Normal samples we join the table with metadata available in the table `aliquot_to_case_mapping_pdc_current` " ] }, { "cell_type": "code", "metadata": { "id": "E2b6HN_cu-cn" }, "source": [ "prot = '''quant AS (\n", " SELECT meta.sample_submitter_id, meta.sample_type, quant.case_id, quant.aliquot_id, quant.gene_symbol, \n", " CAST(quant.protein_abundance_log2ratio AS FLOAT64) AS protein_abundance_log2ratio \n", " FROM `isb-cgc-bq.CPTAC.quant_proteome_CPTAC_CCRCC_discovery_study_pdc_current` as quant\n", " JOIN `isb-cgc-bq.PDC_metadata.aliquot_to_case_mapping_current` as meta\n", " ON quant.case_id = meta.case_id\n", " AND quant.aliquot_id = meta.aliquot_id\n", " AND meta.sample_type IN ('Primary Tumor','Solid Tissue Normal')\n", ")'''" ], "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "G_TjJAtgvtA2" }, "source": [ "## Retrieve gene expression of CCRCC\n", "Next we retrieve gene expression data from the table `CPTAC.RNAseq_hg38_gdc_current` which contains RNA-seq data from all tumor types of CPTAC. Moreover we join the data with the metadata table `aliquot_to_case_mapping_pdc_current` to label samples to cancer or normal tissue" ] }, { "cell_type": "code", "metadata": { "id": "eAaHSre1v2cV" }, "source": [ "gexp = '''gexp AS (\n", " SELECT DISTINCT meta.sample_submitter_id, meta.sample_type, rnaseq.gene_name , LOG(rnaseq.HTSeq__FPKM + 1) as HTSeq__FPKM \n", " FROM `isb-cgc-bq.CPTAC.RNAseq_hg38_gdc_current` as rnaseq\n", " JOIN `isb-cgc-bq.PDC_metadata.aliquot_to_case_mapping_current` as meta\n", " ON meta.sample_submitter_id = rnaseq.sample_barcode\n", ")'''" ], "execution_count": 4, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "4IW69UHBwu2s" }, "source": [ "## Compute Pearson correlation\n", "The following query join the protein and gene expression data and compute correlation for each gene and semple type (normal or tumor)." ] }, { "cell_type": "code", "metadata": { "id": "kDSJ47hbw28a" }, "source": [ "corr = '''correlation AS (\n", " SELECT quant.gene_symbol, gexp.sample_type, COUNT(*) as n, CORR(protein_abundance_log2ratio,HTSeq__FPKM) as corr \n", " FROM quant JOIN gexp \n", " ON quant.sample_submitter_id = gexp.sample_submitter_id\n", " AND gexp.gene_name = quant.gene_symbol\n", " AND gexp.sample_type = quant.sample_type\n", " GROUP BY quant.gene_symbol, gexp.sample_type\n", ")'''" ], "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "TKStdGWhxsYQ" }, "source": [ "## Compute p-values " ] }, { "cell_type": "code", "metadata": { "id": "g3QdUOQqxz3X" }, "source": [ "pval = '''SELECT gene_symbol, sample_type, n, corr,\n", " `cgc-05-0042.functions.corr_pvalue`(corr, n) as p\n", "FROM correlation\n", "WHERE ABS(corr) <= 1.0'''" ], "execution_count": 6, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wGjeJAGuyqbA" }, "source": [ "## Adjust p-values\n", "The following commands generate the final query which will be sent to Google to retrieve the final data that include the correlation for each gene. The query also includes a function (BHmultipletests) that adjusts the computed p values with the Benjamini-Hochberg method for multipletest correction." ] }, { "cell_type": "code", "metadata": { "id": "woduO0K9ywOM" }, "source": [ "mysql = '''DECLARE Nrows INT64;\n", "CREATE TEMP TABLE PearsonCorrelation AS\n", "WITH {0}, \n", "{1}, \n", "{2} \n", "{3}\n", ";\n", "# Adjust pvalues for multiple tests\n", "SET Nrows = ( SELECT COUNT(*) FROM PearsonCorrelation );\n", "CALL `cgc-05-0042.functions.BHmultipletests`( 'PearsonCorrelation', 'p', Nrows )\n", "'''.format(prot, gexp, corr, pval)" ], "execution_count": 7, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "BcNc2B_hMmfn" }, "source": [ "## Run the query to retrieve the analysis " ] }, { "cell_type": "code", "metadata": { "id": "0RzNRC16Mv11" }, "source": [ "job_config = bigquery.QueryJobConfig()\n", "job_config.use_legacy_sql = False\n", "try:\n", " query_job = bqclient.query ( mysql, job_config=job_config )\n", "except:\n", " print ( \" FATAL ERROR: query execution failed \" )\n", "mydf = query_job.to_dataframe()" ], "execution_count": 8, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "WUIdZMflFgTX" }, "source": [ "The following command displays the results." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 419 }, "id": "9840zbeiFMhG", "outputId": "805f0bb8-4f05-4968-a190-b1f724c5d130" }, "source": [ "mydf" ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gene_symbolsample_typencorrpp_adj
0ANXA13Primary Tumor1000.9559711.205495e-531.767496e-49
1MYO1BPrimary Tumor1000.9529692.759249e-522.022806e-48
2CES1Primary Tumor1000.9494418.494844e-514.151714e-47
3PHYHIPLPrimary Tumor1000.9428662.748145e-481.007332e-44
4LGALS3Primary Tumor1000.9414928.429648e-482.471910e-44
.....................
14657AHSA1Solid Tissue Normal750.0002789.981109e-019.983833e-01
14658CICPrimary Tumor100-0.0002049.983915e-019.985958e-01
14659SARM1Solid Tissue Normal750.0002009.986388e-019.987750e-01
14660C7orf26Solid Tissue Normal750.0001319.991117e-019.991798e-01
14661TFB1MSolid Tissue Normal75-0.0000069.999588e-019.999588e-01
\n", "

14662 rows × 6 columns

\n", "
" ], "text/plain": [ " gene_symbol sample_type ... p p_adj\n", "0 ANXA13 Primary Tumor ... 1.205495e-53 1.767496e-49\n", "1 MYO1B Primary Tumor ... 2.759249e-52 2.022806e-48\n", "2 CES1 Primary Tumor ... 8.494844e-51 4.151714e-47\n", "3 PHYHIPL Primary Tumor ... 2.748145e-48 1.007332e-44\n", "4 LGALS3 Primary Tumor ... 8.429648e-48 2.471910e-44\n", "... ... ... ... ... ...\n", "14657 AHSA1 Solid Tissue Normal ... 9.981109e-01 9.983833e-01\n", "14658 CIC Primary Tumor ... 9.983915e-01 9.985958e-01\n", "14659 SARM1 Solid Tissue Normal ... 9.986388e-01 9.987750e-01\n", "14660 C7orf26 Solid Tissue Normal ... 9.991117e-01 9.991798e-01\n", "14661 TFB1M Solid Tissue Normal ... 9.999588e-01 9.999588e-01\n", "\n", "[14662 rows x 6 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "Gz12y0AexsoO" }, "source": [ "## Histogram of correlations\n", "The results above show the correlation between protein and gene expression for tumors and normal samples. Next we show two histograms of these correlations, one for tumor and the other for normal samples. Moreover we colored the bars by genes that have significant correlations (significant level = 0.01). " ] }, { "cell_type": "code", "metadata": { "id": "ImOZyU1RnPvr", "colab": { "base_uri": "https://localhost:8080/", "height": 386 }, "outputId": "f1fad544-6ba9-454e-95a0-03aed770736a" }, "source": [ "s_level = 0.01 \n", "mydf['significant'] = np.where( mydf['p_adj'] <= s_level, True, False)\n", "sns.displot(data=mydf, x=\"corr\", hue=\"significant\", multiple=\"stack\", binwidth=0.1, col='sample_type')" ], "execution_count": 10, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 10 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] } ] }