Created
August 29, 2017 18:23
-
-
Save olgabot/5e7cbd229664f2d34e086865228803b8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"\n", | |
" <div class=\"bk-root\">\n", | |
" <a href=\"http://bokeh.pydata.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n", | |
" <span id=\"899b97f1-54be-4e1d-a535-3ad9711aa018\">Loading BokehJS ...</span>\n", | |
" </div>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"application/javascript": [ | |
"\n", | |
"(function(global) {\n", | |
" function now() {\n", | |
" return new Date();\n", | |
" }\n", | |
"\n", | |
" var force = true;\n", | |
"\n", | |
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", | |
" window._bokeh_onload_callbacks = [];\n", | |
" window._bokeh_is_loading = undefined;\n", | |
" }\n", | |
"\n", | |
"\n", | |
" \n", | |
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n", | |
" window._bokeh_timeout = Date.now() + 5000;\n", | |
" window._bokeh_failed_load = false;\n", | |
" }\n", | |
"\n", | |
" var NB_LOAD_WARNING = {'data': {'text/html':\n", | |
" \"<div style='background-color: #fdd'>\\n\"+\n", | |
" \"<p>\\n\"+\n", | |
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", | |
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", | |
" \"</p>\\n\"+\n", | |
" \"<ul>\\n\"+\n", | |
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n", | |
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n", | |
" \"</ul>\\n\"+\n", | |
" \"<code>\\n\"+\n", | |
" \"from bokeh.resources import INLINE\\n\"+\n", | |
" \"output_notebook(resources=INLINE)\\n\"+\n", | |
" \"</code>\\n\"+\n", | |
" \"</div>\"}};\n", | |
"\n", | |
" function display_loaded() {\n", | |
" if (window.Bokeh !== undefined) {\n", | |
" var el = document.getElementById(\"899b97f1-54be-4e1d-a535-3ad9711aa018\");\n", | |
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n", | |
" } else if (Date.now() < window._bokeh_timeout) {\n", | |
" setTimeout(display_loaded, 100)\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" function run_callbacks() {\n", | |
" try {\n", | |
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", | |
" }\n", | |
" finally {\n", | |
" delete window._bokeh_onload_callbacks\n", | |
" }\n", | |
" console.info(\"Bokeh: all callbacks have finished\");\n", | |
" }\n", | |
"\n", | |
" function load_libs(js_urls, callback) {\n", | |
" window._bokeh_onload_callbacks.push(callback);\n", | |
" if (window._bokeh_is_loading > 0) {\n", | |
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", | |
" return null;\n", | |
" }\n", | |
" if (js_urls == null || js_urls.length === 0) {\n", | |
" run_callbacks();\n", | |
" return null;\n", | |
" }\n", | |
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", | |
" window._bokeh_is_loading = js_urls.length;\n", | |
" for (var i = 0; i < js_urls.length; i++) {\n", | |
" var url = js_urls[i];\n", | |
" var s = document.createElement('script');\n", | |
" s.src = url;\n", | |
" s.async = false;\n", | |
" s.onreadystatechange = s.onload = function() {\n", | |
" window._bokeh_is_loading--;\n", | |
" if (window._bokeh_is_loading === 0) {\n", | |
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n", | |
" run_callbacks()\n", | |
" }\n", | |
" };\n", | |
" s.onerror = function() {\n", | |
" console.warn(\"failed to load library \" + url);\n", | |
" };\n", | |
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", | |
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n", | |
" }\n", | |
" };var element = document.getElementById(\"899b97f1-54be-4e1d-a535-3ad9711aa018\");\n", | |
" if (element == null) {\n", | |
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid '899b97f1-54be-4e1d-a535-3ad9711aa018' but no matching script tag was found. \")\n", | |
" return false;\n", | |
" }\n", | |
"\n", | |
" var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.6.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.6.min.js\"];\n", | |
"\n", | |
" var inline_js = [\n", | |
" function(Bokeh) {\n", | |
" Bokeh.set_log_level(\"info\");\n", | |
" },\n", | |
" \n", | |
" function(Bokeh) {\n", | |
" \n", | |
" },\n", | |
" \n", | |
" function(Bokeh) {\n", | |
" \n", | |
" document.getElementById(\"899b97f1-54be-4e1d-a535-3ad9711aa018\").textContent = \"BokehJS is loading...\";\n", | |
" },\n", | |
" function(Bokeh) {\n", | |
" console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.6.min.css\");\n", | |
" Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.6.min.css\");\n", | |
" console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.6.min.css\");\n", | |
" Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.6.min.css\");\n", | |
" }\n", | |
" ];\n", | |
"\n", | |
" function run_inline_js() {\n", | |
" \n", | |
" if ((window.Bokeh !== undefined) || (force === true)) {\n", | |
" for (var i = 0; i < inline_js.length; i++) {\n", | |
" inline_js[i](window.Bokeh);\n", | |
" }if (force === true) {\n", | |
" display_loaded();\n", | |
" }} else if (Date.now() < window._bokeh_timeout) {\n", | |
" setTimeout(run_inline_js, 100);\n", | |
" } else if (!window._bokeh_failed_load) {\n", | |
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", | |
" window._bokeh_failed_load = true;\n", | |
" } else if (force !== true) {\n", | |
" var cell = $(document.getElementById(\"899b97f1-54be-4e1d-a535-3ad9711aa018\")).parents('.cell').data().cell;\n", | |
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", | |
" }\n", | |
"\n", | |
" }\n", | |
"\n", | |
" if (window._bokeh_is_loading === 0) {\n", | |
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", | |
" run_inline_js();\n", | |
" } else {\n", | |
" load_libs(js_urls, function() {\n", | |
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", | |
" run_inline_js();\n", | |
" });\n", | |
" }\n", | |
"}(this));" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# Interactive jupyter widgets - use IntSlider directly for more control\n", | |
"from ipywidgets import IntSlider, interact\n", | |
"\n", | |
"# Convert RGB colors to hex cor portability\n", | |
"from matplotlib.colors import rgb2hex\n", | |
"\n", | |
"# Visualize networks\n", | |
"import networkx\n", | |
"\n", | |
"# Numerical python\n", | |
"import numpy as np\n", | |
"\n", | |
"# Pandas for dataframes\n", | |
"import pandas as pd\n", | |
"\n", | |
"# K-nearest neighbors cell clustering from Dana Pe'er's lab\n", | |
"import phenograph\n", | |
"\n", | |
"# Make color palettes\n", | |
"import seaborn as sns\n", | |
"\n", | |
"# Bokeh - interactive plotting in the browser\n", | |
"from bokeh.plotting import figure, show, output_file\n", | |
"from bokeh.models import HoverTool, ColumnDataSource\n", | |
"from bokeh.models.widgets import Panel, Tabs\n", | |
"from bokeh.layouts import widgetbox\n", | |
"from bokeh.io import output_notebook\n", | |
"\n", | |
"# This line is required for the plots to appear in the notebooks\n", | |
"output_notebook()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import xarray as xr" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"\n", | |
"data_folder = os.path.abspath(os.path.join('~', 'projects', 'cshl-singlecell-2017'))\n", | |
"! mkdir -p $data_folder" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.Dataset>\n", | |
"Dimensions: (cell: 13300, cell_feature: 1, ensembl_id: 47003, gene: 47003, gene_feature: 1)\n", | |
"Coordinates:\n", | |
" gene (ensembl_id) object 'ENSG00000000003.14' ...\n", | |
" * cell (cell) object 'group1_0000' 'group1_0001' 'group1_0002' ...\n", | |
" * gene_feature (gene_feature) int64 0\n", | |
" * cell_feature (cell_feature) object 'group'\n", | |
"Dimensions without coordinates: ensembl_id\n", | |
"Data variables:\n", | |
" counts (cell, gene) float64 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 ...\n", | |
" gene_metadata (gene, gene_feature) object 'TSPAN6' 'TNMD' 'DPM1' ...\n", | |
" cell_metadata (cell, cell_feature) object 'group1' 'group1' 'group1' ..." | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"netcdf = os.path.join(data_folder, 'trisomy21.netcdf')\n", | |
"\n", | |
"ds = xr.open_dataset(netcdf)\n", | |
"ds" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Try making the \"dropout\" plot from Peter Sims" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'counts' (gene: 47003)>\n", | |
"array([ 984, 9, 2578, ..., 1, 3, 4])\n", | |
"Dimensions without coordinates: gene" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"num_cells_greater0 = (ds.counts > 0).sum(dim='cell')\n", | |
"num_cells_greater0" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'counts' (gene: 47003)>\n", | |
"array([ 7.398496e-02, 6.766917e-04, 1.938346e-01, ..., 7.518797e-05,\n", | |
" 2.255639e-04, 3.007519e-04])\n", | |
"Dimensions without coordinates: gene" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"fraction_genes_greater0 = num_cells_greater0/num_cells_greater0.max()\n", | |
"fraction_genes_greater0" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"num_cells_greater0.name = 'Number of cells with count > 0'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# genes_to_use = (per_gene_means > 0) & (per_gene_means )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(47003,)" | |
] | |
}, | |
"execution_count": 45, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"per_gene_means.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.IndexVariable 'gene' (gene: 47003)>\n", | |
"array([Interval(-1.1240000000000001, -1.0649999999999999, closed='right'),\n", | |
" Interval(-3.1829999999999998, -3.1240000000000001, closed='right'),\n", | |
" Interval(-0.65300000000000002, -0.59399999999999997, closed='right'),\n", | |
" ..., Interval(-4.1299999999999999, -4.0650000000000004, closed='right'),\n", | |
" Interval(-3.653, -3.5939999999999999, closed='right'),\n", | |
" Interval(-3.536, -3.4769999999999999, closed='right')], dtype=object)" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"bins = xr.IndexVariable(dims='gene', data=pd.cut(per_gene_means, bins=100))\n", | |
"bins" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'Log10 Mean Count' (gene: 91)>\n", | |
"array([-4.123852, -3.822822, -3.64673 , -3.521792, -3.424882, -3.3457 ,\n", | |
" -3.278754, -3.220762, -3.148352, -3.082459, -3.028506, -2.963631,\n", | |
" -2.906381, -2.857176, -2.802426, -2.743978, -2.68563 , -2.626557,\n", | |
" -2.569306, -2.506051, -2.449651, -2.388102, -2.329108, -2.270351,\n", | |
" -2.211073, -2.152228, -2.093355, -2.036041, -1.97442 , -1.918959,\n", | |
" -1.860151, -1.80081 , -1.741338, -1.681927, -1.623249, -1.565079,\n", | |
" -1.505821, -1.446089, -1.387755, -1.330584, -1.27178 , -1.212565,\n", | |
" -1.152533, -1.094503, -1.034701, -0.976166, -0.917681, -0.858787,\n", | |
" -0.799986, -0.742167, -0.68211 , -0.624757, -0.565417, -0.506586,\n", | |
" -0.447687, -0.387608, -0.328292, -0.272613, -0.212814, -0.157089,\n", | |
" -0.093793, -0.038794, 0.023694, 0.083778, 0.140282, 0.194546,\n", | |
" 0.256533, 0.314832, 0.372526, 0.431174, 0.497467, 0.548207,\n", | |
" 0.610109, 0.6723 , 0.726071, 0.790208, 0.849095, 0.909344,\n", | |
" 0.957706, 1.02225 , 1.08794 , 1.141016, 1.198741, 1.264565,\n", | |
" 1.319888, 1.363606, 1.438874, 1.507395, 1.558466, 1.603718,\n", | |
" 1.758805])\n", | |
"Coordinates:\n", | |
" * gene (gene) object (-4.13, -4.065] (-3.83, -3.771] (-3.653, -3.594] ..." | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"per_gene_mean_bins = per_gene_means.groupby(bins).mean()\n", | |
"per_gene_mean_bins" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'counts' (gene: 91)>\n", | |
"array([ 7.518797e-05, 1.499286e-04, 2.242303e-04, 2.981254e-04,\n", | |
" 3.717869e-04, 4.452612e-04, 5.201899e-04, 5.935607e-04,\n", | |
" 7.020252e-04, 8.145742e-04, 9.216411e-04, 1.068474e-03,\n", | |
" 1.218512e-03, 1.360297e-03, 1.540110e-03, 1.758959e-03,\n", | |
" 2.012360e-03, 2.303704e-03, 2.630462e-03, 3.029463e-03,\n", | |
" 3.434370e-03, 3.950113e-03, 4.518386e-03, 5.150030e-03,\n", | |
" 5.901951e-03, 6.759824e-03, 7.712088e-03, 8.784127e-03,\n", | |
" 1.009199e-02, 1.144870e-02, 1.299170e-02, 1.487582e-02,\n", | |
" 1.698197e-02, 1.927202e-02, 2.206303e-02, 2.516693e-02,\n", | |
" 2.873684e-02, 3.273083e-02, 3.721050e-02, 4.212348e-02,\n", | |
" 4.789030e-02, 5.470503e-02, 6.207011e-02, 7.054700e-02,\n", | |
" 7.952624e-02, 8.972944e-02, 1.019448e-01, 1.147519e-01,\n", | |
" 1.296997e-01, 1.449549e-01, 1.628695e-01, 1.824358e-01,\n", | |
" 2.032234e-01, 2.276905e-01, 2.528870e-01, 2.818363e-01,\n", | |
" 3.108001e-01, 3.428329e-01, 3.748977e-01, 4.078146e-01,\n", | |
" 4.500563e-01, 4.826613e-01, 5.277106e-01, 5.649548e-01,\n", | |
" 6.013665e-01, 6.444659e-01, 6.808543e-01, 7.128524e-01,\n", | |
" 7.543374e-01, 7.756827e-01, 8.314189e-01, 8.478091e-01,\n", | |
" 8.534471e-01, 9.030707e-01, 9.196992e-01, 9.465789e-01,\n", | |
" 9.350607e-01, 9.702358e-01, 9.584891e-01, 9.902381e-01,\n", | |
" 9.830694e-01, 9.958797e-01, 9.966692e-01, 9.970526e-01,\n", | |
" 9.965664e-01, 9.950627e-01, 9.921805e-01, 9.756140e-01,\n", | |
" 9.997744e-01, 9.998496e-01, 1.000000e+00])\n", | |
"Coordinates:\n", | |
" * gene (gene) object (-4.13, -4.065] (-3.83, -3.771] (-3.653, -3.594] ..." | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mean_cells_per_bin = (ds.counts> 0).groupby(bins).mean()\n", | |
"mean_cells_per_bin" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"np.percentile?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'Number of cells with count > 0' (gene: 91)>\n", | |
"array([ 1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00,\n", | |
" 4.800000e+00, 5.000000e+00, 6.000000e+00, 7.000000e+00,\n", | |
" 8.000000e+00, 1.000000e+01, 1.100000e+01, 1.300000e+01,\n", | |
" 1.500000e+01, 1.600000e+01, 1.900000e+01, 2.100000e+01,\n", | |
" 2.400000e+01, 2.800000e+01, 3.200000e+01, 3.600000e+01,\n", | |
" 4.100000e+01, 4.700000e+01, 5.400000e+01, 6.200000e+01,\n", | |
" 7.100000e+01, 8.100000e+01, 9.300000e+01, 1.060000e+02,\n", | |
" 1.225500e+02, 1.380000e+02, 1.570000e+02, 1.800000e+02,\n", | |
" 2.050000e+02, 2.320000e+02, 2.670000e+02, 2.990000e+02,\n", | |
" 3.457000e+02, 3.970000e+02, 4.493500e+02, 5.111000e+02,\n", | |
" 5.826500e+02, 6.679500e+02, 7.529000e+02, 8.496000e+02,\n", | |
" 9.541000e+02, 1.080350e+03, 1.218700e+03, 1.383200e+03,\n", | |
" 1.583600e+03, 1.716100e+03, 1.929000e+03, 2.176650e+03,\n", | |
" 2.386200e+03, 2.673000e+03, 2.996550e+03, 3.234750e+03,\n", | |
" 3.778100e+03, 4.103800e+03, 4.387700e+03, 4.654000e+03,\n", | |
" 5.135300e+03, 5.349200e+03, 6.354850e+03, 6.698400e+03,\n", | |
" 6.819200e+03, 7.511000e+03, 7.688000e+03, 8.585450e+03,\n", | |
" 8.796950e+03, 9.203950e+03, 9.754200e+03, 1.032350e+04,\n", | |
" 1.015825e+04, 1.058100e+04, 1.163460e+04, 1.205205e+04,\n", | |
" 1.127940e+04, 1.249100e+04, 1.216300e+04, 1.315150e+04,\n", | |
" 1.254960e+04, 1.323200e+04, 1.319575e+04, 1.320220e+04,\n", | |
" 1.316675e+04, 1.315830e+04, 1.297835e+04, 1.185975e+04,\n", | |
" 1.329350e+04, 1.329800e+04, 1.330000e+04])\n", | |
"Coordinates:\n", | |
" * gene (gene) object (-4.13, -4.065] (-3.83, -3.771] (-3.653, -3.594] ..." | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"quantile95_cells_per_bin = num_cells_greater0.groupby(\n", | |
" bins, squeeze=False).reduce(\n", | |
" np.percentile, q=5)\n", | |
"quantile95_cells_per_bin" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'Number of cells with count > 0' (gene: 91)>\n", | |
"array([ 7.518797e-05, 1.503759e-04, 2.255639e-04, 3.007519e-04,\n", | |
" 3.609023e-04, 3.759398e-04, 4.511278e-04, 5.263158e-04,\n", | |
" 6.015038e-04, 7.518797e-04, 8.270677e-04, 9.774436e-04,\n", | |
" 1.127820e-03, 1.203008e-03, 1.428571e-03, 1.578947e-03,\n", | |
" 1.804511e-03, 2.105263e-03, 2.406015e-03, 2.706767e-03,\n", | |
" 3.082707e-03, 3.533835e-03, 4.060150e-03, 4.661654e-03,\n", | |
" 5.338346e-03, 6.090226e-03, 6.992481e-03, 7.969925e-03,\n", | |
" 9.214286e-03, 1.037594e-02, 1.180451e-02, 1.353383e-02,\n", | |
" 1.541353e-02, 1.744361e-02, 2.007519e-02, 2.248120e-02,\n", | |
" 2.599248e-02, 2.984962e-02, 3.378571e-02, 3.842857e-02,\n", | |
" 4.380827e-02, 5.022180e-02, 5.660902e-02, 6.387970e-02,\n", | |
" 7.173684e-02, 8.122932e-02, 9.163158e-02, 1.040000e-01,\n", | |
" 1.190677e-01, 1.290301e-01, 1.450376e-01, 1.636579e-01,\n", | |
" 1.794135e-01, 2.009774e-01, 2.253045e-01, 2.432143e-01,\n", | |
" 2.840677e-01, 3.085564e-01, 3.299023e-01, 3.499248e-01,\n", | |
" 3.861128e-01, 4.021955e-01, 4.778083e-01, 5.036391e-01,\n", | |
" 5.127218e-01, 5.647368e-01, 5.780451e-01, 6.455226e-01,\n", | |
" 6.614248e-01, 6.920263e-01, 7.333985e-01, 7.762030e-01,\n", | |
" 7.637782e-01, 7.955639e-01, 8.747820e-01, 9.061692e-01,\n", | |
" 8.480752e-01, 9.391729e-01, 9.145113e-01, 9.888346e-01,\n", | |
" 9.435789e-01, 9.948872e-01, 9.921617e-01, 9.926466e-01,\n", | |
" 9.899812e-01, 9.893459e-01, 9.758158e-01, 8.917105e-01,\n", | |
" 9.995113e-01, 9.998496e-01, 1.000000e+00])\n", | |
"Coordinates:\n", | |
" * gene (gene) object (-4.13, -4.065] (-3.83, -3.771] (-3.653, -3.594] ..." | |
] | |
}, | |
"execution_count": 22, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"percent_quantile95 = quantile95_cells_per_bin/quantile95_cells_per_bin.max()\n", | |
"percent_quantile95" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(47003,)" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"per_gene_means.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(47003,)" | |
] | |
}, | |
"execution_count": 24, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"fraction_genes_greater0.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'Log10 Mean Count' (gene: 91)>\n", | |
"array([-4.123852, -3.822822, -3.64673 , -3.521792, -3.424882, -3.3457 ,\n", | |
" -3.278754, -3.220762, -3.148352, -3.082459, -3.028506, -2.963631,\n", | |
" -2.906381, -2.857176, -2.802426, -2.743978, -2.68563 , -2.626557,\n", | |
" -2.569306, -2.506051, -2.449651, -2.388102, -2.329108, -2.270351,\n", | |
" -2.211073, -2.152228, -2.093355, -2.036041, -1.97442 , -1.918959,\n", | |
" -1.860151, -1.80081 , -1.741338, -1.681927, -1.623249, -1.565079,\n", | |
" -1.505821, -1.446089, -1.387755, -1.330584, -1.27178 , -1.212565,\n", | |
" -1.152533, -1.094503, -1.034701, -0.976166, -0.917681, -0.858787,\n", | |
" -0.799986, -0.742167, -0.68211 , -0.624757, -0.565417, -0.506586,\n", | |
" -0.447687, -0.387608, -0.328292, -0.272613, -0.212814, -0.157089,\n", | |
" -0.093793, -0.038794, 0.023694, 0.083778, 0.140282, 0.194546,\n", | |
" 0.256533, 0.314832, 0.372526, 0.431174, 0.497467, 0.548207,\n", | |
" 0.610109, 0.6723 , 0.726071, 0.790208, 0.849095, 0.909344,\n", | |
" 0.957706, 1.02225 , 1.08794 , 1.141016, 1.198741, 1.264565,\n", | |
" 1.319888, 1.363606, 1.438874, 1.507395, 1.558466, 1.603718,\n", | |
" 1.758805])\n", | |
"Coordinates:\n", | |
" * gene (gene) object (-4.13, -4.065] (-3.83, -3.771] (-3.653, -3.594] ..." | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"per_gene_mean_bins" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.DataArray 'Log10 Mean Count' (gene: 47003)>\n", | |
"array([-1.067328, -3.169609, -0.610235, ..., -4.123852, -3.64673 , -3.521792])\n", | |
"Coordinates:\n", | |
" * gene (gene) object (-4.13, -4.065] (-3.83, -3.771] (-3.653, -3.594] ..." | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"per_gene_means" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<xarray.IndexVariable 'gene' (gene: 47003)>\n", | |
"array([Interval(-1.1240000000000001, -1.0649999999999999, closed='right'),\n", | |
" Interval(-3.1829999999999998, -3.1240000000000001, closed='right'),\n", | |
" Interval(-0.65300000000000002, -0.59399999999999997, closed='right'),\n", | |
" ..., Interval(-4.1299999999999999, -4.0650000000000004, closed='right'),\n", | |
" Interval(-3.653, -3.5939999999999999, closed='right'),\n", | |
" Interval(-3.536, -3.4769999999999999, closed='right')], dtype=object)" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"bins" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"--- Bin: (-4.13, -4.065] ---\n", | |
"\tBefore filtering (13300, 5488)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.83, -3.771] ---\n", | |
"\tBefore filtering (13300, 3530)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.653, -3.594] ---\n", | |
"\tBefore filtering (13300, 2537)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.536, -3.477] ---\n", | |
"\tBefore filtering (13300, 1918)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.477, -3.418] ---\n", | |
"\tBefore filtering (13300, 1557)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.359, -3.3] ---\n", | |
"\tBefore filtering (13300, 1256)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.3, -3.241] ---\n", | |
"\tBefore filtering (13300, 1031)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.241, -3.183] ---\n", | |
"\tBefore filtering (13300, 833)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.183, -3.124] ---\n", | |
"\tBefore filtering (13300, 1481)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.124, -3.065] ---\n", | |
"\tBefore filtering (13300, 662)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.065, -3.006] ---\n", | |
"\tBefore filtering (13300, 1086)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-3.006, -2.947] ---\n", | |
"\tBefore filtering (13300, 859)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.947, -2.888] ---\n", | |
"\tBefore filtering (13300, 708)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.888, -2.83] ---\n", | |
"\tBefore filtering (13300, 696)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.83, -2.771] ---\n", | |
"\tBefore filtering (13300, 786)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.771, -2.712] ---\n", | |
"\tBefore filtering (13300, 685)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.712, -2.653] ---\n", | |
"\tBefore filtering (13300, 747)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.653, -2.594] ---\n", | |
"\tBefore filtering (13300, 657)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.594, -2.536] ---\n", | |
"\tBefore filtering (13300, 673)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.536, -2.477] ---\n", | |
"\tBefore filtering (13300, 675)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.477, -2.418] ---\n", | |
"\tBefore filtering (13300, 542)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.418, -2.359] ---\n", | |
"\tBefore filtering (13300, 630)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.359, -2.3] ---\n", | |
"\tBefore filtering (13300, 476)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.3, -2.241] ---\n", | |
"\tBefore filtering (13300, 543)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.241, -2.183] ---\n", | |
"\tBefore filtering (13300, 494)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.183, -2.124] ---\n", | |
"\tBefore filtering (13300, 477)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.124, -2.065] ---\n", | |
"\tBefore filtering (13300, 438)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.065, -2.006] ---\n", | |
"\tBefore filtering (13300, 450)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-2.006, -1.947] ---\n", | |
"\tBefore filtering (13300, 452)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.947, -1.888] ---\n", | |
"\tBefore filtering (13300, 396)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.888, -1.83] ---\n", | |
"\tBefore filtering (13300, 480)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.83, -1.771] ---\n", | |
"\tBefore filtering (13300, 455)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.771, -1.712] ---\n", | |
"\tBefore filtering (13300, 465)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.712, -1.653] ---\n", | |
"\tBefore filtering (13300, 431)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.653, -1.594] ---\n", | |
"\tBefore filtering (13300, 454)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.594, -1.535] ---\n", | |
"\tBefore filtering (13300, 461)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.535, -1.477] ---\n", | |
"\tBefore filtering (13300, 475)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.477, -1.418] ---\n", | |
"\tBefore filtering (13300, 478)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.418, -1.359] ---\n", | |
"\tBefore filtering (13300, 508)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.359, -1.3] ---\n", | |
"\tBefore filtering (13300, 483)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.3, -1.241] ---\n", | |
"\tBefore filtering (13300, 474)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.241, -1.183] ---\n", | |
"\tBefore filtering (13300, 520)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.183, -1.124] ---\n", | |
"\tBefore filtering (13300, 539)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.124, -1.065] ---\n", | |
"\tBefore filtering (13300, 527)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.065, -1.006] ---\n", | |
"\tBefore filtering (13300, 515)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-1.006, -0.947] ---\n", | |
"\tBefore filtering (13300, 508)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.947, -0.888] ---\n", | |
"\tBefore filtering (13300, 499)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.888, -0.83] ---\n", | |
"\tBefore filtering (13300, 509)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.83, -0.771] ---\n", | |
"\tBefore filtering (13300, 485)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.771, -0.712] ---\n", | |
"\tBefore filtering (13300, 432)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.712, -0.653] ---\n", | |
"\tBefore filtering (13300, 456)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.653, -0.594] ---\n", | |
"\tBefore filtering (13300, 432)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.594, -0.535] ---\n", | |
"\tBefore filtering (13300, 404)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.535, -0.477] ---\n", | |
"\tBefore filtering (13300, 378)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.477, -0.418] ---\n", | |
"\tBefore filtering (13300, 342)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.418, -0.359] ---\n", | |
"\tBefore filtering (13300, 296)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.359, -0.3] ---\n", | |
"\tBefore filtering (13300, 262)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.3, -0.241] ---\n", | |
"\tBefore filtering (13300, 245)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.241, -0.182] ---\n", | |
"\tBefore filtering (13300, 223)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.182, -0.124] ---\n", | |
"\tBefore filtering (13300, 181)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.124, -0.0648] ---\n", | |
"\tBefore filtering (13300, 163)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.0648, -0.00599] ---\n", | |
"\tBefore filtering (13300, 152)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (-0.00599, 0.0528] ---\n", | |
"\tBefore filtering (13300, 138)\n", | |
"\tAfter filtering: (13300, 2)\n", | |
"--- Bin: (0.0528, 0.112] ---\n", | |
"\tBefore filtering (13300, 129)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.112, 0.17] ---\n", | |
"\tBefore filtering (13300, 103)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.17, 0.229] ---\n", | |
"\tBefore filtering (13300, 101)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (0.229, 0.288] ---\n", | |
"\tBefore filtering (13300, 80)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (0.288, 0.347] ---\n", | |
"\tBefore filtering (13300, 64)\n", | |
"\tAfter filtering: (13300, 2)\n", | |
"--- Bin: (0.347, 0.406] ---\n", | |
"\tBefore filtering (13300, 48)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.406, 0.465] ---\n", | |
"\tBefore filtering (13300, 50)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (0.465, 0.523] ---\n", | |
"\tBefore filtering (13300, 39)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.523, 0.582] ---\n", | |
"\tBefore filtering (13300, 36)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.582, 0.641] ---\n", | |
"\tBefore filtering (13300, 26)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.641, 0.7] ---\n", | |
"\tBefore filtering (13300, 25)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (0.7, 0.759] ---\n", | |
"\tBefore filtering (13300, 17)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.759, 0.818] ---\n", | |
"\tBefore filtering (13300, 24)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.818, 0.876] ---\n", | |
"\tBefore filtering (13300, 13)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (0.876, 0.935] ---\n", | |
"\tBefore filtering (13300, 22)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (0.935, 0.994] ---\n", | |
"\tBefore filtering (13300, 21)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (0.994, 1.053] ---\n", | |
"\tBefore filtering (13300, 6)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (1.053, 1.112] ---\n", | |
"\tBefore filtering (13300, 17)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (1.112, 1.171] ---\n", | |
"\tBefore filtering (13300, 5)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (1.171, 1.229] ---\n", | |
"\tBefore filtering (13300, 10)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (1.229, 1.288] ---\n", | |
"\tBefore filtering (13300, 10)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (1.288, 1.347] ---\n", | |
"\tBefore filtering (13300, 6)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (1.347, 1.406] ---\n", | |
"\tBefore filtering (13300, 3)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (1.406, 1.465] ---\n", | |
"\tBefore filtering (13300, 4)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (1.465, 1.523] ---\n", | |
"\tBefore filtering (13300, 6)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (1.523, 1.582] ---\n", | |
"\tBefore filtering (13300, 3)\n", | |
"\tAfter filtering: (13300, 1)\n", | |
"--- Bin: (1.582, 1.641] ---\n", | |
"\tBefore filtering (13300, 1)\n", | |
"\tAfter filtering: (13300, 0)\n", | |
"--- Bin: (1.7, 1.759] ---\n", | |
"\tBefore filtering (13300, 1)\n", | |
"\tAfter filtering: (13300, 1)\n" | |
] | |
} | |
], | |
"source": [ | |
"grouped = ds.counts.groupby(bins)\n", | |
"\n", | |
"filtereds = []\n", | |
"\n", | |
"for i, (vbin, subgroup) in zip(range(1000), grouped):\n", | |
" print(f'--- Bin: {vbin} ---')\n", | |
" n_cells_thresh = percent_quantile95.sel(gene=vbin)\n", | |
"# subgroup = grouped.groups[vbin.values.item()]\n", | |
" print('\\tBefore filtering', subgroup.shape)\n", | |
" subgroup_cells_greater0 = (subgroup > 0).sum(dim='cell')\n", | |
" # Make this a percentage\n", | |
" subgroup_cells_greater0 = subgroup_cells_greater0/subgroup_cells_greater0.max()\n", | |
" gene_filter = subgroup_cells_greater0 <= n_cells_thresh\n", | |
" filtered = subgroup.sel(gene=gene_filter)\n", | |
" print('\\tAfter filtering:', filtered.shape)\n", | |
" filtereds.append(filtered)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 57, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"1.0" | |
] | |
}, | |
"execution_count": 57, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"n_cells_thresh.item()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"bin_boundaries = np.linspace(per_gene_means.min(), \n", | |
" per_gene_means.max(), num=100)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 48, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{Interval(-0.023800000000000002, 0.0356, closed='right'): [0],\n", | |
" Interval(0.98599999999999999, 1.046, closed='right'): [1]}" | |
] | |
}, | |
"execution_count": 48, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ds.counts.groupby_bins('gene', bin_boundaries).groups" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(13300, 2537)" | |
] | |
}, | |
"execution_count": 36, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"subgroup.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olgabot/anaconda3/envs/cshl-sca-2017/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: Tried to set a label via parameter 'y' in func 'scatter' but couldn't find such an argument. \n", | |
"(This is a programming error, please report to the matplotlib list!)\n", | |
" \"\"\"\n" | |
] | |
}, | |
{ | |
"ename": "TypeError", | |
"evalue": "scatter() missing 2 required positional arguments: 'x' and 'y'", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-31-c995e5c09469>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m color='Crimson')\n\u001b[1;32m 4\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0max_joint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mper_gene_mean_bins\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpercent_quantile95\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Yellow'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0max_joint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
"\u001b[0;32m~/anaconda3/envs/cshl-sca-2017/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1896\u001b[0m warnings.warn(msg % (label_namer, func.__name__),\n\u001b[1;32m 1897\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1898\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1899\u001b[0m \u001b[0mpre_doc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1900\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpre_doc\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mTypeError\u001b[0m: scatter() missing 2 required positional arguments: 'x' and 'y'" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\nCCHi0v8D4b/TDiExTQEAAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10b9a96d8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"g = sns.jointplot(per_gene_means.values, fraction_genes_greater0.values)\n", | |
"g.ax_joint.plot(per_gene_mean_bins, mean_cells_per_bin, \n", | |
" color='Crimson')\n", | |
"g.ax_joint.plot(per_gene_mean_bins, percent_quantile95, color='Yellow')\n", | |
"# g.ax_joint.scatter()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 68, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.linear_model import LogisticRegression" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"sns.regplot(per_gene_means.values, fraction_genes_greater0.values, \n", | |
" logistic=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 87, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([ 7.39849624e-02, 6.76691729e-04, 1.93834586e-01, ...,\n", | |
" 7.51879699e-05, 2.25563910e-04, 3.00751880e-04])" | |
] | |
}, | |
"execution_count": 87, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"fraction_genes_greater0.values" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 98, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", | |
" intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", | |
" penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", | |
" verbose=0, warm_start=False)" | |
] | |
}, | |
"execution_count": 98, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"regressor = LogisticRegression()\n", | |
"X = per_gene_means.values[:, np.newaxis]\n", | |
"y = fraction_genes_greater0 > 0.5\n", | |
"regressor.fit(X, y)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 100, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x134f8c7f0>]" | |
] | |
}, | |
"execution_count": 100, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x13acb4cc0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"# and plot the result\n", | |
"plt.figure(1, figsize=(4, 3))\n", | |
"plt.clf()\n", | |
"plt.scatter(X.ravel(), y, color='black', zorder=20)\n", | |
"X_test = np.linspace(per_gene_means.min(), per_gene_means.max(), 300)\n", | |
"\n", | |
"\n", | |
"def model(x):\n", | |
" return 1 / (1 + np.exp(-x))\n", | |
"loss = model(X_test * regressor.coef_ + regressor.intercept_).ravel()\n", | |
"plt.plot(X_test, loss, color='red', linewidth=3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 109, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x13c65b4e0>]" | |
] | |
}, | |
"execution_count": 109, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\nRK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x13c65b128>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"g = sns.jointplot(per_gene_means.values, fraction_genes_greater0.values)\n", | |
"g.ax_joint.plot(X_test, loss, color='red', linewidth=3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 43, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# counts = counts.fillna(0)\n", | |
"# print(counts.shape)\n", | |
"# counts.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 44, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# csv = os.path.join(data_folder, 'counts.csv.gz')\n", | |
"# counts.to_csv(csv, compression='gzip')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# gene_id_to_symbol = pd.Series(dict(counts.index.values))\n", | |
"# gene_id_to_symbol.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# csv = os.path.join(data_folder, 'gene_id_to_symbol.csv')\n", | |
"# gene_id_to_symbol.to_csv(csv)\n", | |
"# ! head $csv" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import phenograph" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import gseapy" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"gmt = '~/Downloads/hg_chr.gmt'\n", | |
"! head $gmt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"gseapy.ssgsea" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%%time\n", | |
"\n", | |
"correls = counts.rank().corr()\n", | |
"print(correls.shape)\n", | |
"correls.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"csv = os.path.join(data_folder, 'spearman_correlation.csv.gz')\n", | |
"correls.to_csv(csv, compression='gzip')" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (cshl-sca-2017)", | |
"language": "python", | |
"name": "cshl-sca-2017" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment