{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bi 1x: Maximum likelihood estimation\n", "\n", "(c) 2023 Justin Bois. This work is licensed under a [Creative Commons Attribution License CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). All code contained herein is licensed under an [MIT license](https://opensource.org/licenses/MIT).\n", "\n", "*This tutorial was generated from a Jupyter notebook, which can be downloaded [here](mle.ipynb)*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial, we will use our list of bead loss times to get an estimate for the characteristic cleavage time by RAG (for the concentration of our given experiment). We begin by importing our usual modules." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const 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", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const 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", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const 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", " const cmd_clean = \"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_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const 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", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const 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", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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", " const 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", " const 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", " const events = require('base/js/events');\n", " const 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", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const 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", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " const el = document.getElementById(\"c9084265-18e8-4138-9f80-46291f95009a\");\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", " 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(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\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 (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\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", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " for (let 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", " const cell = $(document.getElementById(\"c9084265-18e8-4138-9f80-46291f95009a\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\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": "(function(root) {\n function now() {\n return new Date();\n }\n\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const 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 \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"c9084265-18e8-4138-9f80-46291f95009a\");\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 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(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (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 const cell = $(document.getElementById(\"c9084265-18e8-4138-9f80-46291f95009a\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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" } ], "source": [ "import numpy as np\n", "import scipy.optimize\n", "\n", "import iqplot\n", "\n", "import bokeh.io\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And, of course, we need to load in the data set we saved from the [Image Processing III](image_processing_3.html) tutorial. In the event that you didn't complete that tutorial, you can download the the bead loss times [here](t_lost.csv)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Data from image processing\n", "t_lost = np.loadtxt('t_lost_2016.csv')\n", "m = int(np.loadtxt('number_of_uncut_2016.csv'))\n", "t = np.loadtxt('time_points_2016.csv')\n", "n = len(t_lost)\n", "t_end = t[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The distribution of *observed* cleavage times\n", "\n", "We assume that cleavage is a **Poisson process**. A Poisson process is a sequence of events (called *arrivals*) that occur over time such that the amount of time between any two arrivals is independent of all other inter-arrival times. This means that cleavage is a stochastic event that has no memory, nor knowledge of the future.\n", "\n", "This is essentially our physical model for cleavage. We do not know the molecular details, only that the cleavage events are rare and random.\n", "\n", "The amount of time to wait for an event in a Poisson process is **exponentially distributed**. We will not derive that fact here, but just state it. That means that the probability of observing a bead being lost between time $t$ and $t + \\mathrm{d}t$, where $\\mathrm{d}t$ is a differential time difference, is $\\mathrm{d}t\\,f(t;\\beta)$, where\n", "\n", "\\begin{align}\n", "f(t ; \\beta) = \\beta\\,\\mathrm{e}^{-\\beta t}.\n", "\\end{align}\n", "\n", "The function $f(t;\\beta)$ is called a **probability density function**, or PDF, and has units of inverse time. The parameter $\\beta$, which has units of inverse time, and characterizes how rapid cleavage is. It is proportional to the chemical rate constant from mass action kinetics that you may be accustomed to. Specifically, the constant of proportionality contains the concentrations of enzyme, DNA, and volume of the system.\n", "\n", "The problem with this argument is that beads may be lost to processes other than cleavage by RAG protein. We do a control experiment without RAG to estimate the rate of bead loss in the absence of RAG, the rate constant of which we will define as $\\beta_\\mathrm{auto}$. So, now we have two Poisson processes that could arrive and a bead could be lost. I.e., the probability density function for bead loss due to non-RAG-mediated bead loss is\n", "\n", "\\begin{align}\n", "f(t ; \\beta_\\mathrm{auto}) = \\beta_\\mathrm{auto}\\,\\mathrm{e}^{-\\beta_\\mathrm{auto}t}.\n", "\\end{align}\n", "\n", "Since we are observing loss, possibly due to either process, we really want is the probability distribution of bead loss due to *either* RAG cleavage *or* other processes. This is a more general problem: how is the waiting time for the arrival of one of two different Poisson processes distributed? To derive this, we first write down the probability that a Poisson process has *not* arrived before time $t'$. That is, we want $P(t > t'; \\beta)$.\n", "\n", "\\begin{align}\n", "P(t > t'; \\beta) = \\int_{t'}^\\infty \\mathrm{d}t\\,f(t;\\beta) = \\int_{t'}^\\infty \\mathrm{d}t\\,\\beta\\mathrm{e}^{-\\beta t} = \\mathrm{e}^{-\\beta t'}.\n", "\\end{align}\n", "\n", "Now, if the two processes, which we will label with $1$ and $2$, are independent of each other, the probability that *neither* have arrived before time $t'$ is\n", "\n", "\\begin{align}\n", "P(t_1, t_2 > t'; \\beta_1, \\beta_2) &= P(t_1>t'; \\beta_1)\\,P(t_2>t'; \\beta_2)\n", "= \\mathrm{e}^{-\\beta_1 t'}\\,\\mathrm{e}^{-\\beta_2 t'} = \\mathrm{e}^{-\\left(\\beta_1 + \\beta_2\\right)t'}.\n", "\\end{align}\n", "\n", "But this is the expression for the probability that a single Poisson process with rate $\\beta = \\beta_1 + \\beta_2$ does not arrive by time $t'$. So, the distribution for the arrival time of either Poisson process in time $t$ is that of a single Poisson process with time constant $\\beta = \\beta_1 + \\beta_2$. So, we have\n", "\n", "\\begin{align}\n", "f(t ; \\beta, \\beta_\\mathrm{auto}) = \\left(\\beta + \\beta_\\mathrm{auto}\\right)\\mathrm{e}^{-\\left(\\beta_1 + \\beta_2\\right)t}.\n", "\\end{align}\n", "\n", "For convenience going forward, we will define $\\beta$ to contain both the rate of cleavage *and* that of auto-detachment, knowing that we can subtract off the rate of auto-detachment obtained from the control experiment at the end of the analysis. So, we will use\n", "\n", "\\begin{align}\n", "f(t; \\beta) = \\beta \\mathrm{e}^{-\\beta t}.\n", "\\end{align}\n", "\n", "If we observe an exponential distribution of cleavage times, we have strong evidence that cleavage is well-described by a Poisson process; it is just a stochastic memoryless process. If, however, the cleavage times are *not* exponentially distributed, we have to think hard about what might be at play in the dynamics of RAG-mediated cleavage.\n", "\n", "We have the PDF describing bead loss at time $t$, but we want the probability of our *observed* bead loss time. We need to be more precise in what we mean here. We take images at time points $t_0$, $t_1$, ..., $t_\\mathrm{end}$. We can observe a bead is missing at any of these times points except $t_0$. Let $t_i$ be the time where we observe a given bead is missing. What is the probability of this observation? It is the probability that the bead was lost *between* time $t_{i-1}$ and time $t_i$.\n", "\n", "\\begin{align}\n", "P(\\text{observed loss at } t_i ; \\beta) = \\int_{t_{i-1}}^{t_i}\\mathrm{d}t'\\,f(t';\\beta)\n", "= \\int_{t_{i-1}}^{t_i}\\mathrm{d}t'\\,\\beta \\mathrm{e}^{-\\beta t'} = \\mathrm{e}^{-\\beta t_{i-1}} - \\mathrm{e}^{-\\beta t_i} = \\mathrm{e}^{-\\beta t_i}\\left(\\mathrm{e}^{\\beta (t_i - t_{i-1})} - 1\\right).\n", "\\end{align}\n", "\n", "If we have the same time interval $\\Delta t$ between each image we take, then $t_i - t_{i-1} = \\Delta t$ for all $i$, and this expression is\n", "\n", "\\begin{align}\n", "P(\\text{observed loss at } t_i ; \\beta) = \\mathrm{e}^{-\\beta t_i}\\left(\\mathrm{e}^{\\beta \\Delta t} - 1\\right).\n", "\\end{align}\n", "\n", "Note that we may not always have the same time interval between frames because of loss of focus or other issues, we will make this assumption going forward.\n", "\n", "Since the bead loss events are all independent, we can write down the probability of observing *all* of our lost beads as the product of these probabilities. Let $t_{ij}$ be the time at which we observe bead $j$ going missing. Let $\\mathbf{t}$ be a list of the time points at which we observe each of of the $n$ beads we lost. Then,\n", "\n", "\\begin{align}\n", "P(\\mathbf{t} ; \\beta) = \\prod_{j=1}^n\\mathrm{e}^{-\\beta t_{ij}}\\left(\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1\\right) = \\left(\\mathrm{e}^{\\beta \\Delta t} - 1\\right)^n\\prod_{j=1}^n\\mathrm{e}^{-\\beta t_{ij}},\n", "\\end{align}\n", "\n", "where $\\Delta t_{ij} = t_{ij} - t_{i-1,j}$ is the time interval between the image where bead $j$ is first absent and the last image where it was present. The last equality in the above expression holds if we have constant time intervals between images. We note that\n", "\n", "\\begin{align}\n", "\\sum_{j=1}^n t_{ij} = n \\bar{t}_i,\n", "\\end{align}\n", "\n", "where $\\bar{t}_i$ is the average of the times where we observed bead loss. As a result,\n", "\n", "\\begin{align}\n", "P(\\mathbf{t} ; \\beta) = \\mathrm{e}^{-n \\beta \\bar{t}_i}\\prod_{j=1}^n\\left(\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1\\right) = \\mathrm{e}^{-n \\beta \\bar{t}_i}\\left(\\mathrm{e}^{\\beta \\Delta t} - 1\\right)^n,\n", "\\end{align}\n", "\n", "where again the last equality holds if we have constant time intervals between images." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some beads are *not* cleaved\n", "\n", "We only run our movie for time $t_\\mathrm{end}$. (In your experiment, we typically set $t_\\mathrm{end} = 3$ hours.) So there may be beads that could be cleaved if we waited a while. These are data, too! The probability that a given bead is *not* cleaved before $t_\\mathrm{end}$, which means that we *observe* it intact in the final frame of the movie, is\n", "\n", "\\begin{align}\n", "P(t > t_\\mathrm{end} ; \\beta) = \\int_{t_\\mathrm{end}}^\\infty \\mathrm{d}t'\\,f(t';\\beta)\n", "= \\int_{t_\\mathrm{end}}^\\infty \\mathrm{d}t'\\,\\beta \\mathrm{e}^{-\\beta t'} = \\mathrm{e}^{-\\beta t_\\mathrm{end}}.\n", "\\end{align}\n", "\n", "If there are $m$ such beads, then the probability of observing our $n$ cleaved beads and our $m$ uncleaved beads in the experiment is\n", "\n", "\\begin{align}\n", "P(\\mathbf{t},m;\\beta) = \\left(P(t > t_\\mathrm{end} ; \\beta)\\right)^mP(\\mathbf{t} ; \\beta) = \\mathrm{e}^{-m\\beta t_\\mathrm{end}}\\mathrm{e}^{-n \\beta \\bar{t}_i}\\prod_{j=1}^n\\left(\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1\\right) = \\mathrm{e}^{-m\\beta t_\\mathrm{end}}\\mathrm{e}^{-n \\beta \\bar{t}_i}\\left(\\mathrm{e}^{\\beta \\Delta t} - 1\\right)^n,\n", "\\end{align}\n", "\n", "where again the last equality holds if we have constant time intervals between images." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Maximum likelihood estimation\n", "\n", "To get an estimate for $\\beta$, the rate of cleavage (which, recall, is actually the rate of cleavage plus the rate of non-enzyme-mediated bead loss), we choose the value of $\\beta$ such that the expression for $P(\\mathbf{t},m;\\beta)$ is maximized. This is called a **maximum likelihood estimate**. \n", "\n", "The value of $\\beta$ that maximizes $P(\\mathbf{t},m;\\beta)$ is the same that maximized $\\ln P(\\mathbf{t},m;\\beta)$, and the logarithm is much easier to work with.\n", "\n", "\\begin{align}\n", "\\ln P(\\mathbf{t},m;\\beta) = -m\\beta t_\\mathrm{end} - n \\beta \\bar{t}_i + \\sum_{j=1}^n \\ln \\left(\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1\\right).\n", "\\end{align}\n", "\n", "This is maximal where its derivative vanishes, that is where\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}}{\\mathrm{d}\\beta}\\,\\ln P(\\mathbf{t},m;\\beta) = -m t_\\mathrm{end} - n \\bar{t}_i + \\sum_{j=1}^n \\frac{\\Delta t_{ij} \\mathrm{e}^{\\beta \\Delta t_{ij}}}{\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1} = 0.\n", "\\end{align}\n", "\n", "In the case where we have evenly spaced time points, this is\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}}{\\mathrm{d}\\beta}\\,\\ln P(\\mathbf{t},m;\\beta) = -m t_\\mathrm{end} - n \\bar{t}_i + \\frac{n\\Delta t\\mathrm{e}^{\\beta \\Delta t}}{\\mathrm{e}^{\\beta \\Delta t} - 1} = 0.\n", "\\end{align}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Approximate MLE\n", "\n", "To solve for the MLE, we need find the value of $\\beta$ for which\n", "\n", "\\begin{align}\n", "-m t_\\mathrm{end} - n \\bar{t}_i + \\sum_{j=1}^n \\frac{\\Delta t_{ij} \\mathrm{e}^{\\beta \\Delta t_{ij}}}{\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1} = 0.\n", "\\end{align}\n", "\n", "We now consider an approximate solution for the special case where we have evenly spaced time points so that $\\Delta t_{ij} = \\Delta t$ and rapid image acquisition so that $\\beta \\Delta t \\ll 1$. In this case,\n", "\n", "\\begin{align}\n", "\\mathrm{e}^{\\beta \\Delta t} \\approx 1 + \\beta \\Delta t,\n", "\\end{align}\n", "\n", "so that\n", "\n", "\\begin{align}\n", "-m t_\\mathrm{end} - n \\bar{t}_i + \\frac{n\\Delta t(1 + \\beta \\Delta t)}{1 + \\beta \\Delta t - 1} \\approx -m t_\\mathrm{end} - n \\bar{t}_i + \\frac{n}{\\beta} \\approx 0.\n", "\\end{align}\n", "\n", "Solving for $\\beta$ gives\n", "\n", "\\begin{align}\n", "\\beta = \\left(\\bar{t}_i + \\frac{m}{n}\\,t_\\mathrm{end}\\right)^{-1}.\n", "\\end{align}\n", "\n", "So, if we waited a long time such that we had essentially no beads remaining, the $\\beta \\approx 1/\\bar{t}_i$. In other words, the rate $\\beta$ is best estimated by the inverse of the average time of cleavage.\n", "\n", "We can compute the approximate MLE for $\\beta$ using the data." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.013887675779544067\n" ] } ], "source": [ "beta_mle_approx = 1 / (np.mean(t_lost) + m / n * t_end)\n", "\n", "print(beta_mle_approx)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The characteristic cutting time is $1 / \\beta_\\mathrm{MLE}$, which we now compute." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "72.0062893081761" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 / beta_mle_approx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The characteristic cut time is about 72 minutes.\n", "\n", "Note that in this approximation, we effectively assumed that even though we have discrete sampling times, we are able to measure the *exact* time of losing a bead. This is clear by forgoing integrating over the interval from time $t_{i-1}$ to $t_i$ for a bead loss observed at time $t_i$, and instead directly using the probability density function such that \n", "\n", "\\begin{align}\n", "P(\\mathbf{t},m;\\beta) = \\mathrm{e}^{-m\\beta t_\\mathrm{end}} \\prod_{i=j}^n \\beta \\mathrm{e}^{-\\beta t_j}\n", "= \\beta^n\\,\\mathrm{e}^{-m\\beta t_\\mathrm{end}}\\,\\mathrm{e}^{-n\\beta \\bar{t}}.\n", "\\end{align}\n", "\n", "The logarithm of this is\n", "\n", "\\begin{align}\n", "\\ln P(\\mathbf{t},m;\\beta) = -m\\beta t_\\mathrm{end} - n\\beta \\bar{t} + n\\ln \\beta.\n", "\\end{align}\n", "\n", "Differentiating with respect to $\\beta$ and setting to zero gives\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}}{\\mathrm{d}\\beta} = -mt_\\mathrm{end} - n\\bar{t} + \\frac{n}{\\beta} = 0.\n", "\\end{align}\n", "\n", "Solving for $\\beta$ gives\n", "\n", "\\begin{align}\n", "\\beta = \\left(\\bar{t}_i + \\frac{m}{n}\\,t_\\mathrm{end}\\right)^{-1},\n", "\\end{align}\n", "\n", "the same result as formally making the approximation above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing the MLE\n", "\n", "We now demonstrate how to compute the MLE exactly. Our task is to write a function that computes the function of $\\beta$ we are trying to find the root of, namely\n", "\n", "\\begin{align}\n", "g(\\beta) = -m t_\\mathrm{end} - n \\bar{t}_i + \\sum_{j=1}^n \\frac{\\Delta t_{ij} \\mathrm{e}^{\\beta \\Delta t_{ij}}}{\\mathrm{e}^{\\beta \\Delta t_{ij}} - 1}.\n", "\\end{align}\n", "\n", "We first compute some convenient quantities from the data." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Array of Δt's\n", "delta_t = np.concatenate(((0,), np.diff(t)))\n", "\n", "# Index of time points where cut\n", "i = np.array([np.where(t == tl)[0][0] for tl in t_lost])\n", "\n", "# The Δtij's\n", "delta_t_ij = delta_t[i]\n", "\n", "# Mean observation time\n", "t_mean = np.mean(t_lost)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can define the function $g(\\beta)$." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def root_fun(beta):\n", " exp_val = np.exp(beta * delta_t_ij)\n", " ret_val = -m * t_end - n * t_mean\n", " ret_val += np.sum(delta_t_ij * exp_val / (exp_val - 1))\n", " \n", " return ret_val" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are left to find the MLE using SciPy's nifty solver `scipy.optimize.fsolve()`. We need to pass in the function whose root we are trying to find and also our initial guess at a root. We already have an approximate value for $\\beta_\\mathrm{MLE}$, so we will use that." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.013937036406431463\n" ] } ], "source": [ "beta_mle = scipy.optimize.fsolve(root_fun, beta_mle_approx)[0]\n", "\n", "print(beta_mle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's exactly the same as our approximate MLE, varying at the fourth decimal point. So, we are not too far off by using the approximate value for the MLE." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Checking our model\n", "\n", "Now to check the model, we will plot the ECDF of the measured data along with the CDF of the theoretical Exponential distribution." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"3e0c7661-83ac-440d-93ff-8f080b8a16ee\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1012\",\"attributes\":{\"start\":-0.025,\"end\":1.025}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1014\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1016\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1009\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1056\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1047\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1048\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1049\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[604],\"dtype\":\"int32\",\"order\":\"little\"}],[\"time of bead loss (min)\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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AAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8=\"},\"shape\":[604],\"dtype\":\"float64\",\"order\":\"little\"}],[\"__dummy_cat\",{\"type\":\"ndarray\",\"array\":[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"],\"shape\":[604],\"dtype\":\"object\",\"order\":\"little\"}],[\"__ECDF\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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AAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8=\"},\"shape\":[604],\"dtype\":\"float64\",\"order\":\"little\"}],[\"__label\",{\"type\":\"ndarray\",\"array\":[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"],\"shape\":[604],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1057\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1058\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1053\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"time of bead loss (min)\"},\"y\":{\"type\":\"field\",\"field\":\"__ECDF\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1054\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"time of bead loss (min)\"},\"y\":{\"type\":\"field\",\"field\":\"__ECDF\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1055\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"time of bead loss (min)\"},\"y\":{\"type\":\"field\",\"field\":\"__ECDF\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1065\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1059\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1060\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1061\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1066\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1067\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1062\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1063\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1064\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1007\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1032\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1034\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1035\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1036\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1037\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1038\"}]}},\"toolbar_location\":\"above\",\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1025\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1027\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1028\"},\"axis_label\":\"ECDF\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1026\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1020\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1021\"},\"axis_label\":\"time of bead loss (min)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1019\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1024\",\"attributes\":{\"axis\":{\"id\":\"p1018\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1031\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1025\"}}}],\"frame_width\":375,\"frame_height\":275}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"3e0c7661-83ac-440d-93ff-8f080b8a16ee\",\"roots\":{\"p1001\":\"d5d0ecce-6afb-4ea2-b449-4aab2d9e56fd\"},\"root_ids\":[\"p1001\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const 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": "p1001" } }, "output_type": "display_data" } ], "source": [ "p = iqplot.ecdf(\n", " np.concatenate((t_lost, np.nan * np.ones(m))),\n", " q=\"time of bead loss (min)\",\n", " y_range=[-0.025, 1.025],\n", ")\n", "\n", "# Theoretical curve\n", "t_theor = np.linspace(0, 70, 200)\n", "cdf = 1 - np.exp(-beta_mle * t_theor)\n", "p.line(t_theor, cdf, line_width=2, line_color='orange')\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the agreement is quite poor. This could be due to a few reasons. The chemical process of cutting beads may not actually be well described by a Poisson process. This is very interesting! It would mean that there may be some more complex chemical dynamics at play, which we might want to explore with some more sophisticated experimentation. \n", "\n", "Another possibility is that we made mistakes in determining how many beads were uncleaved. We filtered out stuck beads in our image processing protocol, but it is possible that there are beads with multiple DNA tethers, or those that may be stuck but moving on the surface.\n", "\n", "If we lack confidence in our ability to detect tethered, but uncut beads, we could try another model, still assuming cutting is a Poisson process, but *only* taking into account cleaved beads." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## An alternative model\n", "\n", "The probability density function of bead loss times *that we can observe* is\n", "\n", "\\begin{align}\n", "f(t ; \\beta, t_\\mathrm{end}) \\propto \\left\\{\\begin{array}{cll}\n", "\\displaystyle{\\beta\\,\\mathrm{e}^{-\\beta t}} && 0 \\le t \\le t_\\mathrm{end} \\\\[1em]\n", "0 && t > t_\\mathrm{end}.\n", "\\end{array}\\right.\n", "\\end{align}\n", "\n", "We need to normalize this distribution. Let $\\alpha$ be the constant or proportionality. Then,\n", "\n", "\\begin{align}\n", "\\int_0^\\infty \\mathrm{d}t\\, f(t; \\beta, t_\\mathrm{end}) =\n", "\\alpha\\int_0^{t_\\mathrm{end}} \\mathrm{d}t\\,\\beta \\mathrm{e}^{-\\beta t}\n", "= \\alpha\\left(1 - \\mathrm{e}^{-\\beta t_\\mathrm{end}}\\right) = 1.\n", "\\end{align}\n", "\n", "This gives $\\alpha = \\left(1 - \\mathrm{e}^{-\\beta t_\\mathrm{end}}\\right)^{-1}$, and our probability distribution of cleavage times is\n", "\n", "\\begin{align}\n", "&f(t; \\beta, t_\\mathrm{end}) = \\left\\{\\begin{array}{cll}\n", "\\displaystyle{\\frac{\\beta \\mathrm{e}^{-\\beta t}}{(1-\\mathrm{e}^{-\\beta t_\\mathrm{end}})}} && 0 \\le t \\le t_\\mathrm{end} \\\\[1em]\n", "0 && t > t_\\mathrm{end}.\n", "\\end{array}\\right.\n", "\\end{align}\n", "\n", "So, for our *set* of $n$ observations, $\\mathbf{t} \\equiv \\{t_1, t_2, \\ldots t_n\\}$, we have a probability density function of\n", "\n", "\\begin{align}\n", "f(\\mathbf{t}; \\beta, t_\\mathrm{end}) = \\prod_{j=1}^n f(t_j ; \\beta, t_\\mathrm{end}).\n", "\\end{align}\n", "\n", "Writing this out, we have\n", "\n", "\\begin{align}\n", "f(\\mathbf{t} ; \\beta, t_\\mathrm{end}) =\n", "\\beta^n\\frac{\\mathrm{e}^{-n\\beta \\bar{t}}}{(1-\\mathrm{e}^{-\\beta t_\\mathrm{end}})^n},\n", "\\end{align}\n", "\n", "since all observed bead loss times are less than $t_\\mathrm{end}$. We will directly use this function to find the MLE for $\\beta$, as we showed in the previous model that the error in not explicitly taking into account the time interval of observation is small." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### MLE for the alternative model\n", "\n", "We wish to find the value of the parameter $\\beta$ that leads to maximal $f(\\mathbf{t};\\beta, t_\\mathrm{end})$. We proceed as before by computing $\\ln f(\\mathbf{t};\\beta, t_\\mathrm{end})$, differentiating, and setting to zero.\n", "\n", "\\begin{align}\n", "\\ln f(\\mathbf{t};\\beta, t_\\mathrm{end}) = n\\ln \\beta - n\\beta \\bar{t} - n \\ln\\left(1 - \\mathrm{e}^{-\\beta t_\\mathrm{end}}\\right).\n", "\\end{align}\n", "\n", "Differentiating with respect to $\\beta$ gives\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}}{\\mathrm{d}\\beta}\\,\\ln f(\\mathbf{t};\\beta, t_\\mathrm{end}) = \\frac{n}{\\beta} - n\\bar{t} - \\frac{nt_\\mathrm{end}\\mathrm{e}^{-\\beta t_\\mathrm{end}}}{1 - \\mathrm{e}^{-\\beta t_\\mathrm{end}}} .\n", "\\end{align}\n", "\n", "So, we are left to find the value of $\\beta$ for which\n", "\n", "\\begin{align}\n", "g(\\beta) = \\frac{1}{\\beta} - \\bar{t} - \\frac{t_\\mathrm{end}\\mathrm{e}^{-\\beta t_\\mathrm{end}}}{1 - \\mathrm{e}^{-\\beta t_\\mathrm{end}}} = 0.\n", "\\end{align}\n", "\n", "We can again use `scipy.optimize.fsolve()` to find the value of the MLE. We will use $1/\\bar{t}$ as our initial guess." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.041951259352945\n" ] } ], "source": [ "def alt_root_fun(beta):\n", " exp_val = np.exp(-beta * t_end)\n", "\n", " return 1 / beta - t_mean - t_end * exp_val / (1 - exp_val)\n", "\n", "\n", "# Find the MLE!\n", "alt_beta_mle = scipy.optimize.fsolve(alt_root_fun, 1 / t_mean)[0]\n", "\n", "# Report result\n", "print(alt_beta_mle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get the time scale." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "23.837186664333107\n" ] } ], "source": [ "print(1 / alt_beta_mle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is much shorter, about 24 minutes. This might be expected, as we could have over-assigned beads that we did not lose." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting the CDF\n", "\n", "Now that we have a maximum likelihood estimate for $\\beta$, we can compute the theoretical CDF and see how it looks compared to our measured ECDF. The theoretical CDF is\n", "\n", "\\begin{align}\n", "\\text{CDF} = \\int_0^t\\mathrm{d}t'\\,f(t'; \\beta, t_\\mathrm{end}) =\n", "\\frac{1-\\mathrm{e}^{-\\beta t}}{1 - \\mathrm{e}^{-\\beta t_\\mathrm{end}}}.\n", "\\end{align}\n", "\n", "We can code this up and plot it along with our empirical CDF." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"3b67c0e6-be2d-4947-a899-26239e1c82f4\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1190\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1191\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1192\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1203\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1205\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1198\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1245\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1236\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1237\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1238\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAACYAAAAmQAAAJoAAACbAAAAnAAAAJ0AAACeAAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYAAACnAAAAqAAAAKkAAACqAAAAqwAAAKwAAACtAAAArgAAAK8AAACwAAAAsQAAALIAAACzAAAAtAAAALUAAAC2AAAAtwAAALgAAAC5AAAAugAAALsAAAC8AAAAvQAAAL4AAAC/AAAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAxgAAAMcAAADIAAAAyQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADXAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAN8AAADgAAAA4QAAAOIAAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPcAAAD4AAAA+QAAAPoAAAD7AAAA/AAAAP0AAAD+AAAA/wAAAAABAAABAQAAAgEAAAMBAAAEAQAABQEAAAYBAAAHAQAACAEAAAkBAAAKAQAACwEAAAwBAAANAQAADgEAAA8BAAAQAQAAEQEAABIBAAATAQAAFAEAABUBAAAWAQAAFwEAABgBAAAZAQAAGgEAABsBAAAcAQAAHQEAAB4BAAAfAQAAIAEAACEBAAAiAQAAIwEAACQBAAAlAQAAJgEAACcBAAAoAQAAKQEAACoBAAArAQAALAEAAC0BAAAuAQAALwEAADABAAAxAQAAMgEAADMBAAA0AQAANQEAADYBAAA3AQAAOAEAADkBAAA6AQAAOwEAADwBAAA9AQAA\"},\"shape\":[318],\"dtype\":\"int32\",\"order\":\"little\"}],[\"time of bead loss (min)\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAABARUAAAAAAAAASQAAAAAAAABJAAAAAAAAAI0AAAAAAAAAcQAAAAAAAACpAAAAAAAAAMUAAAAAAAADwPwAAAAAAAChAAAAAAAAAGkAAAAAAAIBEQAAAAAAAACtAAAAAAAAAFEAAAAAAAIA8QAAAAAAAABhAAAAAAACAQkAAAAAAAIAwQAAAAAAAgD5AAAAAAACARUAAAAAAAABDQAAAAAAAABJAAAAAAAAA8D8AAAAAAAAzQAAAAAAAADJAAAAAAACAN0AAAAAAAAAwQAAAAAAAADVAAAAAAAAANUAAAAAAAEBMQAAAAAAAgDhAAAAAAACANkAAAAAAAAASQAAAAAAAADFAAAAAAACANkAAAAAAAEBAQAAAAAAAABRAAAAAAAAAJEAAAAAAAAAhQAAAAAAAQEpAAAAAAAAACEAAAAAAAIBFQAAAAAAAABxAAAAAAAAAEkAAAAAAAIAzQAAAAAAAADxAAAAAAACANUAAAAAAAAAzQAAAAAAAADJAAAAAAABASUAAAAAAAAAoQAAAAAAAAAhAAAAAAAAAJUAAAAAAAAA7QAAAAAAAABpAAAAAAABAQkAAAAAAAAApQAAAAAAAAPg/AAAAAAAAEEAAAAAAAAAlQAAAAAAAABJAAAAAAAAALUAAAAAAAAASQAAAAAAAACRAAAAAAAAAFEAAAAAAAIAxQAAAAAAAQEdAAAAAAAAAIEAAAAAAAAAhQAAAAAAAAAhAAAAAAAAAIEAAAAAAAABIQAAAAAAAwEhAAAAAAACAMkAAAAAAAAAqQAAAAAAAABRAAAAAAAAAGkAAAAAAAABIQAAAAAAAAClAAAAAAAAAPkAAAAAAAAAAQAAAAAAAABpAAAAAAAAAJ0AAAAAAAAAWQAAAAAAAgDtAAAAAAAAAL0AAAAAAAAAYQAAAAAAAABJAAAAAAAAAJUAAAAAAAIA6QAAAAAAAAChAAAAAAACAMUAAAAAAAABAQAAAAAAAgDRAAAAAAAAAEkAAAAAAAAAzQAAAAAAAABRAAAAAAAAAEkAAAAAAAAASQAAAAAAAADRAAAAAAABAQEAAAAAAAMBAQAAAAAAAABZAAAAAAAAAJUAAAAAAAAAyQAAAAAAAABJAAAAAAAAAI0AAAAAAAAAQQAAAAAAAACJAAAAAAAAAEEAAAAAAAIBLQAAAAAAAACVAAAAAAAAAJUAAAAAAAMBJQAAAAAAAADRAAAAAAAAAO0AAAAAAAAAtQAAAAAAAAAhAAAAAAAAAGkAAAAAAAAArQAAAAAAAACVAAAAAAACANUAAAAAAAAAMQAAAAAAAAPA/AAAAAACAO0AAAAAAAAAsQAAAAAAAgDBAAAAAAAAAP0AAAAAAAAA4QAAAAAAAACxAAAAAAAAAEkAAAAAAAMBLQAAAAAAAACVAAAAAAAAAJ0AAAAAAAAAyQAAAAAAAQEdAAAAAAACAPkAAAAAAAEBCQAAAAAAAACdAAAAAAAAAKEAAAAAAAADwPwAAAAAAACpAAAAAAAAAS0AAAAAAAEBHQAAAAAAAADhAAAAAAAAACEAAAAAAAIAzQAAAAAAAAAhAAAAAAAAAEkAAAAAAAAAhQAAAAAAAAB5AAAAAAAAAS0AAAAAAAAAgQAAAAAAAgDZAAAAAAACAOUAAAAAAAABAQAAAAAAAABRAAAAAAAAAQEAAAAAAAMBCQAAAAAAAABBAAAAAAAAACEAAAAAAAAAgQAAAAAAAgDRAAAAAAAAAIUAAAAAAAAA8QAAAAAAAAAxAAAAAAAAAI0AAAAAAAAAwQAAAAAAAACVAAAAAAAAANEAAAAAAAAASQAAAAAAAAChAAAAAAAAAHkAAAAAAAADwPwAAAAAAAB5AAAAAAAAAHEAAAAAAAAAkQAAAAAAAADBAAAAAAAAATEAAAAAAAIA1QAAAAAAAABJAAAAAAAAANUAAAAAAAAAyQAAAAAAAABhAAAAAAAAAIUAAAAAAAAAgQAAAAAAAwENAAAAAAADAQUAAAAAAAAAQQAAAAAAAAARAAAAAAACAMkAAAAAAAMBBQAAAAAAAAClAAAAAAAAAQ0AAAAAAAAAnQAAAAAAAACFAAAAAAABASkAAAAAAAABGQAAAAAAAABxAAAAAAAAAHkAAAAAAAMBCQAAAAAAAADFAAAAAAAAARkAAAAAAAMBDQAAAAAAAgDpAAAAAAAAAOUAAAAAAAAAxQAAAAAAAgDdAAAAAAAAAMEAAAAAAAAAAQAAAAAAAAEdAAAAAAAAAJEAAAAAAAMBBQAAAAAAAAC1AAAAAAAAAEkAAAAAAAIA5QAAAAAAAABhAAAAAAAAALEAAAAAAAAAgQAAAAAAAAARAAAAAAACARkAAAAAAAAAxQAAAAAAAgDVAAAAAAAAAFEAAAAAAAAAsQAAAAAAAABxAAAAAAAAAMkAAAAAAAAASQAAAAAAAACtAAAAAAAAAI0AAAAAAAIAwQAAAAAAAwERAAAAAAAAAREAAAAAAAAAgQAAAAAAAACVAAAAAAAAA+D8AAAAAAAAIQAAAAAAAgERAAAAAAAAAJ0AAAAAAAAA2QAAAAAAAgDFAAAAAAACAOEAAAAAAAAAUQAAAAAAAADpAAAAAAAAAL0AAAAAAAAAzQAAAAAAAQEZAAAAAAADASEAAAAAAAEBMQAAAAAAAgDRAAAAAAAAAIkAAAAAAAIBAQAAAAAAAABJAAAAAAAAAMEAAAAAAAIA0QAAAAAAAAC1AAAAAAAAAGEAAAAAAAEBFQAAAAAAAwEFAAAAAAAAAQEAAAAAAAAAjQAAAAAAAwEFAAAAAAAAAL0AAAAAAAMBBQAAAAAAAACtAAAAAAAAALkAAAAAAAAA7QAAAAAAAAB5AAAAAAAAAHkAAAAAAAAAqQAAAAAAAADJAAAAAAAAAK0AAAAAAAAAMQAAAAAAAwERAAAAAAAAAFEAAAAAAAIAwQAAAAAAAgEZAAAAAAAAAKEAAAAAAAAAnQAAAAAAAADdAAAAAAAAAJUAAAAAAAAASQAAAAAAAADFAAAAAAAAAKkAAAAAAAAAwQAAAAAAAAC9AAAAAAABASUAAAAAAAMBCQAAAAAAAgEJAAAAAAACAQEAAAAAAAAA9QAAAAAAAACJAAAAAAAAAKkAAAAAAAAAsQAAAAAAAADdAAAAAAAAAMkAAAAAAAAASQAAAAAAAAC1AAAAAAAAAFkAAAAAAAAAiQAAAAAAAABRAAAAAAAAAHEAAAAAAAABBQAAAAAAAgEZAAAAAAAAASUAAAAAAAABBQAAAAAAAAAxAAAAAAAAAMEAAAAAAAAAWQAAAAAAAgDdAAAAAAAAADEAAAAAAAAA7QAAAAAAAADpAAAAAAAAAJ0AAAAAAAAArQAAAAAAAACRAAAAAAAAAEEAAAAAAAIBFQAAAAAAAABhA\"},\"shape\":[318],\"dtype\":\"float64\",\"order\":\"little\"}],[\"__dummy_cat\",{\"type\":\"ndarray\",\"array\":[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"],\"shape\":[318],\"dtype\":\"object\",\"order\":\"little\"}],[\"__ECDF\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[318],\"dtype\":\"float64\",\"order\":\"little\"}],[\"__label\",{\"type\":\"ndarray\",\"array\":[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"],\"shape\":[318],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1246\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1247\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1242\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"time of bead loss (min)\"},\"y\":{\"type\":\"field\",\"field\":\"__ECDF\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1243\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"time of bead loss (min)\"},\"y\":{\"type\":\"field\",\"field\":\"__ECDF\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1244\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"time of bead loss (min)\"},\"y\":{\"type\":\"field\",\"field\":\"__ECDF\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b3\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1254\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1248\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1249\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1250\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAAAABnMZ3FdBbDP2cxncV0FtM/GsprKK+h3D9nMZ3FdBbjP8F9BPcR3Oc/GsprKK+h7D86i+ksprPwP2cxncV0FvM/lNdQXkN59T/BfQT3Edz3P+4juI/gPvo/GsprKK+h/D9HcB/BfQT/PzqL6SymswBAUV5DeQ3lAUBnMZ3FdBYDQH0E9xHcRwRAlNdQXkN5BUCqqqqqqqoGQMF9BPcR3AdA11BeQ3kNCUDuI7iP4D4KQAT3EdxHcAtAGsprKK+hDEAxncV0FtMNQEdwH8F9BA9Ar6G8hvIaEEA6i+ksprMQQMV0FtNZTBFAUV5DeQ3lEUDcR3AfwX0SQGcxncV0FhNA8hrKayivE0B9BPcR3EcUQAnuI7iP4BRAlNdQXkN5FUAfwX0E9xEWQKqqqqqqqhZANpTXUF5DF0DBfQT3EdwXQExnMZ3FdBhA11BeQ3kNGUBiOovpLKYZQO4juI/gPhpAeQ3lNZTXGkAE9xHcR3AbQI/gPoL7CBxAGsprKK+hHECms5jOYjodQDGdxXQW0x1AvIbyGsprHkBHcB/BfQQfQNNZTGcxnR9Ar6G8hvIaIEB1FtNZTGcgQDqL6SymsyBAAAAAAAAAIUDFdBbTWUwhQIvpLKazmCFAUV5DeQ3lIUAW01lMZzEiQNxHcB/BfSJAobyG8hrKIkBnMZ3FdBYjQC2ms5jOYiNA8hrKayivI0C4j+A+gvsjQH0E9xHcRyRAQ3kN5TWUJEAJ7iO4j+AkQM5iOovpLCVAlNdQXkN5JUBZTGcxncUlQB/BfQT3ESZA5TWU11BeJkCqqqqqqqomQHAfwX0E9yZANpTXUF5DJ0D7CO4juI8nQMF9BPcR3CdAhvIaymsoKEBMZzGdxXQoQBLcR3AfwShA11BeQ3kNKUCdxXQW01kpQGI6i+kspilAKK+hvIbyKUDuI7iP4D4qQLOYzmI6iypAeQ3lNZTXKkA+gvsI7iMrQAT3EdxHcCtAymsor6G8K0CP4D6C+wgsQFVVVVVVVSxAGsprKK+hLEDgPoL7CO4sQKazmM5iOi1AayivobyGLUAxncV0FtMtQPcR3EdwHy5AvIbyGsprLkCC+wjuI7guQEdwH8F9BC9ADeU1lNdQL0DTWUxnMZ0vQJjOYjqL6S9Ar6G8hvIaMEAS3EdwH0EwQHUW01lMZzBA11BeQ3mNMEA6i+ksprMwQJ3FdBbT2TBAAAAAAAAAMUBjOovpLCYxQMV0FtNZTDFAKK+hvIZyMUCL6Syms5gxQO4juI/gvjFAUV5DeQ3lMUCzmM5iOgsyQBbTWUxnMTJAeQ3lNZRXMkDcR3AfwX0yQD+C+wjuozJAobyG8hrKMkAE9xHcR/AyQGcxncV0FjNAymsor6E8M0AtprOYzmIzQI/gPoL7iDNA8hrKayivM0BVVVVVVdUzQLiP4D6C+zNAG8prKK8hNEB9BPcR3Ec0QOA+gvsIbjRAQ3kN5TWUNECms5jOYro0QAnuI7iP4DRAayivobwGNUDOYjqL6Sw1QDGdxXQWUzVAlNdQXkN5NUD3EdxHcJ81QFlMZzGdxTVAvIbyGsrrNUAfwX0E9xE2QIL7CO4jODZA5TWU11BeNkBIcB/BfYQ2QKqqqqqqqjZADeU1lNfQNkBwH8F9BPc2QNNZTGcxHTdANpTXUF5DN0CYzmI6i2k3QPsI7iO4jzdAXkN5DeW1N0DBfQT3Edw3QCS4j+A+AjhAhvIaymsoOEDpLKazmE44QExnMZ3FdDhAr6G8hvKaOEAS3EdwH8E4QHQW01lM5zhA11BeQ3kNOUA6i+kspjM5QJ3FdBbTWTlAAAAAAACAOUBiOovpLKY5QMV0FtNZzDlAKK+hvIbyOUCL6Symsxg6QO4juI/gPjpAUF5DeQ1lOkCzmM5iOos6QBbTWUxnsTpAeQ3lNZTXOkDcR3Afwf06QD6C+wjuIztAobyG8hpKO0AE9xHcR3A7QGcxncV0ljtAymsor6G8O0AsprOYzuI7QI/gPoL7CDxA8hrKaygvPEBVVVVVVVU8QLiP4D6CezxAGsprKK+hPEB9BPcR3Mc8QOA+gvsI7jxAQ3kN5TUUPUCms5jOYjo9QAnuI7iPYD1AayivobyGPUDOYjqL6aw9QDGdxXQW0z1AlNdQXkP5PUD3EdxHcB8+QFlMZzGdRT5AvIbyGsprPkAfwX0E95E+QIL7CO4juD5A5TWU11DePkBHcB/BfQQ/QKqqqqqqKj9ADeU1lNdQP0BwH8F9BHc/QNNZTGcxnT9ANZTXUF7DP0CYzmI6i+k/QH4E9xHcB0BAr6G8hvIaQEDgPoL7CC5AQBLcR3AfQUBAQ3kN5TVUQEB1FtNZTGdAQKazmM5iekBA11BeQ3mNQEAJ7iO4j6BAQDqL6Syms0BAbCivobzGQECdxXQW09lAQM5iOovp7EBAAAAAAAAAQUAxncV0FhNBQGM6i+ksJkFAlNdQXkM5QUDFdBbTWUxBQPcR3EdwX0FAKK+hvIZyQUBaTGcxnYVBQIvpLKazmEFAvIbyGsqrQUDuI7iP4L5BQB/BfQT30UFAUV5DeQ3lQUCC+wjuI/hBQLOYzmI6C0JA5TWU11AeQkAW01lMZzFCQEhwH8F9REJAeQ3lNZRXQkCqqqqqqmpCQNxHcB/BfUJADeU1lNeQQkA/gvsI7qNCQHAfwX0Et0JAobyG8hrKQkDTWUxnMd1CQAT3EdxH8EJANpTXUF4DQ0BnMZ3FdBZDQJjOYjqLKUNAymsor6E8Q0D7CO4juE9DQC2ms5jOYkNAXkN5DeV1Q0CP4D6C+4hDQMF9BPcRnENA8hrKayivQ0AkuI/gPsJDQFVVVVVV1UNAhvIaymvoQ0C4j+A+gvtDQOksprOYDkRAG8prKK8hREBMZzGdxTREQH0E9xHcR0RAr6G8hvJaREDgPoL7CG5EQBLcR3AfgURAQ3kN5TWUREB0FtNZTKdEQKazmM5iukRA11BeQ3nNREAJ7iO4j+BEQDqL6Sym80RAayivobwGRUCdxXQW0xlFQM5iOovpLEVAAAAAAABARUAxncV0FlNFQGI6i+ksZkVAlNdQXkN5RUDFdBbTWYxFQPcR3Edwn0VAKK+hvIayRUBZTGcxncVFQIvpLKaz2EVAvIbyGsrrRUDuI7iP4P5FQB/BfQT3EUZAUF5DeQ0lRkCC+wjuIzhGQLOYzmI6S0ZA5TWU11BeRkAW01lMZ3FGQEhwH8F9hEZAeQ3lNZSXRkCqqqqqqqpGQNxHcB/BvUZADeU1lNfQRkA/gvsI7uNGQHAfwX0E90ZAobyG8hoKR0DTWUxnMR1HQAT3EdxHMEdANpTXUF5DR0BnMZ3FdFZHQJjOYjqLaUdAymsor6F8R0D7CO4juI9HQC2ms5jOokdAXkN5DeW1R0CP4D6C+8hHQMF9BPcR3EdA8hrKayjvR0AkuI/gPgJIQFVVVVVVFUhAhvIaymsoSEC4j+A+gjtIQOksprOYTkhAG8prKK9hSEBMZzGdxXRIQH0E9xHch0hAr6G8hvKaSEDgPoL7CK5IQBLcR3AfwUhAQ3kN5TXUSEB0FtNZTOdIQKazmM5i+khA11BeQ3kNSUAJ7iO4jyBJQDqL6SymM0lAayivobxGSUCdxXQW01lJQM5iOovpbElAAAAAAACASUAxncV0FpNJQGI6i+kspklAlNdQXkO5SUDFdBbTWcxJQPcR3Edw30lAKK+hvIbySUBZTGcxnQVKQIvpLKazGEpAvIbyGsorSkDuI7iP4D5KQB/BfQT3UUpAUF5DeQ1lSkCC+wjuI3hKQLOYzmI6i0pA5TWU11CeSkAW01lMZ7FKQEdwH8F9xEpAeQ3lNZTXSkCqqqqqqupKQNxHcB/B/UpADeU1lNcQS0A+gvsI7iNLQHAfwX0EN0tAobyG8hpKS0DTWUxnMV1LQAT3EdxHcEtANZTXUF6DS0BnMZ3FdJZLQJjOYjqLqUtAymsor6G8S0D7CO4juM9LQCyms5jO4ktAXkN5DeX1S0CP4D6C+whMQMF9BPcRHExA8hrKaygvTEAjuI/gPkJMQFVVVVVVVUxAhvIaymtoTEC4j+A+gntMQOksprOYjkxAGsprKK+hTEBMZzGdxbRMQH0E9xHcx0xAr6G8hvLaTEDgPoL7CO5MQBLcR3AfAU1AQ3kN5TUUTUB0FtNZTCdNQKazmM5iOk1A11BeQ3lNTUAJ7iO4j2BNQDqL6Symc01AayivobyGTUCdxXQW05lNQM5iOovprE1AAAAAAADATUA=\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1255\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1256\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1251\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1252\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1253\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1196\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1221\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1222\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1223\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1224\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1225\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1226\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1227\"}]}},\"toolbar_location\":\"above\",\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1214\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1216\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1217\"},\"axis_label\":\"ECDF\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1215\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1207\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1209\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1210\"},\"axis_label\":\"time of bead loss (min)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1208\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1213\",\"attributes\":{\"axis\":{\"id\":\"p1207\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1220\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1214\"}}}],\"frame_width\":375,\"frame_height\":275}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"3b67c0e6-be2d-4947-a899-26239e1c82f4\",\"roots\":{\"p1190\":\"c431fa48-3522-4dfc-a528-4802f4446216\"},\"root_ids\":[\"p1190\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const 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": "p1190" } }, "output_type": "display_data" } ], "source": [ "p = iqplot.ecdf(t_lost, q=\"time of bead loss (min)\")\n", "\n", "# Compute theoretical CDF\n", "t_theor = np.linspace(0, t_end, 400)\n", "cdf = (1 - np.exp(-alt_beta_mle * t_theor)) / (1 - np.exp(-alt_beta_mle * t_end))\n", "p.line(t_theor, cdf, line_width=2, line_color='orange')\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This looks much better, suggesting that perhaps we did misidentify beads we did not lose. It's a pity, since that limits the data we can use. This motivates us to collect images as long as possible." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.11" } }, "nbformat": 4, "nbformat_minor": 4 }