"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"(function(root) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
"\n",
" if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
" root._bokeh_onload_callbacks = [];\n",
" root._bokeh_is_loading = undefined;\n",
" }\n",
"\n",
" var JS_MIME_TYPE = 'application/javascript';\n",
" var HTML_MIME_TYPE = 'text/html';\n",
" var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
" var CLASS_NAME = 'output_bokeh rendered_html';\n",
"\n",
" /**\n",
" * Render data to the DOM node\n",
" */\n",
" function render(props, node) {\n",
" var script = document.createElement(\"script\");\n",
" node.appendChild(script);\n",
" }\n",
"\n",
" /**\n",
" * Handle when an output is cleared or removed\n",
" */\n",
" function handleClearOutput(event, handle) {\n",
" var cell = handle.cell;\n",
"\n",
" var id = cell.output_area._bokeh_element_id;\n",
" var server_id = cell.output_area._bokeh_server_id;\n",
" // Clean up Bokeh references\n",
" if (id != null && id in Bokeh.index) {\n",
" Bokeh.index[id].model.document.clear();\n",
" delete Bokeh.index[id];\n",
" }\n",
"\n",
" if (server_id !== undefined) {\n",
" // Clean up Bokeh references\n",
" var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
" cell.notebook.kernel.execute(cmd, {\n",
" iopub: {\n",
" output: function(msg) {\n",
" var id = msg.content.text.trim();\n",
" if (id in Bokeh.index) {\n",
" Bokeh.index[id].model.document.clear();\n",
" delete Bokeh.index[id];\n",
" }\n",
" }\n",
" }\n",
" });\n",
" // Destroy server and session\n",
" var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
" cell.notebook.kernel.execute(cmd);\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Handle when a new output is added\n",
" */\n",
" function handleAddOutput(event, handle) {\n",
" var output_area = handle.output_area;\n",
" var output = handle.output;\n",
"\n",
" // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
" if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
" return\n",
" }\n",
"\n",
" var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
"\n",
" if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
" toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
" // store reference to embed id on output_area\n",
" output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
" }\n",
" if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
" var bk_div = document.createElement(\"div\");\n",
" bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
" var script_attrs = bk_div.children[0].attributes;\n",
" for (var i = 0; i < script_attrs.length; i++) {\n",
" toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
" }\n",
" // store reference to server id on output_area\n",
" output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
" }\n",
" }\n",
"\n",
" function register_renderer(events, OutputArea) {\n",
"\n",
" function append_mime(data, metadata, element) {\n",
" // create a DOM node to render to\n",
" var toinsert = this.create_output_subarea(\n",
" metadata,\n",
" CLASS_NAME,\n",
" EXEC_MIME_TYPE\n",
" );\n",
" this.keyboard_manager.register_events(toinsert);\n",
" // Render to node\n",
" var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
" render(props, toinsert[toinsert.length - 1]);\n",
" element.append(toinsert);\n",
" return toinsert\n",
" }\n",
"\n",
" /* Handle when an output is cleared or removed */\n",
" events.on('clear_output.CodeCell', handleClearOutput);\n",
" events.on('delete.Cell', handleClearOutput);\n",
"\n",
" /* Handle when a new output is added */\n",
" events.on('output_added.OutputArea', handleAddOutput);\n",
"\n",
" /**\n",
" * Register the mime type and append_mime function with output_area\n",
" */\n",
" OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
" /* Is output safe? */\n",
" safe: true,\n",
" /* Index of renderer in `output_area.display_order` */\n",
" index: 0\n",
" });\n",
" }\n",
"\n",
" // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
" if (root.Jupyter !== undefined) {\n",
" var events = require('base/js/events');\n",
" var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
"\n",
" if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
" register_renderer(events, OutputArea);\n",
" }\n",
" }\n",
"\n",
" \n",
" if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
" root._bokeh_timeout = Date.now() + 5000;\n",
" root._bokeh_failed_load = false;\n",
" }\n",
"\n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"
\\n\"+\n",
" \"
\\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",
" \"
\\n\"+\n",
" \"
\\n\"+\n",
" \"
re-rerun `output_notebook()` to attempt to load from CDN again, or
\"}};\n",
"\n",
" function display_loaded() {\n",
" var el = document.getElementById(\"1001\");\n",
" if (el != null) {\n",
" el.textContent = \"BokehJS is loading...\";\n",
" }\n",
" if (root.Bokeh !== undefined) {\n",
" if (el != null) {\n",
" el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
" }\n",
" } else if (Date.now() < root._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }\n",
"\n",
"\n",
" function run_callbacks() {\n",
" try {\n",
" root._bokeh_onload_callbacks.forEach(function(callback) {\n",
" if (callback != null)\n",
" callback();\n",
" });\n",
" } finally {\n",
" delete root._bokeh_onload_callbacks\n",
" }\n",
" console.debug(\"Bokeh: all callbacks have finished\");\n",
" }\n",
"\n",
" function load_libs(css_urls, js_urls, callback) {\n",
" if (css_urls == null) css_urls = [];\n",
" if (js_urls == null) js_urls = [];\n",
"\n",
" root._bokeh_onload_callbacks.push(callback);\n",
" if (root._bokeh_is_loading > 0) {\n",
" console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
"\n",
" function on_load() {\n",
" root._bokeh_is_loading--;\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
" run_callbacks()\n",
" }\n",
" }\n",
"\n",
" function on_error() {\n",
" console.error(\"failed to load \" + url);\n",
" }\n",
"\n",
" for (var i = 0; i < css_urls.length; i++) {\n",
" var url = css_urls[i];\n",
" const element = document.createElement(\"link\");\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.rel = \"stylesheet\";\n",
" element.type = \"text/css\";\n",
" element.href = url;\n",
" console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.async = false;\n",
" element.src = url;\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.head.appendChild(element);\n",
" }\n",
" };var element = document.getElementById(\"1001\");\n",
" if (element == null) {\n",
" console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
"\n",
" function inject_raw_css(css) {\n",
" const element = document.createElement(\"style\");\n",
" element.appendChild(document.createTextNode(css));\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" \n",
" var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.4.0.min.js\"];\n",
" var css_urls = [];\n",
" \n",
"\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
" function(Bokeh) {\n",
" \n",
" \n",
" }\n",
" ];\n",
"\n",
" function run_inline_js() {\n",
" \n",
" if (root.Bokeh !== undefined || force === true) {\n",
" \n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i].call(root, root.Bokeh);\n",
" }\n",
" if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < root._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!root._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" root._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
"\n",
" }\n",
"\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(css_urls, js_urls, function() {\n",
" console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
"}(window));"
],
"application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"
\\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 \"
\\n\"+\n \"
\\n\"+\n \"
re-rerun `output_notebook()` to attempt to load from CDN again, or
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.4.0.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"(function(root) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
"\n",
" if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
" root._bokeh_onload_callbacks = [];\n",
" root._bokeh_is_loading = undefined;\n",
" }\n",
"\n",
" var JS_MIME_TYPE = 'application/javascript';\n",
" var HTML_MIME_TYPE = 'text/html';\n",
" var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
" var CLASS_NAME = 'output_bokeh rendered_html';\n",
"\n",
" /**\n",
" * Render data to the DOM node\n",
" */\n",
" function render(props, node) {\n",
" var script = document.createElement(\"script\");\n",
" node.appendChild(script);\n",
" }\n",
"\n",
" /**\n",
" * Handle when an output is cleared or removed\n",
" */\n",
" function handleClearOutput(event, handle) {\n",
" var cell = handle.cell;\n",
"\n",
" var id = cell.output_area._bokeh_element_id;\n",
" var server_id = cell.output_area._bokeh_server_id;\n",
" // Clean up Bokeh references\n",
" if (id != null && id in Bokeh.index) {\n",
" Bokeh.index[id].model.document.clear();\n",
" delete Bokeh.index[id];\n",
" }\n",
"\n",
" if (server_id !== undefined) {\n",
" // Clean up Bokeh references\n",
" var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
" cell.notebook.kernel.execute(cmd, {\n",
" iopub: {\n",
" output: function(msg) {\n",
" var id = msg.content.text.trim();\n",
" if (id in Bokeh.index) {\n",
" Bokeh.index[id].model.document.clear();\n",
" delete Bokeh.index[id];\n",
" }\n",
" }\n",
" }\n",
" });\n",
" // Destroy server and session\n",
" var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
" cell.notebook.kernel.execute(cmd);\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Handle when a new output is added\n",
" */\n",
" function handleAddOutput(event, handle) {\n",
" var output_area = handle.output_area;\n",
" var output = handle.output;\n",
"\n",
" // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
" if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
" return\n",
" }\n",
"\n",
" var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
"\n",
" if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
" toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
" // store reference to embed id on output_area\n",
" output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
" }\n",
" if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
" var bk_div = document.createElement(\"div\");\n",
" bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
" var script_attrs = bk_div.children[0].attributes;\n",
" for (var i = 0; i < script_attrs.length; i++) {\n",
" toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
" }\n",
" // store reference to server id on output_area\n",
" output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
" }\n",
" }\n",
"\n",
" function register_renderer(events, OutputArea) {\n",
"\n",
" function append_mime(data, metadata, element) {\n",
" // create a DOM node to render to\n",
" var toinsert = this.create_output_subarea(\n",
" metadata,\n",
" CLASS_NAME,\n",
" EXEC_MIME_TYPE\n",
" );\n",
" this.keyboard_manager.register_events(toinsert);\n",
" // Render to node\n",
" var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
" render(props, toinsert[toinsert.length - 1]);\n",
" element.append(toinsert);\n",
" return toinsert\n",
" }\n",
"\n",
" /* Handle when an output is cleared or removed */\n",
" events.on('clear_output.CodeCell', handleClearOutput);\n",
" events.on('delete.Cell', handleClearOutput);\n",
"\n",
" /* Handle when a new output is added */\n",
" events.on('output_added.OutputArea', handleAddOutput);\n",
"\n",
" /**\n",
" * Register the mime type and append_mime function with output_area\n",
" */\n",
" OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
" /* Is output safe? */\n",
" safe: true,\n",
" /* Index of renderer in `output_area.display_order` */\n",
" index: 0\n",
" });\n",
" }\n",
"\n",
" // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
" if (root.Jupyter !== undefined) {\n",
" var events = require('base/js/events');\n",
" var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
"\n",
" if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
" register_renderer(events, OutputArea);\n",
" }\n",
" }\n",
"\n",
" \n",
" if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
" root._bokeh_timeout = Date.now() + 5000;\n",
" root._bokeh_failed_load = false;\n",
" }\n",
"\n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"
\\n\"+\n",
" \"
\\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",
" \"
\\n\"+\n",
" \"
\\n\"+\n",
" \"
re-rerun `output_notebook()` to attempt to load from CDN again, or
\"}};\n",
"\n",
" function display_loaded() {\n",
" var el = document.getElementById(null);\n",
" if (el != null) {\n",
" el.textContent = \"BokehJS is loading...\";\n",
" }\n",
" if (root.Bokeh !== undefined) {\n",
" if (el != null) {\n",
" el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
" }\n",
" } else if (Date.now() < root._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }\n",
"\n",
"\n",
" function run_callbacks() {\n",
" try {\n",
" root._bokeh_onload_callbacks.forEach(function(callback) {\n",
" if (callback != null)\n",
" callback();\n",
" });\n",
" } finally {\n",
" delete root._bokeh_onload_callbacks\n",
" }\n",
" console.debug(\"Bokeh: all callbacks have finished\");\n",
" }\n",
"\n",
" function load_libs(css_urls, js_urls, callback) {\n",
" if (css_urls == null) css_urls = [];\n",
" if (js_urls == null) js_urls = [];\n",
"\n",
" root._bokeh_onload_callbacks.push(callback);\n",
" if (root._bokeh_is_loading > 0) {\n",
" console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
"\n",
" function on_load() {\n",
" root._bokeh_is_loading--;\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
" run_callbacks()\n",
" }\n",
" }\n",
"\n",
" function on_error() {\n",
" console.error(\"failed to load \" + url);\n",
" }\n",
"\n",
" for (var i = 0; i < css_urls.length; i++) {\n",
" var url = css_urls[i];\n",
" const element = document.createElement(\"link\");\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.rel = \"stylesheet\";\n",
" element.type = \"text/css\";\n",
" element.href = url;\n",
" console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.async = false;\n",
" element.src = url;\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.head.appendChild(element);\n",
" }\n",
" };\n",
"\n",
" function inject_raw_css(css) {\n",
" const element = document.createElement(\"style\");\n",
" element.appendChild(document.createTextNode(css));\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" \n",
" var js_urls = [];\n",
" var css_urls = [];\n",
" \n",
"\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" /* BEGIN bokeh.min.js */\n",
" /*!\n",
" * Copyright (c) 2012 - 2019, Anaconda, Inc., and Bokeh Contributors\n",
" * All rights reserved.\n",
" * \n",
" * Redistribution and use in source and binary forms, with or without modification,\n",
" * are permitted provided that the following conditions are met:\n",
" * \n",
" * Redistributions of source code must retain the above copyright notice,\n",
" * this list of conditions and the following disclaimer.\n",
" * \n",
" * Redistributions in binary form must reproduce the above copyright notice,\n",
" * this list of conditions and the following disclaimer in the documentation\n",
" * and/or other materials provided with the distribution.\n",
" * \n",
" * Neither the name of Anaconda nor the names of any contributors\n",
" * may be used to endorse or promote products derived from this software\n",
" * without specific prior written permission.\n",
" * \n",
" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n",
" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n",
" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n",
" * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n",
" * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n",
" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n",
" * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n",
" * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n",
" * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n",
" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n",
" * THE POSSIBILITY OF SUCH DAMAGE.\n",
" */\n",
" (function(root, factory) {\n",
" root[\"Bokeh\"] = factory();\n",
" })(this, function() {\n",
" var define;\n",
" var parent_require = typeof require === \"function\" && require\n",
" return (function(modules, entry, aliases, externals) {\n",
" if (aliases === undefined) aliases = {};\n",
" if (externals === undefined) externals = {};\n",
"\n",
" var cache = {};\n",
"\n",
" var normalize = function(name) {\n",
" if (typeof name === \"number\")\n",
" return name;\n",
"\n",
" if (name === \"bokehjs\")\n",
" return entry;\n",
"\n",
" var prefix = \"@bokehjs/\"\n",
" if (name.slice(0, prefix.length) === prefix)\n",
" name = name.slice(prefix.length)\n",
"\n",
" var alias = aliases[name]\n",
" if (alias != null)\n",
" return alias;\n",
"\n",
" var trailing = name.length > 0 && name[name.lenght-1] === \"/\";\n",
" var index = aliases[name + (trailing ? \"\" : \"/\") + \"index\"];\n",
" if (index != null)\n",
" return index;\n",
"\n",
" return name;\n",
" }\n",
"\n",
" var require = function(name) {\n",
" var mod = cache[name];\n",
" if (!mod) {\n",
" var id = normalize(name);\n",
"\n",
" mod = cache[id];\n",
" if (!mod) {\n",
" if (!modules[id]) {\n",
" if (parent_require && externals[id]) {\n",
" try {\n",
" mod = {exports: parent_require(id)};\n",
" cache[id] = cache[name] = mod;\n",
" return mod.exports;\n",
" } catch (e) {}\n",
" }\n",
"\n",
" var err = new Error(\"Cannot find module '\" + name + \"'\");\n",
" err.code = 'MODULE_NOT_FOUND';\n",
" throw err;\n",
" }\n",
"\n",
" mod = {exports: {}};\n",
" cache[id] = cache[name] = mod;\n",
" modules[id].call(mod.exports, require, mod, mod.exports);\n",
" } else\n",
" cache[name] = mod;\n",
" }\n",
"\n",
" return mod.exports;\n",
" }\n",
"\n",
" var main = require(entry);\n",
" main.require = require;\n",
"\n",
" main.register_plugin = function(plugin_modules, plugin_entry, plugin_aliases, plugin_externals) {\n",
" if (plugin_aliases === undefined) plugin_aliases = {};\n",
" if (plugin_externals === undefined) plugin_externals = {};\n",
"\n",
" for (var name in plugin_modules) {\n",
" modules[name] = plugin_modules[name];\n",
" }\n",
"\n",
" for (var name in plugin_aliases) {\n",
" aliases[name] = plugin_aliases[name];\n",
" }\n",
"\n",
" for (var name in plugin_externals) {\n",
" externals[name] = plugin_externals[name];\n",
" }\n",
"\n",
" var plugin = require(plugin_entry);\n",
"\n",
" for (var name in plugin) {\n",
" main[name] = plugin[name];\n",
" }\n",
"\n",
" return plugin;\n",
" }\n",
"\n",
" return main;\n",
" })\n",
" ([\n",
" function _(n,o,r){n(1),function(n){for(var o in n)r.hasOwnProperty(o)||(r[o]=n[o])}(n(102))},\n",
" function _(n,c,f){n(2),n(11),n(14),n(21),n(49),n(52),n(87),n(94),n(100)},\n",
" function _(e,n,a){e(3)()||Object.defineProperty(Object,\"assign\",{value:e(4),configurable:!0,enumerable:!1,writable:!0})},\n",
" function _(r,t,o){t.exports=function(){var r,t=Object.assign;return\"function\"==typeof t&&(t(r={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),r.foo+r.bar+r.trzy===\"razdwatrzy\")}},\n",
" function _(t,r,n){var o=t(5),c=t(10),a=Math.max;r.exports=function(t,r){var n,f,h,i=a(arguments.length,2);for(t=Object(c(t)),h=function(o){try{t[o]=r[o]}catch(t){n||(n=t)}},f=1;f= 0\");if(!isFinite(r))throw new RangeError(\"Count must be < ∞\");for(n=\"\";r;)r%2&&(n+=t),r>1&&(t+=t),r>>=1;return n}},\n",
" function _(t,i,n){var r=t(18),a=Math.abs,o=Math.floor;i.exports=function(t){return isNaN(t)?0:0!==(t=Number(t))&&isFinite(t)?r(t)*o(a(t)):t}},\n",
" function _(n,t,i){t.exports=n(19)()?Math.sign:n(20)},\n",
" function _(n,t,o){t.exports=function(){var n=Math.sign;return\"function\"==typeof n&&(1===n(10)&&-1===n(-20))}},\n",
" function _(n,r,t){r.exports=function(n){return n=Number(n),isNaN(n)||0===n?n:n>0?1:-1}},\n",
" function _(e,r,a){e(22)()||Object.defineProperty(Array,\"from\",{value:e(23),configurable:!0,enumerable:!1,writable:!0})},\n",
" function _(n,o,r){o.exports=function(){var n,o,r=Array.from;return\"function\"==typeof r&&(o=r(n=[\"raz\",\"dwa\"]),Boolean(o&&o!==n&&\"dwa\"===o[1]))}},\n",
" function _(e,l,r){var n=e(24).iterator,t=e(44),a=e(45),i=e(46),u=e(47),o=e(10),f=e(8),c=e(48),v=Array.isArray,h=Function.prototype.call,y={configurable:!0,enumerable:!0,writable:!0,value:null},s=Object.defineProperty;l.exports=function(e){var l,r,A,g,p,w,b,d,x,j,O=arguments[1],m=arguments[2];if(e=Object(o(e)),f(O)&&u(O),this&&this!==Array&&a(this))l=this;else{if(!O){if(t(e))return 1!==(p=e.length)?Array.apply(null,e):((g=new Array(1))[0]=e[0],g);if(v(e)){for(g=new Array(p=e.length),r=0;r
\"],_default:[0,\"\",\"\"]};function ve(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):void 0!==e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&N(e,t)?b.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),\"script\"),l&&ye(a),n)for(c=0;o=a[c++];)he.test(o.type||\"\")&&n.push(o);return f}me=r.createDocumentFragment().appendChild(r.createElement(\"div\")),(xe=r.createElement(\"input\")).setAttribute(\"type\",\"radio\"),xe.setAttribute(\"checked\",\"checked\"),xe.setAttribute(\"name\",\"t\"),me.appendChild(xe),h.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML=\"\",h.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return r.activeElement}catch(e){}}()==(\"focus\"===t)}function Ae(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return b().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=b.guid++)),e.each(function(){b.event.add(this,t,i,r,n)})}function De(e,t,n){n?(Y.set(e,t,!1),b.event.add(e,t,{namespace:!1,handler:function(e){var r,i,a=Y.get(this,t);if(1&e.isTrigger&&this[t]){if(a.length)(b.event.special[t]||{}).delegateType&&e.stopPropagation();else if(a=o.call(arguments),Y.set(this,t,a),r=n(this,t),this[t](),a!==(i=Y.get(this,t))||r?Y.set(this,t,!1):i={},a!==i)return e.stopImmediatePropagation(),e.preventDefault(),i.value}else a.length&&(Y.set(this,t,{value:b.event.trigger(b.extend(a[0],b.Event.prototype),a.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,t)&&b.event.add(e,t,ke)}b.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(e);if(v)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&b.find.matchesSelector(re,i),n.guid||(n.guid=b.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(t){return void 0!==b&&b.event.triggered!==t.type?b.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||\"\").match(P)||[\"\"]).length;l--;)d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=b.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=b.event.special[d]||{},c=b.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&b.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),b.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){for(l=(t=(t||\"\").match(P)||[\"\"]).length;l--;)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){for(f=b.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||b.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(u)&&Y.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=b.event.fix(e),u=new Array(arguments.length),l=(Y.get(this,\"events\")||{})[s.type]||[],c=b.event.special[s.type]||{};for(u[0]=s,t=1;t=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:b.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,qe=/"
],
"text/plain": [
":Scatter [repressor copy number] (fold change)"
]
},
"execution_count": 4,
"metadata": {
"application/vnd.holoviews_exec.v0+json": {
"id": "1004"
}
},
"output_type": "execute_result"
}
],
"source": [
"scatter = hv.Scatter(\n",
" data=df_simple, \n",
" kdims=[\"repressor copy number\"], \n",
" vdims=[\"fold change\"]\n",
").opts(\n",
" logx=True,\n",
")\n",
"\n",
"scatter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that the level of gene expression (as metricized by fold change) decreases with the number of repressors, which jibes with what we know about gene regulations. Again, it will be faster to work with NumPy arrays throughout, so let's save those here."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"R = df_simple[\"repressor copy number\"].values\n",
"fc = df_simple['fold change'].values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pairs bootstrap? No.\n",
"\n",
"With this dataset, it becomes abundantly clear that we are **not** interested in the variability of the number of repressors. Quite the opposite, the experimentalists worked hard to manipulate various cell strains to have these desired copy numbers and explicitly took 10 replicates for each strain. Doing a pairs bootstrap in this case could wreck havoc on the carefully designed experiment, since the bootstrap samples would likely incorporate data from some strains more than others. As we saw in the previous data set, let's take the approach of resampling the residuals. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Resampling residuals? Maybe.\n",
"\n",
"Let's first set up the frame work of our MLE estimate. While I won't go into the details here, the mathematical model of fold change is\n",
"\n",
"\\begin{align}\n",
"\\text{fold change} = \\frac{1}{1 + \\frac{2R}{N_{NS}} e^{- \\Delta \\epsilon \\ / \\ k_BT }},\n",
"\\end{align}\n",
"\n",
"where $N_{NS}$ is the number of non-specific binding sites, $R$ is the number of repressors, and $\\Delta \\epsilon$ in the binding engergy of the repressor to the operator in units of $k_BT$. In this case, I actually already know the binding energy, but for sake argument, let's pretend we don't and get a MLE for this parameter. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"N_NS = 5e6\n",
"\n",
"def theor_fold_change(N_NS, R, delta_e):\n",
" \"\"\"Compute fold change using mathematical model\"\"\"\n",
" return 1 / (1 + 2*R/N_NS * np.exp(-delta_e))\n",
"\n",
"\n",
"def log_likelihood(params, R, fc_data):\n",
" \"\"\"Log likelihood of fold change model.\"\"\"\n",
" delta_e, sigma = params\n",
"\n",
" if sigma <= 0:\n",
" return -np.inf\n",
"\n",
" fc_theory = theor_fold_change(N_NS, R, delta_e)\n",
" return np.sum(st.norm.logpdf(np.log(fc_data), np.log(fc_theory), sigma))\n",
"\n",
"\n",
"def resid(params, R, fc_data):\n",
" delta_e = params[0]\n",
" return fc_data - theor_fold_change(N_NS, R, delta_e)\n",
"\n",
"\n",
"def fc_mle(R, fc_data):\n",
" \"\"\"Compute MLE for parameters in fold-change model.\"\"\"\n",
" res = scipy.optimize.least_squares(resid, np.array([-5]), args=(R, fc_data))\n",
"\n",
" # Compute residual sum of squares from optimal params\n",
" rss_mle = np.sum(resid(res.x, R, fc_data)**2)\n",
"\n",
" # Compute MLE for sigma\n",
" sigma_mle = np.sqrt(rss_mle / len(R))\n",
"\n",
" return tuple([x for x in res.x] + [sigma_mle])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With these in hand, we can now get our MLEs."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Value of binding energy: -9.42 kBT\n",
"Value of sigma: 0.06\n"
]
}
],
"source": [
"mle_params = fc_mle(R, fc)\n",
"\n",
"# save these for later\n",
"mle_binding = mle_params[0]\n",
"mle_sigma = mle_params[1]\n",
"\n",
"print(f'Value of binding energy: {np.round(mle_binding, decimals=2)} kBT')\n",
"print(f'Value of sigma: {np.round(mle_sigma, decimals=2)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given my insider knowledge, that binding energy seems reasonable, but let's make a predictive regression plot to check. First, we need to generate samples out of the generative model parametrized by the MLE."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"rg = np.random.default_rng()\n",
"\n",
"def sample_fold_change(delta_e, sigma, R, size=1):\n",
" \"\"\"Generate samples of spindle length vs droplet diameter.\"\"\"\n",
" samples = np.empty((size, len(R)))\n",
"\n",
" for i in range(size):\n",
" mu = theor_fold_change(N_NS, R, delta_e)\n",
" samples[i] = np.maximum(0, rg.normal(mu, sigma))\n",
"\n",
" return samples\n",
"\n",
"R_theor = np.logspace(1, 3, 200)\n",
"samples = sample_fold_change(*mle_params, R_theor, size=5000)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can make the plot."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"(function(root) {\n",
" function embed_document(root) {\n",
" \n",
" var docs_json = {\"3e7df4dd-fe62-4e1d-ad94-d47b6b272171\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1121\",\"type\":\"LogAxis\"}],\"center\":[{\"id\":\"1125\",\"type\":\"Grid\"},{\"id\":\"1130\",\"type\":\"Grid\"}],\"frame_height\":325,\"frame_width\":400,\"left\":[{\"id\":\"1126\",\"type\":\"LinearAxis\"}],\"renderers\":[{\"id\":\"1147\",\"type\":\"GlyphRenderer\"},{\"id\":\"1152\",\"type\":\"GlyphRenderer\"},{\"id\":\"1157\",\"type\":\"GlyphRenderer\"},{\"id\":\"1162\",\"type\":\"GlyphRenderer\"},{\"id\":\"1167\",\"type\":\"GlyphRenderer\"},{\"id\":\"1172\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1175\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1137\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1113\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1117\",\"type\":\"LogScale\"},\"y_range\":{\"id\":\"1115\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1119\",\"type\":\"LinearScale\"}},\"id\":\"1112\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"data_source\":{\"id\":\"1159\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1160\",\"type\":\"Patch\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1161\",\"type\":\"Patch\"},\"selection_glyph\":null,\"view\":{\"id\":\"1163\",\"type\":\"CDSView\"}},\"id\":\"1162\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_color\":\"#6baed6\",\"line_alpha\":0,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1150\",\"type\":\"Patch\"},{\"attributes\":{\"data_source\":{\"id\":\"1154\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1155\",\"type\":\"Patch\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1156\",\"type\":\"Patch\"},\"selection_glyph\":null,\"view\":{\"id\":\"1158\",\"type\":\"CDSView\"}},\"id\":\"1157\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1149\",\"type\":\"ColumnDataSource\"}},\"id\":\"1153\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1189\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1187\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1127\",\"type\":\"BasicTicker\"}},\"id\":\"1130\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1182\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1181\",\"type\":\"UnionRenderers\"}},\"id\":\"1144\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1190\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null},\"id\":\"1115\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1131\",\"type\":\"PanTool\"},{\"attributes\":{\"source\":{\"id\":\"1144\",\"type\":\"ColumnDataSource\"}},\"id\":\"1148\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1166\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null},\"id\":\"1113\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_alpha\":0.1,\"fill_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1161\",\"type\":\"Patch\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAAD5AAAAAAAAAPkAAAAAAAAA+QAAAAAAAAD5AAAAAAAAAPkAAAAAAAAA+QAAAAAAAAD5AAAAAAAAAPkAAAAAAAABPQAAAAAAAAE9AAAAAAAAAT0AAAAAAAABPQAAAAAAAAE9AAAAAAAAAT0AAAAAAAABPQAAAAAAAAE9AAAAAAABAYEAAAAAAAEBgQAAAAAAAQGBAAAAAAABAYEAAAAAAAEBgQAAAAAAAQGBAAAAAAABAYEAAAAAAAEBgQAAAAAAAEINAAAAAAAAQg0AAAAAAABCDQAAAAAAAEINAAAAAAAAQg0AAAAAAABCDQAAAAAAAEINAAAAAAAAQg0AAAAAAADCLQAAAAAAAMItAAAAAAAAwi0AAAAAAADCLQAAAAAAAMItAAAAAAAAwi0AAAAAAADCLQAAAAAAAMItA\",\"dtype\":\"float64\",\"shape\":[48]},\"y\":{\"__ndarray__\":\"o8gP9R1V7j/6ilWraAfvPzdxcTt4v+w/jJB5MOXy7z9SIUa0GLnvP2xAOooEzes/+o+2VhM/8D9vFgwYvd3oPygwEoSe5ek/bRxvUEka7j86zcIHy0rnP3809scqkus/mTNjZQB07T+1q/vt7IPrP1Ly6GIBKus/tiG0X8yb6z/J/2hKf8XnP6CQXZzkaOo/bPC4aIEo6j8qsxtdzBLoP319DhrYh+w/ewtpuZEZ6T+nTeGxrzjqP9t15abpyeQ/QvBGsTjl4z+YzSLPWtzlPzyE9bePPuc/g+Nr8yPm5T9+wsg47ivfP+wT7gHiV+E/U0OVIBcw4z/I5931pp/kP8aBe8EJzs8/Ai1k55WS0D8tyR9fMM/LP0A/gSB7ccc/3iEwFZDw0D+UdwZvKYvPP6dzBDESm80/CKqAYybDyj+AFToZe+LFP9O3bv1uicQ/6ISAMnk5wz8+bpHcuJbLP0sLN1tM5sc/bUVS6Hb6yT9FIJiR8RLJP8inLcbab8U/\",\"dtype\":\"float64\",\"shape\":[48]}},\"selected\":{\"id\":\"1192\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1191\",\"type\":\"UnionRenderers\"}},\"id\":\"1169\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_alpha\":0.1,\"fill_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1151\",\"type\":\"Patch\"},{\"attributes\":{\"fill_color\":\"#2171b5\",\"line_alpha\":0,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1160\",\"type\":\"Patch\"},{\"attributes\":{\"line_color\":\"#084594\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1165\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1186\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"JtRaqOmB7j96Vn8VgnTuP8I9FgT/bu4/OlbdAlts7j+iSLe+R1buP0HN4bUMWu4/3JZfN7dO7j/HhdQFaDbuP3cD5IldLe4/RpYQngkt7j/d2SvKohnuP84m1ZSPB+4/80UURTgO7j/PbcV5QQzuP2mWk+Uk7+0/nbnW5Ffs7T/UVIi5oc/tPyK9tM8F2O0/fTN5jabU7T9SlH6LWcbtP0G/J6AloO0/O4JGWZiu7T/QCLTdtZbtP5C0nToEje0/tN6ghOlw7T93v8uXTmztPxUYeUcfVe0/ELh4lU9E7T+f00Wr8zztPx6G9Ct+Ie0/whKWPTUU7T9cb8QZTB3tPxxXzjtj++w/jLw9XKHo7D9AwxgkJdHsP0ASjhcXzOw/JUB3io/L7D8EN6ra/7XsP6o3LMc7ouw/lv3TJXiN7D+kCF5em3bsP+MI8Yj0V+w/KPOC475Z7D/GMwnCzC3sP7gtzw0cKew/goyQ1YIL7D+0WF1oBv3rP92ZyUT28Os/okjaOTnC6z/BZdEol7XrPwhJ4/iFo+s/eWqBoPmC6z/b0wnhr4frP3LyT0owdOs/PlDin/tO6z8w7fuKGi/rP0or45V6HOs/h8ZRYrsG6z9qWElJ4erqPxO1n5Nf1uo/FbyG5gCx6j8mc7LOTp7qPyFYpxXVc+o/zhxp0iBx6j98a2tdhVfqP46txa6eMOo/YDgLeKYO6j81/Jq85/XpP2ruCTLS0ek/42Fj3/2x6T+CPyFUQ5zpP1+yl50shuk/a8h3Q4Nl6T+gAfOEQizpPx9/rCGnJOk/zrClQakB6T86/Aq9jt/oP+6+onBqt+g/dBnaUSOd6D9CZCNlTWroP1znyY6KV+g/PFmsY5pP6D8kXlMxwQvoP9h3YoRW6uc/crobv7nP5z+6pzvgupvnPzdRyQQQeOc/GhnVX5le5z9QF6d64S7nP5MqVyc6Euc/ZQvaCZ3z5j9M8mx1l8rmPzKCIxG4nuY/blHgcol95j8kDdkgDEzmP0E8wfYqIuY/CoI/mx/+5T/I4PTsgN3lP+4J18a9peU/2jRbOQV65T/o6xWQ9lblP6w7XgngI+U/IN05FY0G5T9GmTalFtDkP42NzrbNr+Q/hBzi4MmE5D/yJsguHl7kPxrV4F6oIeQ/FtuHDJjr4z/k7A3W8NPjP0dM/FNBm+M/n/22g2Z54z+o/wOA6jnjP7Y7DV/QFOM/3FkPAYD34j/oqF5Llb3iP6RAHbhzkeI/iblUIFVR4j8NdbBr6zjiP/hjiqN3/uE/larKMM7a4T+LfLdV4aXhPzIxV8iPhOE/dd3ufzJT4T+c+2DP1RvhP0Dak57k5eA/cXQjgh/C4D86mg+tQYzgP/AfCjLiZ+A/xAJYNx4t4D+ajJMD3PzfP56e3T1crN8/zuwPGqxH3z/s1uJ84ufeP3Jfb7TDjN4/TtxmKQkZ3j+WknAHXtjdP91KSbT7Wt0/cEIUhrQX3T8k05qFvsjcP1psBiSOUdw/np3ub2DY2z95ThJquYjbP49KDaXSPds/fGut4XXT2j8iWRgflZLaP0R/1VidLto/7SgU937X2T+hp4cYj2/ZPywlGdbW+tg/Gj6nB4TP2D/rKXgM+UDYPySEdK8cFdg/tvtonNit1z84y0FkiF7XP1wSO5j36tY/X8FaAk+s1j8qfP2ivS3WP8yAG/DvAdY/39XIWVmu1T+LDJx3HWHVPxrbS3x83tQ/UKy7kAGt1D/f9sNn4lTUP5if6P1mDtQ/gmNgyAO00z8eyD/VdlbTPzuKLxGqMdM/W7x7i/fI0j8M2ZUByVvSP0QzebC8LNI/gImFg1nz0T/+yFMjO4nRP9a413SQQtE/Z2Vk/GUA0T9splmVLqvQP5c1AdvwTdA/jrAyP60g0D82SDbPqp3PP+qrlCKh9s4/Tr7sg8OIzj8e9NjT7RPOP/O7iIC/qM0/Zgap6ZsYzT+wEBBqfW/MPyIL4zvkD8w/om9XZkeYyz8yewzInRbLP0wtuejdeMo/Q2+l11o3yj8oeaUqlYnJPwSCRVZsGMk/9MSfdJO4yD9qEkD8UVvIPy6A6CKcfcc/o2LtSFsUxz9un/72offGP7GhdGljXcY/h/TvR6cDxj+REEmZRJTFPw==\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1190\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1189\",\"type\":\"UnionRenderers\"}},\"id\":\"1164\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1184\",\"type\":\"Selection\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":2},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1171\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1191\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data_source\":{\"id\":\"1144\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1145\",\"type\":\"Patch\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1146\",\"type\":\"Patch\"},\"selection_glyph\":null,\"view\":{\"id\":\"1148\",\"type\":\"CDSView\"}},\"id\":\"1147\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_color\":\"#9ecae1\",\"line_alpha\":0,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1145\",\"type\":\"Patch\"},{\"attributes\":{\"fill_alpha\":0.1,\"fill_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1156\",\"type\":\"Patch\"},{\"attributes\":{},\"id\":\"1182\",\"type\":\"Selection\"},{\"attributes\":{\"text\":\"\",\"text_color\":{\"value\":\"black\"},\"text_font_size\":{\"value\":\"12pt\"}},\"id\":\"1175\",\"type\":\"Title\"},{\"attributes\":{\"ticker\":null},\"id\":\"1177\",\"type\":\"LogTickFormatter\"},{\"attributes\":{},\"id\":\"1188\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1119\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1117\",\"type\":\"LogScale\"},{\"attributes\":{\"fill_color\":{\"value\":\"orange\"},\"line_color\":{\"value\":\"orange\"},\"size\":{\"units\":\"screen\",\"value\":2},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1170\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1192\",\"type\":\"Selection\"},{\"attributes\":{\"ticker\":{\"id\":\"1122\",\"type\":\"LogTicker\"}},\"id\":\"1125\",\"type\":\"Grid\"},{\"attributes\":{\"data_source\":{\"id\":\"1164\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1165\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1166\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1168\",\"type\":\"CDSView\"}},\"id\":\"1167\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_color\":\"#4292c6\",\"line_alpha\":0,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1155\",\"type\":\"Patch\"},{\"attributes\":{\"source\":{\"id\":\"1169\",\"type\":\"ColumnDataSource\"}},\"id\":\"1173\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1185\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1134\",\"type\":\"SaveTool\"},{\"attributes\":{\"num_minor_ticks\":10},\"id\":\"1122\",\"type\":\"LogTicker\"},{\"attributes\":{\"source\":{\"id\":\"1159\",\"type\":\"ColumnDataSource\"}},\"id\":\"1163\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"repressor copy number\",\"formatter\":{\"id\":\"1177\",\"type\":\"LogTickFormatter\"},\"ticker\":{\"id\":\"1122\",\"type\":\"LogTicker\"}},\"id\":\"1121\",\"type\":\"LogAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"1149\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1150\",\"type\":\"Patch\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1151\",\"type\":\"Patch\"},\"selection_glyph\":null,\"view\":{\"id\":\"1153\",\"type\":\"CDSView\"}},\"id\":\"1152\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1164\",\"type\":\"ColumnDataSource\"}},\"id\":\"1168\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1132\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1135\",\"type\":\"ResetTool\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1188\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1187\",\"type\":\"UnionRenderers\"}},\"id\":\"1159\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"AAAAAAAAJEC17f/K3XckQBxcvvuJ8iRA4AvRYxVwJUAtfJo5kfAlQKYKphoPdCZAOzgSDqH6JkBqZwmHWYQnQLVqSWdLEShAMDy6AYqhKEDROBQdKTUpQLU8lvY8zClAY//LRNpmKkBxEWU6FgUrQF3fHIkGpytASx+0ZMFMLEB1EvyFXfYsQMoE9C3yoy1AR3j5KJdVLkDsawvSZAsvQJswIRZ0xS9AuKDKO+9BMECaS9IIX6MwQOl4Ac4WBzFAukpCNyRtMUDU/W5CldUxQDH+PEF4QDJArXoz29utMkDLvK0Pzx0zQCuL6TdhkDNAqN4hCaIFNEA+NLaWoX00QBvHXlRw+DRARwBuGB92NUAfax8ev/Y1QHl/9AdiejZAmZQf4hkBN0CkUf0k+Yo3QH7ynLcSGDhAArpX8nmoOEBD7HehQjw5QHOu7weB0zlAGCsg4kluOkCDXLFosgw7QDHhelPQrjtA9T9+3LlUPED5BPPChf48QOMhZU5LrD1AGP/lUSJePkDwrVAvIxQ/QEyuodpmzj9Aul6xboNGQEDKkhWtDqhAQKaEGojiC0FAfhSErwxyQUADUR0lm9pBQFoWpD6cRUJAOi/Apx6zQkCcPQZkMSNDQG+xBtHjlUNAaBVpqEULREBJ/BMCZ4NEQLzZYVZY/kRArhRjgCp8RUA9oi3A7vxFQCB6Or22gEZADzjRiJQHR0CBPoKgmpFHQCyyr/DbHkhAGKcl12uvSEAX2sElXkNJQGtUKyXH2klAOlial7t1SkAJ+LC7UBRLQOG8ZE+ctktAJ8H5krRcTEBcqQ9MsAZNQBflwMimtE1AbqbU4q9mTkCd/wMD5BxPQMaZUiRc109AKr296xhLUEB/Jzmjv6xQQNrd/JuvEFFAGpSnifZ2UUANR/Zxot9RQMFlsK7BSlJAYYCf72K4UkDtwZI8lShTQEx7bvdnm1NAGQhI3uoQVEBBV44NLolUQAhjPwJCBFVAL+YqnDeCVUB1nUIgIANWQKBm+DoNh1ZAUZCqAhEOV0Bnrx76PZhXQEpRCxOnJVhA/eOwsF+2WEApL4Kqe0pZQIu73E4P4llADIjRZS99WkBUbv4z8RtbQO2aeH1qvltARH/IiLFkXEARpvch3Q5dQKfVsJ0EvV1Aku1y3D9vXkAX8NZNpyVfQFSq6fNT4F9ANrhMs69PYEA0M5zrcbFgQFLoCQp+FWFAD3UQxuF7YUDL4F8pq+RhQJJQypHoT2JA+EM8s6i9YkDgn8CZ+i1jQDPOkKvtoGNAyDoxq5EWZECGd5q59o5kQMpTb1gtCmVAajRAbEaIZUAX/Ns+UwlmQCvVroFljWZAEzAvUI8UZ0CcS1ky455nQCGeOR90LGhA6HiGf1W9aEDvQEkwm1FpQFmal4VZ6WlAV+ZcTaWEakAidTTSkyNrQF7QVN46xmtARISMvrBsbEA/0FBFDBdtQJaq3s1kxW1AqYRuP9J3bkB/QHsQbS5vQG/KHEpO6W9AQma7xUdUcEAw+p2GJbZwQEgjo9JNGnFA8n4iZc6AcUDTO8BLtelxQGxYWugQVXJA720B8+/CckBjTP17YTNzQBav3e10pnNAxlGXDzocdECLsK0GwZR0QJK+aVkaEHVAj+Ed8VaOdUDSgHcciA92QCp63pG/k3ZAJ8/icQ8bd0BU4LhJiqV3QMiNxBVDM3hAxpUzRE3EeECFjae3vFh5QPTQ78ml8HlAe8nTTh2MekDd7e2WOCt7QNXel3INzntAwwfoNLJ0fEC/K8G2PR99QLJK9FnHzX1AzUx1DGeAfkAH5KJLNTd/QMoXoidL8n9A6PdmI+FYgECO25102rqAQHQpKvYeH4FAbZVBZ7yFgUB9kn3ZwO6BQFgcybI6WoJAVBBarzjIgkA7W7bjyTiDQHVCxb79q4NArRHtC+QhhECxdj31jJqEQMXXpgUJFoVAcPI+K2mUhUDBEZO5vhWGQEMuCGwbmoZAXUpJaJEhh0C5YMRAM6yHQDo8NvcTOohATJJF/0bLiEC7uy1B4F+JQA9peRz094lAdLLNapeTikCF5cWC3zKLQJd04Dri1YtADG997LV8jEAV6+52cSeNQK3Mm0Is1o1AC1g1RP6IjkAAAAAAAECPQAAAAAAAQI9AC1g1RP6IjkCtzJtCLNaNQBXr7nZxJ41ADG997LV8jECXdOA64tWLQIXlxYLfMotAdLLNapeTikAPaXkc9PeJQLu7LUHgX4lATJJF/0bLiEA6PDb3EzqIQLlgxEAzrIdAXUpJaJEhh0BDLghsG5qGQMERk7m+FYZAcPI+K2mUhUDF16YFCRaFQLF2PfWMmoRArRHtC+QhhEB1QsW+/auDQDtbtuPJOINAVBBarzjIgkBYHMmyOlqCQH2SfdnA7oFAbZVBZ7yFgUB0KSr2Hh+BQI7bnXTauoBA6PdmI+FYgEDKF6InS/J/QAfkoks1N39AzUx1DGeAfkCySvRZx819QL8rwbY9H31AwwfoNLJ0fEDV3pdyDc57QN3t7ZY4K3tAe8nTTh2MekD00O/JpfB5QIWNp7e8WHlAxpUzRE3EeEDIjcQVQzN4QFTguEmKpXdAJ8/icQ8bd0Aqet6Rv5N2QNKAdxyID3ZAj+Ed8VaOdUCSvmlZGhB1QIuwrQbBlHRAxlGXDzocdEAWr93tdKZzQGNM/XthM3NA720B8+/CckBsWFroEFVyQNM7wEu16XFA8n4iZc6AcUBII6PSTRpxQDD6nYYltnBAQma7xUdUcEBvyhxKTulvQH9AexBtLm9AqYRuP9J3bkCWqt7NZMVtQD/QUEUMF21ARISMvrBsbEBe0FTeOsZrQCJ1NNKTI2tAV+ZcTaWEakBZmpeFWelpQO9ASTCbUWlA6HiGf1W9aEAhnjkfdCxoQJxLWTLjnmdAEzAvUI8UZ0Ar1a6BZY1mQBf82z5TCWZAajRAbEaIZUDKU29YLQplQIZ3mrn2jmRAyDoxq5EWZEAzzpCr7aBjQOCfwJn6LWNA+EM8s6i9YkCSUMqR6E9iQMvgXymr5GFAD3UQxuF7YUBS6AkKfhVhQDQznOtxsWBANrhMs69PYEBUqunzU+BfQBfw1k2nJV9Aku1y3D9vXkCn1bCdBL1dQBGm9yHdDl1ARH/IiLFkXEDtmnh9ar5bQFRu/jPxG1tADIjRZS99WkCLu9xOD+JZQCkvgqp7SllA/eOwsF+2WEBKUQsTpyVYQGevHvo9mFdAUZCqAhEOV0CgZvg6DYdWQHWdQiAgA1ZAL+YqnDeCVUAIYz8CQgRVQEFXjg0uiVRAGQhI3uoQVEBMe273Z5tTQO3BkjyVKFNAYYCf72K4UkDBZbCuwUpSQA1H9nGi31FAGpSnifZ2UUDa3fybrxBRQH8nOaO/rFBAKr296xhLUEDGmVIkXNdPQJ3/AwPkHE9AbqbU4q9mTkAX5cDIprRNQFypD0ywBk1AJ8H5krRcTEDhvGRPnLZLQAn4sLtQFEtAOlial7t1SkBrVCslx9pJQBfawSVeQ0lAGKcl12uvSEAssq/w2x5IQIE+gqCakUdADzjRiJQHR0Agejq9toBGQD2iLcDu/EVArhRjgCp8RUC82WFWWP5EQEn8EwJng0RAaBVpqEULREBvsQbR45VDQJw9BmQxI0NAOi/Apx6zQkBaFqQ+nEVCQANRHSWb2kFAfhSErwxyQUCmhBqI4gtBQMqSFa0OqEBAul6xboNGQEBMrqHaZs4/QPCtUC8jFD9AGP/lUSJePkDjIWVOS6w9QPkE88KF/jxA9T9+3LlUPEAx4XpT0K47QINcsWiyDDtAGCsg4kluOkBzru8HgdM5QEPsd6FCPDlAArpX8nmoOEB+8py3Ehg4QKRR/ST5ijdAmZQf4hkBN0B5f/QHYno2QB9rHx6/9jVARwBuGB92NUAbx15UcPg0QD40tpahfTRAqN4hCaIFNEAri+k3YZAzQMu8rQ/PHTNArXoz29utMkAx/jxBeEAyQNT9bkKV1TFAukpCNyRtMUDpeAHOFgcxQJpL0ghfozBAuKDKO+9BMECbMCEWdMUvQOxrC9JkCy9AR3j5KJdVLkDKBPQt8qMtQHUS/IVd9ixASx+0ZMFMLEBd3xyJBqcrQHERZToWBStAY//LRNpmKkC1PJb2PMwpQNE4FB0pNSlAMDy6AYqhKEC1aklnSxEoQGpnCYdZhCdAOzgSDqH6JkCmCqYaD3QmQC18mjmR8CVA4AvRYxVwJUAcXL77ifIkQLXt/8rddyRAAAAAAAAAJEA=\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1184\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1183\",\"type\":\"UnionRenderers\"}},\"id\":\"1149\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1131\",\"type\":\"PanTool\"},{\"id\":\"1132\",\"type\":\"WheelZoomTool\"},{\"id\":\"1133\",\"type\":\"BoxZoomTool\"},{\"id\":\"1134\",\"type\":\"SaveTool\"},{\"id\":\"1135\",\"type\":\"ResetTool\"},{\"id\":\"1136\",\"type\":\"HelpTool\"}]},\"id\":\"1137\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1127\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1179\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data_source\":{\"id\":\"1169\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1170\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1171\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1173\",\"type\":\"CDSView\"}},\"id\":\"1172\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"overlay\":{\"id\":\"1180\",\"type\":\"BoxAnnotation\"}},\"id\":\"1133\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1136\",\"type\":\"HelpTool\"},{\"attributes\":{\"fill_alpha\":0.1,\"fill_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":0,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1146\",\"type\":\"Patch\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[400]},\"y\":{\"__ndarray__\":\"UZSK9kl27T/2MKYIC2vtP/n8Zc0vdO0/G/qM0BJu7T9ce/6iuk/tPwJ6rBvaVO0/uGYvCZlI7T/S63LkoTrtP4PnIoUiM+0/+w6VqBgr7T9xbQRICxztP+7NZxhyBO0/MmErvIv77D/NwC3iKQXtP8a7IpXy5+w/4FqyUhnl7D/oMFsb9svsPxAv/c+v0uw/DwXqzxvG7D8vAnkz0MvsPwIvfNkZouw/AB/HD1mk7D84eIthi5bsPwM3JtYView/OxMGSxhu7D9GIZjZi2LsP4zPgET+U+w/LZaVwwk67D+IAZAzRDHsP7CCC/uIEuw/AgxGYx4M7D/qF6JPiBLsPx57cO4k/Os/fxf7iu3o6z8Eo0/VvsbrP0JabAf8wOs/+KA38CjB6z93boz28qPrP13kJoJvlus/hL4Nol2C6z9s/yLI02LrP3D6iwxeYOs/DkXslCxI6z9URWpQSSzrP8+iBZMgKus/y2tENWoI6z9KAdQALQLrP+7ftnBf7uo/5D6wnPfK6j8ABYfIcbPqP7j9DVB/ouo/9L2sPBF66j+g26sJPojqP3CqwdZrZuo/xVV2w7E+6j+uFo+9uCvqPzQktONXFuo/qEQoTqj+6T8p2j4ePtXpP/ndDSR11uk/IEST57an6T8Zw1HzF5fpP9Ce1DnOcOk/HfFOc3hv6T/yoRpk1UPpP4pcaZG0K+k/rV0ToO0L6T+NBrrf7/PoPwhuV/SZ0ug/PUK8HZau6D9aEUmOg4zoP8JyCBBFgug/rpyGQ59g6D+I7XbQLDDoP9sftDC0Iug/LK0hmq/85z9Y4XGnP+LnP1u3uUP8tuc/TI7bVWWT5z/ysw/x/WfnP0ry9KxFT+c/CT/W7wxJ5z+TPYqBBvfmP6Hh/1xb4uY/kCm4UMjO5j+mdwlydZzmP6KriQJSc+Y/By4X+iNQ5j9zUoVIjDHmP7xHFbN5CuY/t8iQc4Pd5T+L3cLiZcflP5g7JMGJm+U/s3ftmCV75T/7jl9EEkrlPwPdmYlpHOU//rrC1S385D/jBL46eNXkP2yiUowbm+Q/cgbvkSR75D/22lG3i1LkP1VzAgKLIuQ/XOi5GDL24z8ZOzj+q9HjPybAJ3EYreM/74MwA++I4z8WRVQ3xV7jP6q1jy5THeM/0BZWgkvz4j8MIHVdhs7iP9ujJVrrouI/bB3D51Np4j+/FLto9DziP0UonlpJEuI/tDxFXyzj4T8kxD9hTr/hP9ZB4tuUjeE/6AncMAJS4T/mMT/QxTPhP0+IooQl/+A/YRBknynP4D8rt2Mo8Z/gP85xYr8QeuA/AnD2rFNI4D85G+xc7RXgP0KPgLoqx98/46KclqGD3z8GglugixDfP/tynwBAy94/9JPLlEJE3j9sa9Ld4AnePxKpiLmrld0/mkRUetFE3T9ejfTVX9rcP6pI75zkZ9w/hCaDv1sU3D8i2Ao2fMLbP9U6RZY3X9s/8ghvSrMN2z8RbPsSkLjaP9D0iX2iUdo/Pi2Thznc2T+qB/WCDoHZP5zSI4ncMNk/UHN0/snN2D9rjw6F1pDYP+idLNUfHNg/RvPxf2261z/0zc6yyIDXP2alkE7J+tY/1v4V/yS21j9A1ItVyzrWP9vE+eO3D9Y/POO9Giiw1T/3IBbveVnVP6QcmfK75tQ/9L1NaWGt1D+h7cWOujDUP+dIWRQjDtQ/TD1OAhSk0z+g/UcRsEjTP9uRD7nk1tI/SJPJeYqa0j96p+Hpt07SP2IsVJ6bB9I/xv423y+70T/jaddFTETRP/QSMef7INE/GTHyWp2+0D87SDNDgVzQP8rjmtnHINA/2oSJqsGMzz+m9fN42CfPPxCHKGRaUM4/GgNF/WPTzT+WVm8HNDXNP91Z8aZeksw/Yh5wS301zD/KyeNQ+JHLPyxf6ufX8Mo/jAs0RgaQyj9nKPBW4SLKP76TsOZNn8k/et435WQJyT+4DUrAfH3IPxE390YUDsg/0PEjxJpmxz81N/PK5//GP/vUeCPFZMY/ouG7HBwNxj/CBTzuXo7FPxIFw/xZBMU/GFg9OPm1xD9v572rUyfEP7RWOyS5kcM/FMjRh4kIwz/g/x0zh9LCP6aQobDbTsI/QQlKhi/ewT8RL2fZg37BPwno1bZ7gsk/gL47bFkFyj8E2d+91XjKP/a++tTXKss/zaWW06o5yz/fGAASObHLPyQ33dPLQcw/4tJyGgTjzD+22nGWdC7NPxo2OVOsqc0/uluBasExzj/csyWUCLPOP4CGzbL7Kc8/gwWz4Z2Yzz+Bvc4KWQ7QP8MFVsCXTtA/yXQPaVyO0D8gkHuWL83QP/0T+CTpL9E//FBiVhNG0T+w4+3nq4vRPwwkqoeA1dE/1TkMM/Eq0j8M6qBJMFrSP3lR2J9trdI/E9DpqDz50j+8NCuRdFvTP+YmRqqYndM/MLRwVWb40z9MrL0DvznUP6bdYW4gZdQ/vLjQeia61D9pFOgvkyXVP5C9Z3JBZ9U/fTyzHnmz1T+IUWpuPxrWP0rRlBcFctY/6wkCUerD1j9C1c6zSPrWP47TMjBdY9c/KoREweSd1z/ZKW7IAgfYP00y+0mmO9g/8oo9d92o2D+stdcWVefYP2pxZT/9atk/wLE/kL652T/RHQzPjSzaP4V1zr3PTto/Rx6mjxjU2j/kFf5am/baPxEz4ax2jNs/x/O1pDXa2z/Lts0dhyzcP9hp02R5mNw/0lR9W6ve3D9abCAchUXdP4qPoOM8qd0/QKd3ysjU3T/uLsWUmGPeP4hBKlrvv94/blGjdxsN3z8e+zdMd3PfP0slMPmO1N8/uR9EiW8U4D+zTjg5o07gP8b0OdOZfeA/QBIpekul4D90TDUBBOfgP3hS1s4BCuE/pxwxG2Ur4T9KwVqnW2rhPy+KA4TmluE//ccsWCy84T/GTpVaJfLhP+qSz+UHHuI/ingtjnFh4j+m1JiwOIriP/YRKtmQtOI/TCChlPfk4j/QBE34dALjP0ItpH7cQuM/b14mb8xZ4z+1L6PgaJbjP9vpKYD3s+M/Q8FnJAf94z8gu0U6DSHkP6t1HZ63POQ/Mb+2or6K5D+Uxat6kKzkP96jHibBz+Q/PQhhcvDv5D9zdPY4jiLlPzCSEBo7ZOU/4q35L0eP5T8AF1KTZ7XlP1qx+/Vw2OU/z5kGIWEJ5j8+S63paTHmPxoHPoBRXOY/HbMT9E6I5j+pNlQ6+ZnmP+Jmxq5h2OY/qdag9AAB5z/C8xS9qR7nP5coqjSpVec/EUC2J8B85z8UVjglT6fnPwaImdH90+c/uTcsbpnw5z9CF4n6pxXoPyeG+H3YPug/CJr1XJdz6D9A4yfhknroP1h5fBvJqug/nxpUFGfX6D80e5gxC/XoP4IizfQBEuk/7SQ8aldS6T+gv6WLx1rpP9+JWKxgcuk/tdsLCTSj6T94Q0z4X8zpP2rUX9vW3uk/jWiVJF396T/NsMgyCyPqP2VEvJyoO+o/LSVIf+hi6j8aiSjLjY3qP1LGIOyPnuo/7qZ8C4Cv6j81xlz5yuTqPwiM7kGP9eo/edBz+4kR6z+0jEkDXS/rP5YqpY5CVOs/rqT3UrF16z8qOM0tNn7rP6zYNC7Zn+s/AC8VOEa46z/C4pQfbNzrP+IG0+YB6us/OBDSJd8M7D8s2HJNbR7sP1D/c/IRNuw/Cn8xAANR7D+IwfD2VXLsP4saTA4mhew/4k/+YfB+7D8BrzITHLDsP+Q0vOuewOw/hmjhhzXI7D86aIXwW+/sP4v9PgyZ++w/7rBivBER7T/AiwQj1TDtP1jO5IC3M+0/khB8pshT7T9RzRAft2HtP9jxOZPBbO0/2p50KO6Q7T9QQZEuNaTtP8hYuJmXve0/tpDBCOzN7T8ItgvNFs/tP+aQQwB14u0/pn4Zb8nz7T8YgUUpHQvuP5UVnTa0H+4/20+StVEe7j+SQWQkgC/uP9GXEZvEQe4/Vw0h2Ns+7j+cUOznfF3uP9BePzQWfO4/5PBzOf197j8wbTwBuoXuP6bSv8+qoe4/nvQopaOv7j96+gf6tabuP2skTdgXze4/YwuuqXTV7j+oqygT0NruPxizuzml1+4/BHvrfqDt7j//2DalifzuP8j3woU5Eu8/DjC9hxYQ7z8sQDnMlhnvP6JnU5X+IO8/BHTtEJIt7z9U1KjEiTXvP2Zcw7pSN+8/bBqTg0FR7z9C7FJscVLvP8sI4dBKZu8/TzKpXTJr7z/evB2Z8W3vPx8HipsVge8/TCOS05V77z8=\",\"dtype\":\"float64\",\"shape\":[400]}},\"selected\":{\"id\":\"1186\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1185\",\"type\":\"UnionRenderers\"}},\"id\":\"1154\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis_label\":\"fold change\",\"formatter\":{\"id\":\"1179\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1127\",\"type\":\"BasicTicker\"}},\"id\":\"1126\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"1154\",\"type\":\"ColumnDataSource\"}},\"id\":\"1158\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1183\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1180\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1181\",\"type\":\"UnionRenderers\"}],\"root_ids\":[\"1112\"]},\"title\":\"Bokeh Application\",\"version\":\"1.4.0\"}};\n",
" var render_items = [{\"docid\":\"3e7df4dd-fe62-4e1d-ad94-d47b6b272171\",\"roots\":{\"1112\":\"b325050f-9140-4d72-a04f-1f3a239d5b32\"}}];\n",
" root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
"\n",
" }\n",
" if (root.Bokeh !== undefined) {\n",
" embed_document(root);\n",
" } else {\n",
" var attempts = 0;\n",
" var timer = setInterval(function(root) {\n",
" if (root.Bokeh !== undefined) {\n",
" clearInterval(timer);\n",
" embed_document(root);\n",
" } else {\n",
" attempts++;\n",
" if (attempts > 100) {\n",
" clearInterval(timer);\n",
" console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
" }\n",
" }\n",
" }, 10, root)\n",
" }\n",
"})(window);"
],
"application/vnd.bokehjs_exec.v0+json": ""
},
"metadata": {
"application/vnd.bokehjs_exec.v0+json": {
"id": "1112"
}
},
"output_type": "display_data"
}
],
"source": [
"p = bebi103.viz.predictive_regression(\n",
" samples=samples,\n",
" samples_x=R_theor,\n",
" data=df_simple[[\"repressor copy number\", 'fold change']].values,\n",
" x_axis_label='repressor copy number',\n",
" y_axis_label='fold change',\n",
" x_axis_type='log',\n",
")\n",
"\n",
"bokeh.io.show(p)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Interestingly, for high repressor copy numbers, the data are much closer to the median data predicted by the model. This is a hallmark of **heteroskedasticity**, which means that $\\sigma$ can differ based on the measured values and/or the explanatory variables. We will discuss the **wild bootstrap** as a way of dealing with this momentarily, but first let's get confidence intervals on the MLEs of the parameters by resampling the residuals as we did before."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"@numba.njit\n",
"def resampled_residuals(y_fit, residuals):\n",
" \"\"\"Produces resampled fitted response variable with the provided residuals.\"\"\"\n",
" bs_residuals = np.random.choice(residuals, size=len(residuals))\n",
" return y_fit + bs_residuals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get set up, let's first get the fold change values our MLE would predict and the residuals when we compare our data to these predicited values."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# get our fc predictions\n",
"MLE_fc_pred = theor_fold_change(N_NS, R, mle_params[0])\n",
"\n",
"# get our residual values\n",
"resids = fc - MLE_fc_pred"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With these in hand, we are ready to repeatedly resample the residuals. "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1000/1000 [00:02<00:00, 425.75it/s]\n"
]
},
{
"data": {
"text/plain": [
"array([[-9.53919896, 0.04663431],\n",
" [-9.34642506, 0.07349635]])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"num_trials = 1000\n",
"bs_MLEs_resampled_resids = np.zeros([2, num_trials])\n",
"\n",
"for i in tqdm.tqdm(range(num_trials)):\n",
" fc_resamp = resampled_residuals(MLE_fc_pred, resids)\n",
" mle_params = fc_mle(R, fc_resamp)\n",
" bs_MLEs_resampled_resids[:,i] = mle_params\n",
"\n",
"resampled_resids_CI = np.percentile(bs_MLEs_resampled_resids, [2.5, 97.5], axis=1)\n",
"resampled_resids_CI"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the plot of the data, we saw that there is much more variability in the measurement of fold change when the value of fold change is higher, known as heteroskedasticity. Heteroskedasticity can be a source of problems when doing residual resampling, as we will often assign a large residual to an y-value that would realistically not yield that much variability. This issue is most clearly illustrated by showing plots of what our resampled data look like. "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.holoviews_exec.v0+json": "",
"text/html": [
"
\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" \n",
"
\n",
""
],
"text/plain": [
"Column\n",
" [0] Button(button_type='primary', name='Bootstrap!')\n",
" [1] ParamFunction(function)"
]
},
"execution_count": 13,
"metadata": {
"application/vnd.holoviews_exec.v0+json": {
"id": "1307"
}
},
"output_type": "execute_result"
}
],
"source": [
"# make a clickable button\n",
"button = pn.widgets.Button(name=\"Bootstrap!\", button_type=\"primary\")\n",
"\n",
"# define a bootstrap and plot function\n",
"@pn.depends(button.param.clicks)\n",
"def bs_and_plot(_):\n",
" fc_resamp = resampled_residuals(MLE_fc_pred, resids)\n",
"\n",
" return hv.Scatter(data=(R, fc_resamp), \n",
" kdims=[\"repressor copy number\"],\n",
" vdims=[\"fold change\"]\n",
" ).opts(ylim=(0,1))\n",
"\n",
"pn.Column(button, bs_and_plot)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that oftentimes, the high repressor copy number strains show much wider variability in fold change than they do in the original data, likely bringing up our estimate on $\\sigma$. A solution?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wild bootstrap\n",
"\n",
"An approach you might see in this situation is a wild bootstrap, where rather than scrambling the residuals across all the y values, you retain the association of each residual to its original y value. Then your bootstrap samples allow the residuals to vary around their original value in a normally distributed manner, scaled by the original residual. In other words, if the residual for data point $i$ is $\\epsilon_i$, then the wild bootstrapped residual is $\\epsilon^*_i = \\epsilon_i \\cdot v_i$ where $v_i$ is drawn from a Normal distribution with location parameter zero and scale parameter one.\n",
"\n",
"This approach allows us to make bootstrap samples that retain the non-uniform variability that we see in the original data. We show this approach below for completeness and since it's a common technique you might see, but we suggest using it with caution for reasons that will be come clear. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def wild_bootstrap(y_fit, residuals):\n",
" \"\"\"Produces resampled fitted response variable with the provided residuals.\"\"\"\n",
" resampled_residuals = residuals * np.random.normal(size=len(residuals))\n",
" return y_fit + resampled_residuals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's visually check out what happens with the wild bootstrap."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.holoviews_exec.v0+json": "",
"text/html": [
"
\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" \n",
"
\n",
""
],
"text/plain": [
"Column\n",
" [0] Button(button_type='primary', name='Bootstrap!')\n",
" [1] ParamFunction(function)"
]
},
"execution_count": 15,
"metadata": {
"application/vnd.holoviews_exec.v0+json": {
"id": "1424"
}
},
"output_type": "execute_result"
}
],
"source": [
"# make a clickable button\n",
"button = pn.widgets.Button(name=\"Bootstrap!\", button_type=\"primary\")\n",
"\n",
"# define a bootstrap and plot function\n",
"@pn.depends(button.param.clicks)\n",
"def bs_and_plot(_):\n",
"\n",
" # now doing wild boostrap\n",
" fc_resamp = wild_bootstrap(MLE_fc_pred, resids)\n",
"\n",
" return hv.Scatter(data=(R, fc_resamp), \n",
" kdims=[\"repressor copy number\"],\n",
" vdims=[\"fold change\"]\n",
" ).opts(ylim=(0,1))\n",
"\n",
"pn.Column(button, bs_and_plot)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can now see that the low repressor copy number strains retain high variability in fold change and vice versa, which better reflects what we saw in the original data. \n",
"\n",
"Now we would like to use this bootstrapping technique to get confidence intervals on our parameter estimates. But wait. What about $\\sigma$ now? By choosing to use a wild bootstrap, we have baked into our log likelihood that the residual for each data point is normally distributed about the empirical residual with a scale parameter that scales with the size of the empirical residual.\n",
"\n",
"This is a way of dealing with heteroskedasticity without seriously considering the variation in measurement in a generative way. **This is why we warn away from using the wild bootstrap.** In this case, it would be more appropriate to explicitly construct a generative model that reflects how we suspect $\\sigma$ to scale rather than taking a non-parametric approach that simulates the heteroskedasticity.\n",
"\n",
"To implement this, we do not need to estimate a $\\sigma$, since it is no longer a parameter in our generative model. Since we already did the work of finding the parameters by least squares, we can use the same MLE solver we used before, and just ignore the estimate of $\\sigma$. So, let's use wild bootstrap to get our confidence intervals on the binding energy."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1000/1000 [00:02<00:00, 488.25it/s]\n"
]
},
{
"data": {
"text/plain": [
"array([-9.52745141, -9.31528148])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"num_trials = 1000\n",
"bs_MLEs_wild = np.zeros(num_trials)\n",
"\n",
"for i in tqdm.tqdm(range(num_trials)):\n",
" fc_resamp = wild_bootstrap(MLE_fc_pred, resids)\n",
" mle_params = fc_mle(R, fc_resamp)\n",
" bs_MLEs_wild[i] = mle_params[0]\n",
"\n",
"wild_CI = np.percentile(bs_MLEs_wild, [2.5, 97.5])\n",
"wild_CI"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The confidence interval on the binding energy seems shifted but let's visualize it!"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"(function(root) {\n",
" function embed_document(root) {\n",
" \n",
" var docs_json = {\"92ae4a04-971a-4344-a924-bf869cc10cb0\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1550\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1554\",\"type\":\"Grid\"},{\"id\":\"1558\",\"type\":\"Grid\"}],\"frame_height\":100,\"frame_width\":450,\"left\":[{\"id\":\"1555\",\"type\":\"CategoricalAxis\"}],\"renderers\":[{\"id\":\"1575\",\"type\":\"GlyphRenderer\"},{\"id\":\"1580\",\"type\":\"GlyphRenderer\"},{\"id\":\"1585\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1607\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1565\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1542\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1546\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1544\",\"type\":\"FactorRange\"},\"y_scale\":{\"id\":\"1548\",\"type\":\"CategoricalScale\"}},\"id\":\"1541\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1611\",\"type\":\"CategoricalTickFormatter\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":[-9.420683698686542,-9.420683698686542],\"y\":[\"resampled residuals\",\"wild bootstrap\"]},\"selected\":{\"id\":\"1614\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1613\",\"type\":\"UnionRenderers\"}},\"id\":\"1572\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1612\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1564\",\"type\":\"HelpTool\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1573\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"ZYGGHA4OI8CxsOuSbKEiwA==\",\"dtype\":\"float64\",\"shape\":[2]},\"y\":[\"wild bootstrap\",\"wild bootstrap\"]},\"selected\":{\"id\":\"1618\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1617\",\"type\":\"UnionRenderers\"}},\"id\":\"1582\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data_source\":{\"id\":\"1582\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1583\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1584\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1586\",\"type\":\"CDSView\"}},\"id\":\"1585\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1613\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1560\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1559\",\"type\":\"PanTool\"},{\"id\":\"1560\",\"type\":\"WheelZoomTool\"},{\"id\":\"1561\",\"type\":\"BoxZoomTool\"},{\"id\":\"1562\",\"type\":\"SaveTool\"},{\"id\":\"1563\",\"type\":\"ResetTool\"},{\"id\":\"1564\",\"type\":\"HelpTool\"}]},\"id\":\"1565\",\"type\":\"Toolbar\"},{\"attributes\":{\"overlay\":{\"id\":\"1612\",\"type\":\"BoxAnnotation\"}},\"id\":\"1561\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1572\",\"type\":\"ColumnDataSource\"}},\"id\":\"1576\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"0P3V4hEUI8CLcCygXrEiwA==\",\"dtype\":\"float64\",\"shape\":[2]},\"y\":[\"resampled residuals\",\"resampled residuals\"]},\"selected\":{\"id\":\"1616\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1615\",\"type\":\"UnionRenderers\"}},\"id\":\"1577\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1579\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1578\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1617\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1562\",\"type\":\"SaveTool\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1583\",\"type\":\"Line\"},{\"attributes\":{\"text\":\"\",\"text_color\":{\"value\":\"black\"},\"text_font_size\":{\"value\":\"12pt\"}},\"id\":\"1607\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1556\",\"type\":\"CategoricalTicker\"},{\"attributes\":{\"callback\":null,\"factors\":[\"wild bootstrap\",\"resampled residuals\"]},\"id\":\"1544\",\"type\":\"FactorRange\"},{\"attributes\":{\"data_source\":{\"id\":\"1572\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1573\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1574\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1576\",\"type\":\"CDSView\"}},\"id\":\"1575\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1574\",\"type\":\"Circle\"},{\"attributes\":{\"formatter\":{\"id\":\"1611\",\"type\":\"CategoricalTickFormatter\"},\"ticker\":{\"id\":\"1556\",\"type\":\"CategoricalTicker\"}},\"id\":\"1555\",\"type\":\"CategoricalAxis\"},{\"attributes\":{\"source\":{\"id\":\"1577\",\"type\":\"ColumnDataSource\"}},\"id\":\"1581\",\"type\":\"CDSView\"},{\"attributes\":{\"ticker\":{\"id\":\"1551\",\"type\":\"BasicTicker\"}},\"id\":\"1554\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1559\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1546\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1584\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1551\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1563\",\"type\":\"ResetTool\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1556\",\"type\":\"CategoricalTicker\"}},\"id\":\"1558\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1582\",\"type\":\"ColumnDataSource\"}},\"id\":\"1586\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"1577\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1578\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1579\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1581\",\"type\":\"CDSView\"}},\"id\":\"1580\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1609\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"binding energy (kBT)\",\"formatter\":{\"id\":\"1609\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1551\",\"type\":\"BasicTicker\"}},\"id\":\"1550\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1618\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1615\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null},\"id\":\"1542\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1614\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1616\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1548\",\"type\":\"CategoricalScale\"}],\"root_ids\":[\"1541\"]},\"title\":\"Bokeh Application\",\"version\":\"1.4.0\"}};\n",
" var render_items = [{\"docid\":\"92ae4a04-971a-4344-a924-bf869cc10cb0\",\"roots\":{\"1541\":\"4f8c0f2b-0387-494b-9451-fd508e5329a5\"}}];\n",
" root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
"\n",
" }\n",
" if (root.Bokeh !== undefined) {\n",
" embed_document(root);\n",
" } else {\n",
" var attempts = 0;\n",
" var timer = setInterval(function(root) {\n",
" if (root.Bokeh !== undefined) {\n",
" clearInterval(timer);\n",
" embed_document(root);\n",
" } else {\n",
" attempts++;\n",
" if (attempts > 100) {\n",
" clearInterval(timer);\n",
" console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
" }\n",
" }\n",
" }, 10, root)\n",
" }\n",
"})(window);"
],
"application/vnd.bokehjs_exec.v0+json": ""
},
"metadata": {
"application/vnd.bokehjs_exec.v0+json": {
"id": "1541"
}
},
"output_type": "display_data"
}
],
"source": [
"estimate = [mle_binding, mle_binding]\n",
"confs = np.array([resampled_resids_CI[:, 0], wild_CI])\n",
"names = [\"resampled residuals\", \"wild bootstrap\"]\n",
"\n",
"bokeh.io.show(\n",
" bebi103.viz.plot_with_error_bars(\n",
" estimate, confs, names, x_axis_label=\"binding energy (kBT)\"\n",
" )\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Should we use wild bootstrap?\n",
"\n",
"If we are not explicitly modeling variability off of the theoretical curve, wild bootstrap can be an effective way to handle heteroskedasticity. Recall that when we do explicitly model the residuals in a homoskedastic manner, the MLE we get for $\\sigma$ is inconsequential with respect to the parameters of the theoretical model (we derived this in [lesson 8 on regression](http://bebi103.caltech.edu.s3-website-us-east-1.amazonaws.com/2019a/content/lessons/lesson_08/regression.html#Least-squares)). So, in a sense, we can be safe in not modeling variability if we assume homoskedasticity (though we could not do generative regression plots as model checks). So, if we are feeling lazy, or ignorant, and could continue to not model variability generatively and employ wild bootstrap to handle any possible lurking heterskedasticity.\n",
"\n",
"But, we really should *think generatively*. If we are going to model, we should model everything. A full generative model, including how we might expect the variability to change as a function of the measured and/or explanatory variables, is preferable. We will spend a lot of time next term building good generative models."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Computing environment"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPython 3.7.5\n",
"IPython 7.10.1\n",
"\n",
"numpy 1.17.4\n",
"scipy 1.3.1\n",
"pandas 0.24.2\n",
"numba 0.46.0\n",
"tqdm 4.40.0\n",
"bebi103 0.0.46\n",
"bokeh 1.4.0\n",
"holoviews 1.12.7\n",
"panel 0.7.0\n",
"jupyter 1.0.0\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -v -p numpy,scipy,pandas,numba,tqdm,bebi103,bokeh,holoviews,panel,jupyter"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}