{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lesson 25: Hacker stats II\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(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", "\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(\"1002\");\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(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", " \n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.2.min.js\"];\n", " const css_urls = [];\n", " \n", "\n", " const 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 (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(\"1002\")).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 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\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(\"1002\");\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(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 \n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.2.min.js\"];\n const css_urls = [];\n \n\n const 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 (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(\"1002\")).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" } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "import iqplot\n", "\n", "import bokeh.io\n", "import bokeh.plotting\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "We have learned that we can compute confidence intervals of quantities calculated from data using bootstrapping. In the last lesson, the examples included bootstrap confidence intervals of an aggregating summary statistic (such as a mean, median, standard deviation, etc.) derived from a single set of measurements.\n", "\n", "In this lesson, we explore how you may compute confidence intervals for more complex summaries of data sets. We will again use the data set from Peter and Rosemary Grant, which we load in now, again only using *G scandens* in 1975 and 2012. We will also use beak length in addition to beak depth in this lesson." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bandbeak depth (mm)beak length (mm)speciesyear
4013028.413.9scandens1975
4023048.814.0scandens1975
4033068.412.9scandens1975
4043108.013.5scandens1975
4053177.912.9scandens1975
\n", "
" ], "text/plain": [ " band beak depth (mm) beak length (mm) species year\n", "401 302 8.4 13.9 scandens 1975\n", "402 304 8.8 14.0 scandens 1975\n", "403 306 8.4 12.9 scandens 1975\n", "404 310 8.0 13.5 scandens 1975\n", "405 317 7.9 12.9 scandens 1975" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(\"data/grant_complete.csv\", comment=\"#\")\n", "df = df.loc[(df[\"species\"] == \"scandens\") & (df[\"year\"].isin([1975, 2012])), :]\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, before we begin out analysis, we will instantiate a random number generator." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "rg = np.random.default_rng()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The difference of means\n", "\n", "In the last lesson, we plotted the mean beak depth with confidence intervals for *G. scandens* birds measured in 1975 and 2012. We then compared the respective values. But what if we were interested in the *difference* of the means? We can easily compute that difference." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.2284920634920642" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Extract relevant beak depths as Numpy arrays\n", "bd_1975 = df.loc[df['year']==1975, 'beak depth (mm)'].values\n", "bd_2012 = df.loc[df['year']==2012, 'beak depth (mm)'].values\n", "\n", "# Report difference of means\n", "np.mean(bd_2012) - np.mean(bd_1975)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, the beaks got deeper by about 225 microns. But how do we get a confidence interval on this value? We repeat the same bootstrapping procedure as before.\n", "\n", "1. Obtain a bootstrap replicate for the mean of the 2012 beak depths.\n", "2. Obtain a bootstrap replicate for the mean of the 1975 beak depths.\n", "3. Subtract the two to get a replicate for the difference of mean beak depths.\n", "\n", "Let's implement this. We can use the `draw_bs_rep()` function we wrote in the previous lesson." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.06543993, 0.38827518])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def draw_bs_rep(data, func, rg):\n", " \"\"\"Compute a bootstrap replicate from data.\"\"\"\n", " bs_sample = rg.choice(data, size=len(data))\n", " return func(bs_sample)\n", "\n", "\n", "# Replicates of each year\n", "n_reps = 2000\n", "bs_reps_1975 = np.array(\n", " [draw_bs_rep(bd_1975, np.mean, rg) for _ in range(n_reps)]\n", ")\n", "bs_reps_2012 = np.array(\n", " [draw_bs_rep(bd_2012, np.mean, rg) for _ in range(n_reps)]\n", ")\n", "\n", "# Get replicates of the difference\n", "bd_reps_diff = bs_reps_2012 - bs_reps_1975\n", "\n", "# Report the confidence interval\n", "np.percentile(bd_reps_diff, [2.5, 97.5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pairs bootstrap\n", "\n", "Now let's consider beak length in addition to beak depth. We will only work with the 1975 data for this. First, we'll check out the length versus depth graphically." ] }, { "cell_type": "code", "execution_count": 6, "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", " const docs_json = {\"17fd4e1e-a1be-454d-8e23-b9897c0ad159\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1012\"}],\"center\":[{\"id\":\"1015\"},{\"id\":\"1019\"}],\"frame_height\":250,\"frame_width\":250,\"left\":[{\"id\":\"1016\"}],\"renderers\":[{\"id\":\"1038\"}],\"title\":{\"id\":\"1040\"},\"toolbar\":{\"id\":\"1027\"},\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1008\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1010\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1044\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis_label\":\"beak depth (mm)\",\"coordinates\":null,\"formatter\":{\"id\":\"1046\"},\"group\":null,\"major_label_policy\":{\"id\":\"1047\"},\"ticker\":{\"id\":\"1013\"}},\"id\":\"1012\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"AllLabels\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1026\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1023\"},{\"id\":\"1024\"},{\"id\":\"1025\"}]},\"id\":\"1027\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1040\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1006\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1013\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1036\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1035\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"Selection\"},{\"attributes\":{\"axis_label\":\"beak length (mm)\",\"coordinates\":null,\"formatter\":{\"id\":\"1043\"},\"group\":null,\"major_label_policy\":{\"id\":\"1044\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"1026\"}},\"id\":\"1022\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"axis\":{\"id\":\"1012\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1034\"}},\"id\":\"1039\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"zczMzMzMIECamZmZmZkhQM3MzMzMzCBAAAAAAAAAIECamZmZmZkfQM3MzMzMzCFAMzMzMzMzIUAAAAAAAAAhQM3MzMzMzCFAMzMzMzMzIkAzMzMzMzMhQJqZmZmZmSNAZmZmZmZmIEAAAAAAAAAiQGZmZmZmZiNAMzMzMzMzIUBmZmZmZmYgQAAAAAAAACJAzczMzMzMIEAzMzMzMzMhQM3MzMzMzCFAMzMzMzMzIkCamZmZmZkgQGZmZmZmZiFAMzMzMzMzI0AAAAAAAAAhQDMzMzMzMyJAAAAAAAAAIkBmZmZmZmYiQM3MzMzMzCNAMzMzMzMzIUBmZmZmZmYiQM3MzMzMzCBAzczMzMzMIUAAAAAAAAAhQM3MzMzMzCRAMzMzMzMzI0AzMzMzMzMiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkhQJqZmZmZmSBAmpmZmZmZIUAzMzMzMzMiQDMzMzMzMyRAzczMzMzMIUBmZmZmZmYiQAAAAAAAACFAZmZmZmZmJEAzMzMzMzMkQGZmZmZmZiJAZmZmZmZmI0AzMzMzMzMiQAAAAAAAACFAZmZmZmZmIEAAAAAAAAAiQJqZmZmZmSJAAAAAAAAAIEAzMzMzMzMiQDMzMzMzMyBAmpmZmZmZIEBmZmZmZmYhQJqZmZmZmSFAMzMzMzMzIUBmZmZmZmYhQAAAAAAAACBAmpmZmZmZIUAAAAAAAAAiQDMzMzMzMyJAexSuR+F6I0AzMzMzMzMiQJqZmZmZmSNAzczMzMzMJECamZmZmZkgQOF6FK5H4SJAFK5H4XoUIkAAAAAAAAAiQJqZmZmZGSJAzczMzMxMI0BmZmZmZuYiQM3MzMzMTCFAZmZmZmbmIkBmZmZmZuYiQJqZmZmZGSJAAAAAAACAIUBmZmZmZuYiQDMzMzMzsyBA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[87]},\"y\":{\"__ndarray__\":\"zczMzMzMK0AAAAAAAAAsQM3MzMzMzClAAAAAAAAAK0DNzMzMzMwpQDMzMzMzMy1AAAAAAAAAKkBmZmZmZmYsQAAAAAAAACxAZmZmZmZmLEAzMzMzMzMqQDMzMzMzMy5AAAAAAAAAK0DNzMzMzMwsQM3MzMzMzC1AzczMzMzMKUAAAAAAAAAqQM3MzMzMzC1AAAAAAAAALECamZmZmZkrQAAAAAAAACpAAAAAAACALUBmZmZmZmYrQJqZmZmZmStAAAAAAAAALEAzMzMzMzMtQGZmZmZmZi5AAAAAAAAAK0AzMzMzMzMuQAAAAAAAAC5AmpmZmZmZKUDNzMzMzMwtQJqZmZmZmS5AzczMzMzMKkBmZmZmZmYsQDMzMzMzMy5AMzMzMzMzLkAAAAAAAAAsQDMzMzMzMytAAAAAAAAALEAAAAAAAAAsQM3MzMzMzCtAAAAAAAAALEDNzMzMzMwtQDMzMzMzMy9AmpmZmZmZK0DNzMzMzMwsQJqZmZmZmSlAZmZmZmZmLEDNzMzMzMwqQAAAAAAAACxAmpmZmZmZLUBmZmZmZmYsQAAAAAAAACtAzczMzMzMKkAzMzMzMzMtQAAAAAAAACtAZmZmZmZmK0DNzMzMzMwrQDMzMzMzMypAzczMzMzMKkCamZmZmZkrQDMzMzMzMytAAAAAAAAALEAAAAAAAAArQJqZmZmZmSlAAAAAAAAALEDNzMzMzMwqQM3MzMzMzC1AFK5H4XoUL0DD9Shcj0ItQPYoXI/CdS1A9ihcj8J1L0ApXI/C9agtQOF6FK5H4S9ASOF6FK5HLkD2KFyPwnUsQM3MzMzMTCxAMzMzMzOzLEBmZmZmZuYtQGZmZmZm5itAmpmZmZkZLECamZmZmRktQJqZmZmZGSxAZmZmZmbmLECamZmZmRkuQAAAAAAAgCpA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[87]}},\"selected\":{\"id\":\"1049\"},\"selection_policy\":{\"id\":\"1048\"}},\"id\":\"1034\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1034\"},\"glyph\":{\"id\":\"1035\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1037\"},\"nonselection_glyph\":{\"id\":\"1036\"},\"view\":{\"id\":\"1039\"}},\"id\":\"1038\",\"type\":\"GlyphRenderer\"}],\"root_ids\":[\"1003\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.2\"}};\n", " const render_items = [{\"docid\":\"17fd4e1e-a1be-454d-8e23-b9897c0ad159\",\"root_ids\":[\"1003\"],\"roots\":{\"1003\":\"d5892166-b997-450e-bc63-5db55ce3f80a\"}}];\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", " 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": "1003" } }, "output_type": "display_data" } ], "source": [ "p = bokeh.plotting.figure(\n", " frame_width=250,\n", " frame_height=250,\n", " x_axis_label='beak depth (mm)',\n", " y_axis_label='beak length (mm)',\n", ")\n", "\n", "# Extract beak lengths\n", "bl_1975 = df.loc[df['year']==1975, 'beak length (mm)'].values\n", "\n", "p.circle(bd_1975, bl_1975)\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can think about the relationship between beak length and depth in several ways. There seems to be a strong correlation between length and depth; that is the overall shape of the beak is roughly the same, it just changes in scale. The length-to-depth _ratio_ should therefore be similar for each bird. So, we seek both an estimate for the correlation coefficient between lengths and depths of beaks and also an estimate of the length-to-depth ratio.\n", "\n", "We will start with the ratio. Let's compute and plot its ECDF first." ] }, { "cell_type": "code", "execution_count": 7, "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", " const docs_json = {\"859bcefb-f5a8-4841-9bd9-ea40e1c76a39\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1115\"}],\"center\":[{\"id\":\"1118\"},{\"id\":\"1122\"}],\"frame_height\":275,\"frame_width\":375,\"left\":[{\"id\":\"1119\"}],\"renderers\":[{\"id\":\"1142\"}],\"title\":{\"id\":\"1155\"},\"toolbar\":{\"id\":\"1130\"},\"toolbar_location\":\"above\",\"x_range\":{\"id\":\"1107\"},\"x_scale\":{\"id\":\"1111\"},\"y_range\":{\"id\":\"1109\"},\"y_scale\":{\"id\":\"1113\"}},\"id\":\"1106\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1159\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1116\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1113\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis_label\":\"ECDF\",\"coordinates\":null,\"formatter\":{\"id\":\"1158\"},\"group\":null,\"major_label_policy\":{\"id\":\"1159\"},\"ticker\":{\"id\":\"1120\"}},\"id\":\"1119\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1115\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1118\",\"type\":\"Grid\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1129\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1124\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1123\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1164\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1128\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1126\",\"type\":\"SaveTool\"},{\"attributes\":{\"data\":{\"__ECDF\":{\"__ndarray__\":\"h36zdeg36z+WexphuafhP7xAJsULZNI/IJPiBTIp7j9bh36zdejnP6gRlnsaYek/YbmnEZZ7yj/UCMs9jbDsP/rN1qHfbN0/O/SbrUO/2T9K8QKZFC/QP1VVVVVVVdU/ztah32wd6j8Jyz2NsNzjP+MFMileINM/lnsaYbmnwT9tHfrN1qHfPxphuacRlus/rkO/2Tr06z8vkEnxApnkP5Z7GmG5p7E/ot9sHfrN5j9huacRlnvqP0rxApkUL+A/+s3Wod9srT/aOvSbrUPvP0EmxQtkUuw/4wUyKV4gwz879JutQ7/pP/rN1qHfbM0/+s3Wod9svT8P/Wbr0G/mPwAAAAAAAPA/yKR4gUyKxz9n69Bvtg7tP8ikeIFMiqc/1AjLPY2w3D8Jyz2NsNzTPy+QSfECmbQ/fBphuacRxj8pXiCT4gXiP/rN1qHfbO0/vEAmxQtk4j+BTIoXyKToP3waYbmnEdY/yKR4gUyK1z+uQ7/ZOvTbPxUvkEnxAsk/yKR4gUyKlz/IpHiBTIqHP0dY7mmE5c4/cLYO/Wbr0D9huacRlnvaPwOZFC+QSeE/7mmE5Z5G6D81wnJPIyznP5Z7GmG5p6E/R1juaYTl7j+WexphuafRP3waYbmnEeY/6Ddbh36z5T/d0wjLPY3gP6LfbB36zdY/yKR4gUyK5z/uaYTlnkbYP5ytQ7/ZOuQ/TyMs9zTC4j9K8QKZFC/APxUvkEnxAuk/dug3W4d+4z/Cck8jLPfkPy+QSfECmcQ/rkO/2Tr0yz9tHfrN1qHvP7N16Ddbh+4/jbDc0wjL7T8gk+IFMineP4d+s3XoN9s/YbmnEZZ7uj9HWO5phOXeP1VVVVVVVeU/yKR4gUyKtz8vkEnxApnUPxUvkEnxAtk/9JutQ7/Z6j/jBTIpXiDjP3C2Dv1m6+A/\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[87]},\"__dummy_cat\":[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"],\"__label\":[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"],\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86],\"x\":{\"__ndarray__\":\"nud5nud5+j900UUXXXT5PyRJkiRJkvg/AAAAAAAA+z9BVDqyZyD6P6Mf/ehHP/o/DPqCvqAv+D+6urq6urr6P5KVrGQlK/k/eY/3eI/3+D8Y9AV9QV/4Pyl4OQUvp/g/WKJ2JWpX+j+amZmZmZn5P8k0bDfLk/g/AAAAAAAA+D9eidqVqF35P9MnfdInffo/qqqqqqqq+j9sypqypqz5P3ave93rXvc/8h7v8R7v+T/LioES3mj6P6kRlnsaYfk/VlVVVVVV9z97e3t7e3v7P5uruZqrufo/AAAAAAAA+D9lIQtZyEL6Pz744IMPPvg/9QV9QV/Q9z/f9KY3ven5P0mSJEmSJP0/gQtc4AIX+D+6urq6urr6P7ETO7ETO/c/q6qqqqoq+T/ZiZ3YiZ34P2WXXXbZZfc/FlhggQUW+D900UUXXXT5P5o6v/aQy/o/dNFFF110+T8rozIqozL6P6p5kLt+tvg/jWc84xnP+D+RhSxkIQv5PxgYGBgYGPg/RkZGRkZG9j8zfCMKTDr1P4YsZCELWfg/2W6WJ5Fp+D95j/d4j/f4P2lpaWlpafk/JmpXonYl+j9Kn/RJn/T5PznnnHPOOfc/ZmZmZmZm+z8Jh3AIh3D4P1zzwyJl4Pk/FQMlvNHU+T+pEZZ7GmH5P7nooosuuvg/g76gL+gL+j/MPY2w3NP4P5qZmZmZmfk/dNFFF110+T8ofdInfdL3PyujMiqjMvo/nl7UtBiH+T+SG7mRG7n5PzYcMe2JDPg/MzMzMzMz+D8arHcChJb8P0rdl8dWBPs/Tr5s0OTL+j/3BxkqO0z5P6U/Zzs+BPk/2J3JaPHK9z//lPpT6k/5PwgirRewzfk/nnx08tHJ9z8piqIoiqL4P8CYxMH71vg/kHOfXUBs+j+1l9BeQnv5P3y5IQakY/k/\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[87]}},\"selected\":{\"id\":\"1164\"},\"selection_policy\":{\"id\":\"1163\"}},\"id\":\"1137\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"overlay\":{\"id\":\"1129\"}},\"id\":\"1125\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1120\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1162\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1161\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b3\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"#1f77b3\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b3\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"__ECDF\"}},\"id\":\"1141\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1107\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b3\"},\"hatch_color\":{\"value\":\"#1f77b3\"},\"line_color\":{\"value\":\"#1f77b3\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"__ECDF\"}},\"id\":\"1139\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b3\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"#1f77b3\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b3\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"__ECDF\"}},\"id\":\"1140\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1163\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"axis_label\":\"length/depth\",\"coordinates\":null,\"formatter\":{\"id\":\"1161\"},\"group\":null,\"major_label_policy\":{\"id\":\"1162\"},\"ticker\":{\"id\":\"1116\"}},\"id\":\"1115\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1109\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1111\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1137\"}},\"id\":\"1143\",\"type\":\"CDSView\"},{\"attributes\":{\"axis\":{\"id\":\"1119\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1122\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1155\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1127\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1158\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1137\"},\"glyph\":{\"id\":\"1139\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1141\"},\"nonselection_glyph\":{\"id\":\"1140\"},\"view\":{\"id\":\"1143\"}},\"id\":\"1142\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"tools\":[{\"id\":\"1123\"},{\"id\":\"1124\"},{\"id\":\"1125\"},{\"id\":\"1126\"},{\"id\":\"1127\"},{\"id\":\"1128\"}]},\"id\":\"1130\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1106\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.2\"}};\n", " const render_items = [{\"docid\":\"859bcefb-f5a8-4841-9bd9-ea40e1c76a39\",\"root_ids\":[\"1106\"],\"roots\":{\"1106\":\"16f2498f-62c8-459d-a0ea-a15d1203227e\"}}];\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", " 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": "1106" } }, "output_type": "display_data" } ], "source": [ "p = iqplot.ecdf(\n", " bl_1975 / bd_1975,\n", " x_axis_label='length/depth',\n", ")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To compute an estimate for the mean ratio and its bootstrap confidence interval, we need to do **pairs bootstrap**. This means that we draw length and depth *pairs* together to get a bootstrap sample. To do this, we randomly sample the *indices* of the measurements with replacement. We then keep data points in each of the two arrays we are sampling out of corresponding to the bootstrap indices." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def draw_bs_pairs(x, y, rg):\n", " \"\"\"Draw pairs of data points out of `x` and `y`\"\"\"\n", " # Get indices of bootstrap sample\n", " bs_inds = rg.choice(np.arange(len(x)), len(x), replace=True)\n", " \n", " return x[bs_inds], y[bs_inds]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we can draw a pairs sample, we can compute whatever statistic we like from the pairs to get a bootstrap replicate. In this case, we take the ratio of each pair and then compute the mean of the ratios. We could do this with a comprehension, but it would need an **anonymous function**, which we are not covering in the bootcamp. So, we will use a `for` loop." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "ratio_bs_reps = np.empty(n_reps)\n", "\n", "for i in range(n_reps):\n", " bd, bl = draw_bs_pairs(bd_1975, bl_1975, rg)\n", " ratio_bs_reps[i] = np.mean(bl / bd)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have our reps, we can compute the 95% confidence interval." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.5608083 , 1.59531694])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.percentile(ratio_bs_reps, [2.5, 97.5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can do a similar calculation for the correlation. To compute the correlation, we need the covariance matrix,\n", "\n", "\\begin{align}\n", "\\mathsf{\\Sigma} = \\begin{pmatrix}\n", "\\sigma_d^2 & \\sigma_{dl} \\\\\n", "\\sigma_{dl} & \\sigma_l^2\n", "\\end{pmatrix}.\n", "\\end{align}\n", "\n", "The correlation is $\\rho = \\sigma_{dl} / \\sigma_d \\sigma_l$. We can use `np.cov` to compute the covariance matrix, and then compute $\\rho$." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "correlation_bs_reps = np.empty(n_reps)\n", "\n", "for i in range(n_reps):\n", " bd, bl = draw_bs_pairs(bd_1975, bl_1975, rg)\n", " cov = np.cov(bd, bl)\n", " correlation_bs_reps[i] = cov[0, 1] / np.sqrt(cov[0, 0] * cov[1, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can again compute the confidence interval by taking percentiles." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.45568665, 0.75722052])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.percentile(correlation_bs_reps, [2.5, 97.5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bootstrap confidence interval of an ECDF\n", "\n", "We can compute confidence intervals for anything directly computed from the data. This includes the value of an ECDF for an arbitrary x. Here is how we can compute the confidence interval for the ECDF.\n", "\n", "1. Generate a bootstrap sample of the data.\n", "2. For each value x of your data set, evaluate the value of the ECDF at that point and record it. This is a bootstrap replicate of the ECDF at x.\n", "3. Do steps 1 and 2 over and over until you get your desired number of bootstrap replicates.\n", "4. For each value of x in your data set, compute the appropriate percentiles of your ECDF replicates. This gives you the ECDF confidence interval at x.\n", "\n", "Step 2 is kind of tricky, since not all of your measured data points are present in each bootstrap sample and you have to use the formal definition of the ECDF to get a replicate of the ECDF. Fortunately, this is done for you in the `iqplot.ecdf()` function using the `conf_int` kwarg. I will not use it to plot an ECDFs of the *G. scandens* beak depth for 1975 and 2012 with confidence intervals." ] }, { "cell_type": "code", "execution_count": 13, "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", " const docs_json = {\"7d887e3a-5184-4847-a916-076eed44bbe7\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1230\"}],\"center\":[{\"id\":\"1233\"},{\"id\":\"1237\"}],\"frame_height\":275,\"frame_width\":375,\"left\":[{\"id\":\"1234\"}],\"renderers\":[{\"id\":\"1256\"},{\"id\":\"1262\"},{\"id\":\"1268\"},{\"id\":\"1274\"},{\"id\":\"1280\"},{\"id\":\"1286\"},{\"id\":\"1292\"},{\"id\":\"1298\"}],\"right\":[{\"id\":\"1300\"}],\"title\":{\"id\":\"1325\"},\"toolbar\":{\"id\":\"1245\"},\"toolbar_location\":\"above\",\"x_range\":{\"id\":\"1222\"},\"x_scale\":{\"id\":\"1226\"},\"y_range\":{\"id\":\"1224\"},\"y_scale\":{\"id\":\"1228\"}},\"id\":\"1221\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"zczMzMzMHkDNzMzMzMweQM3MzMzMzB5AzczMzMzMHkDNzMzMzMweQM3MzMzMzB5AzczMzMzMHkDNzMzMzMweQM3MzMzMzB5AzczMzMzMHkAzMzMzMzMfQDMzMzMzMx9AMzMzMzMzH0AzMzMzMzMfQJqZmZmZmR9AmpmZmZmZH0AAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQDMzMzMzMyBAMzMzMzMzIEAzMzMzMzMgQDMzMzMzMyBAZmZmZmZmIEBmZmZmZmYgQGZmZmZmZiBAZmZmZmZmIEBmZmZmZmYgQGZmZmZmZiBAmpmZmZmZIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAMzMzMzOzIUAzMzMzM7MhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAZmZmZmbmIUBmZmZmZuYhQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkDNzMzMzEwiQM3MzMzMTCJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkAAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0BmZmZmZmYjQGZmZmZmZiNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQM3MzMzMzCNAzczMzMzMI0DNzMzMzMwjQM3MzMzMzCNAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQAAAAAAAACVAAAAAAAAAJUAzMzMzMzMlQDMzMzMzMyVAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAAAAAAAAAJkAAAAAAAAAmQAAAAAAAACZAmpmZmZmZJUCamZmZmZklQJqZmZmZmSVAmpmZmZmZJUAzMzMzMzMlQDMzMzMzMyVAMzMzMzMzJUAzMzMzMzMlQDMzMzMzMyVAMzMzMzMzJUAAAAAAAAAlQAAAAAAAACVAAAAAAAAAJUAAAAAAAAAlQAAAAAAAACVAAAAAAAAAJUBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAzczMzMzMI0DNzMzMzMwjQM3MzMzMzCNAzczMzMzMI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0BmZmZmZmYjQGZmZmZmZiNAZmZmZmZmI0BmZmZmZmYjQGZmZmZmZiNAZmZmZmZmI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQM3MzMzMTCJAzczMzMxMIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQDMzMzMzsyFAMzMzMzOzIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUAzMzMzMzMhQDMzMzMzMyFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIECamZmZmZkgQGZmZmZmZiBAZmZmZmZmIEAzMzMzMzMgQDMzMzMzMyBAMzMzMzMzIEAzMzMzMzMgQAAAAAAAACBAAAAAAAAAIECamZmZmZkfQJqZmZmZmR9A\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[504]},\"y\":{\"__ndarray__\":\"AAAAAAAAAAAQBEEQBEGAPxAEQRAEQYA/EARBEARBkD8QBEEQBEGQPxiGYRiGYZg/GIZhGIZhmD8QBEEQBEGgPxAEQRAEQaA/FEVRFEVRpD8URVEURVGkPxiGYRiGYag/GIZhGIZhqD8cx3Ecx3GsPxzHcRzHcaw/EARBEARBsD8QBEEQBEGwP5IkSZIkSbI/kiRJkiRJsj8URVEURVG0PxRFURRFUbQ/lmVZlmVZtj+WZVmWZVm2PxiGYRiGYbg/GIZhGIZhuD+apmmapmm6P5qmaZqmabo/HMdxHMdxvD8cx3Ecx3G8P57neZ7neb4/nud5nud5vj8QBEEQBEHAPxAEQRAEQcA/URRFURRFwT9RFEVRFEXBP5IkSZIkScI/kiRJkiRJwj/TNE3TNE3DP9M0TdM0TcM/FEVRFEVRxD8URVEURVHEP1VVVVVVVcU/VVVVVVVVxT+WZVmWZVnGP5ZlWZZlWcY/13Vd13Vdxz/XdV3XdV3HPxiGYRiGYcg/GIZhGIZhyD9ZlmVZlmXJP1mWZVmWZck/mqZpmqZpyj+apmmapmnKP9u2bdu2bcs/27Zt27Ztyz8cx3Ecx3HMPxzHcRzHccw/Xdd1Xdd1zT9d13Vd13XNP57neZ7nec4/nud5nud5zj/f933f933PP9/3fd/3fc8/EARBEARB0D8QBEEQBEHQPzEMwzAMw9A/MQzDMAzD0D9RFEVRFEXRP1EURVEURdE/chzHcRzH0T9yHMdxHMfRP5IkSZIkSdI/kiRJkiRJ0j+zLMuyLMvSP7Msy7Isy9I/0zRN0zRN0z/TNE3TNE3TP/Q8z/M8z9M/9DzP8zzP0z8URVEURVHUPxRFURRFUdQ/NU3TNE3T1D81TdM0TdPUP1VVVVVVVdU/VVVVVVVV1T92Xdd1XdfVP3Zd13Vd19U/lmVZlmVZ1j+WZVmWZVnWP7dt27Zt29Y/t23btm3b1j/XdV3XdV3XP9d1Xdd1Xdc/+H3f933f1z/4fd/3fd/XPxiGYRiGYdg/GIZhGIZh2D85juM4juPYPzmO4ziO49g/WZZlWZZl2T9ZlmVZlmXZP3qe53me59k/ep7neZ7n2T+apmmapmnaP5qmaZqmado/u67ruq7r2j+7ruu6ruvaP9u2bdu2bds/27Zt27Zt2z/8vu/7vu/bP/y+7/u+79s/HMdxHMdx3D8cx3Ecx3HcPz3P8zzP89w/Pc/zPM/z3D9d13Vd13XdP13XdV3Xdd0/ft/3fd/33T9+3/d93/fdP57neZ7ned4/nud5nud53j+/7/u+7/veP7/v+77v+94/3/d93/d93z/f933f933fPwAAAAAAAOA/AAAAAAAA4D8QBEEQBEHgPxAEQRAEQeA/IQiCIAiC4D8hCIIgCILgPzEMwzAMw+A/MQzDMAzD4D9BEARBEAThP0EQBEEQBOE/URRFURRF4T9RFEVRFEXhP2IYhmEYhuE/YhiGYRiG4T9yHMdxHMfhP3Icx3Ecx+E/giAIgiAI4j+CIAiCIAjiP5IkSZIkSeI/kiRJkiRJ4j+jKIqiKIriP6MoiqIoiuI/syzLsizL4j+zLMuyLMviP8MwDMMwDOM/wzAMwzAM4z/TNE3TNE3jP9M0TdM0TeM/5DiO4ziO4z/kOI7jOI7jP/Q8z/M8z+M/9DzP8zzP4z8EQRAEQRDkPwRBEARBEOQ/FEVRFEVR5D8URVEURVHkPyVJkiRJkuQ/JUmSJEmS5D81TdM0TdPkPzVN0zRN0+Q/RVEURVEU5T9FURRFURTlP1VVVVVVVeU/VVVVVVVV5T9mWZZlWZblP2ZZlmVZluU/dl3XdV3X5T92Xdd1XdflP4ZhGIZhGOY/hmEYhmEY5j+WZVmWZVnmP5ZlWZZlWeY/p2mapmma5j+naZqmaZrmP7dt27Zt2+Y/t23btm3b5j/HcRzHcRznP8dxHMdxHOc/13Vd13Vd5z/XdV3XdV3nP+h5nud5nuc/6Hme53me5z/4fd/3fd/nP/h93/d93+c/CIIgCIIg6D8IgiAIgiDoPxiGYRiGYeg/GIZhGIZh6D8piqIoiqLoPymKoiiKoug/OY7jOI7j6D85juM4juPoP0mSJEmSJOk/SZIkSZIk6T9ZlmVZlmXpP1mWZVmWZek/apqmaZqm6T9qmqZpmqbpP3qe53me5+k/ep7neZ7n6T+KoiiKoijqP4qiKIqiKOo/mqZpmqZp6j+apmmapmnqP6uqqqqqquo/q6qqqqqq6j+7ruu6ruvqP7uu67qu6+o/y7Isy7Is6z/LsizLsizrP9u2bdu2bes/27Zt27Zt6z/suq7ruq7rP+y6ruu6rus//L7v+77v6z/8vu/7vu/rPwzDMAzDMOw/DMMwDMMw7D8cx3Ecx3HsPxzHcRzHcew/LcuyLMuy7D8ty7Isy7LsPz3P8zzP8+w/Pc/zPM/z7D9N0zRN0zTtP03TNE3TNO0/Xdd1Xdd17T9d13Vd13XtP27btm3btu0/btu2bdu27T9+3/d93/ftP37f933f9+0/juM4juM47j+O4ziO4zjuP57neZ7nee4/nud5nud57j+v67qu67ruP6/ruq7ruu4/v+/7vu/77j+/7/u+7/vuP8/zPM/zPO8/z/M8z/M87z/f933f933vP9/3fd/3fe8/8Pu+7/u+7z/w+77v+77vPwAAAAAAAPA/AAAAAAAA8D/w+77v+77vP/D7vu/7vu8/3/d93/d97z/f933f933vP8/zPM/zPO8/z/M8z/M87z+/7/u+7/vuP7/v+77v++4/r+u6ruu67j+v67qu67ruP57neZ7nee4/nud5nud57j+O4ziO4zjuP47jOI7jOO4/ft/3fd/37T9+3/d93/ftP27btm3btu0/btu2bdu27T9d13Vd13XtP13XdV3Xde0/TdM0TdM07T9N0zRN0zTtPz3P8zzP8+w/Pc/zPM/z7D8ty7Isy7LsPy3LsizLsuw/HMdxHMdx7D8cx3Ecx3HsPwzDMAzDMOw/DMMwDMMw7D/8vu/7vu/rP/y+7/u+7+s/7Lqu67qu6z/suq7ruq7rP9u2bdu2bes/27Zt27Zt6z/LsizLsizrP8uyLMuyLOs/u67ruq7r6j+7ruu6ruvqP6uqqqqqquo/q6qqqqqq6j+apmmapmnqP5qmaZqmaeo/iqIoiqIo6j+KoiiKoijqP3qe53me5+k/ep7neZ7n6T9qmqZpmqbpP2qapmmapuk/WZZlWZZl6T9ZlmVZlmXpP0mSJEmSJOk/SZIkSZIk6T85juM4juPoPzmO4ziO4+g/KYqiKIqi6D8piqIoiqLoPxiGYRiGYeg/GIZhGIZh6D8IgiAIgiDoPwiCIAiCIOg/+H3f933f5z/4fd/3fd/nP+h5nud5nuc/6Hme53me5z/XdV3XdV3nP9d1Xdd1Xec/x3Ecx3Ec5z/HcRzHcRznP7dt27Zt2+Y/t23btm3b5j+naZqmaZrmP6dpmqZpmuY/lmVZlmVZ5j+WZVmWZVnmP4ZhGIZhGOY/hmEYhmEY5j92Xdd1XdflP3Zd13Vd1+U/ZlmWZVmW5T9mWZZlWZblP1VVVVVVVeU/VVVVVVVV5T9FURRFURTlP0VRFEVRFOU/NU3TNE3T5D81TdM0TdPkPyVJkiRJkuQ/JUmSJEmS5D8URVEURVHkPxRFURRFUeQ/BEEQBEEQ5D8EQRAEQRDkP/Q8z/M8z+M/9DzP8zzP4z/kOI7jOI7jP+Q4juM4juM/0zRN0zRN4z/TNE3TNE3jP8MwDMMwDOM/wzAMwzAM4z+zLMuyLMviP7Msy7Isy+I/oyiKoiiK4j+jKIqiKIriP5IkSZIkSeI/kiRJkiRJ4j+CIAiCIAjiP4IgCIIgCOI/chzHcRzH4T9yHMdxHMfhP2IYhmEYhuE/YhiGYRiG4T9RFEVRFEXhP1EURVEUReE/QRAEQRAE4T9BEARBEAThPzEMwzAMw+A/MQzDMAzD4D8hCIIgCILgPyEIgiAIguA/EARBEARB4D8QBEEQBEHgPwAAAAAAAOA/AAAAAAAA4D/f933f933fP9/3fd/3fd8/v+/7vu/73j+/7/u+7/veP57neZ7ned4/nud5nud53j9+3/d93/fdP37f933f990/Xdd1Xdd13T9d13Vd13XdPz3P8zzP89w/Pc/zPM/z3D8cx3Ecx3HcPxzHcRzHcdw//L7v+77v2z/8vu/7vu/bP9u2bdu2bds/27Zt27Zt2z+7ruu6ruvaP7uu67qu69o/mqZpmqZp2j+apmmapmnaP3qe53me59k/ep7neZ7n2T9ZlmVZlmXZP1mWZVmWZdk/OY7jOI7j2D85juM4juPYPxiGYRiGYdg/GIZhGIZh2D/4fd/3fd/XP/h93/d939c/13Vd13Vd1z/XdV3XdV3XP7dt27Zt29Y/t23btm3b1j+WZVmWZVnWP5ZlWZZlWdY/dl3XdV3X1T92Xdd1XdfVP1VVVVVVVdU/VVVVVVVV1T81TdM0TdPUPzVN0zRN09Q/FEVRFEVR1D8URVEURVHUP/Q8z/M8z9M/9DzP8zzP0z/TNE3TNE3TP9M0TdM0TdM/syzLsizL0j+zLMuyLMvSP5IkSZIkSdI/kiRJkiRJ0j9yHMdxHMfRP3Icx3Ecx9E/URRFURRF0T9RFEVRFEXRPzEMwzAMw9A/MQzDMAzD0D8QBEEQBEHQPxAEQRAEQdA/3/d93/d9zz/f933f933PP57neZ7nec4/nud5nud5zj9d13Vd13XNP13XdV3Xdc0/HMdxHMdxzD8cx3Ecx3HMP9u2bdu2bcs/27Zt27Ztyz+apmmapmnKP5qmaZqmaco/WZZlWZZlyT9ZlmVZlmXJPxiGYRiGYcg/GIZhGIZhyD/XdV3XdV3HP9d1Xdd1Xcc/lmVZlmVZxj+WZVmWZVnGP1VVVVVVVcU/VVVVVVVVxT8URVEURVHEPxRFURRFUcQ/0zRN0zRNwz/TNE3TNE3DP5IkSZIkScI/kiRJkiRJwj9RFEVRFEXBP1EURVEURcE/EARBEARBwD8QBEEQBEHAP57neZ7neb4/nud5nud5vj8cx3Ecx3G8PxzHcRzHcbw/mqZpmqZpuj+apmmapmm6PxiGYRiGYbg/GIZhGIZhuD+WZVmWZVm2P5ZlWZZlWbY/FEVRFEVRtD8URVEURVG0P5IkSZIkSbI/kiRJkiRJsj8QBEEQBEGwPxAEQRAEQbA/HMdxHMdxrD8cx3Ecx3GsPxiGYRiGYag/GIZhGIZhqD8URVEURVGkPxRFURRFUaQ/EARBEARBoD8QBEEQBEGgPxiGYRiGYZg/GIZhGIZhmD8QBEEQBEGQPxAEQRAEQZA/EARBEARBgD8QBEEQBEGAPwAAAAAAAAAA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[504]}},\"selected\":{\"id\":\"1342\"},\"selection_policy\":{\"id\":\"1341\"}},\"id\":\"1276\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_alpha\":0.5,\"fill_color\":\"#ff7e0e\",\"line_alpha\":0,\"line_color\":\"#1f77b4\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1277\",\"type\":\"Patch\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1276\"},\"glyph\":{\"id\":\"1277\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1279\"},\"nonselection_glyph\":{\"id\":\"1278\"},\"view\":{\"id\":\"1281\"}},\"id\":\"1280\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1343\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1244\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1264\"},\"glyph\":{\"id\":\"1265\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1267\"},\"nonselection_glyph\":{\"id\":\"1266\"},\"view\":{\"id\":\"1269\"}},\"id\":\"1268\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b3\"},\"line_width\":{\"value\":2},\"x\":{\"value\":10.4},\"y\":{\"value\":1}},\"id\":\"1272\",\"type\":\"Ray\"},{\"attributes\":{\"line_color\":{\"value\":\"#1f77b3\"},\"line_width\":{\"value\":2},\"x\":{\"value\":10.4},\"y\":{\"value\":1}},\"id\":\"1271\",\"type\":\"Ray\"},{\"attributes\":{},\"id\":\"1344\",\"type\":\"Selection\"},{\"attributes\":{\"source\":{\"id\":\"1264\"}},\"id\":\"1269\",\"type\":\"CDSView\"},{\"attributes\":{\"data\":{},\"selected\":{\"id\":\"1340\"},\"selection_policy\":{\"id\":\"1339\"}},\"id\":\"1270\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b3\"},\"line_width\":{\"value\":2},\"x\":{\"value\":10.4},\"y\":{\"value\":1}},\"id\":\"1273\",\"type\":\"Ray\"},{\"attributes\":{\"source\":{\"id\":\"1270\"}},\"id\":\"1275\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1270\"},\"glyph\":{\"id\":\"1271\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1273\"},\"nonselection_glyph\":{\"id\":\"1272\"},\"view\":{\"id\":\"1275\"}},\"id\":\"1274\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data\":{},\"selected\":{\"id\":\"1348\"},\"selection_policy\":{\"id\":\"1347\"}},\"id\":\"1294\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_alpha\":0.2,\"fill_color\":\"#ff7e0e\",\"hatch_alpha\":0.2,\"line_alpha\":0.2,\"line_color\":\"#1f77b4\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1279\",\"type\":\"Patch\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1282\"},\"glyph\":{\"id\":\"1283\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1285\"},\"nonselection_glyph\":{\"id\":\"1284\"},\"view\":{\"id\":\"1287\"}},\"id\":\"1286\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1345\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"source\":{\"id\":\"1282\"}},\"id\":\"1287\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":0.1,\"fill_color\":\"#ff7e0e\",\"hatch_alpha\":0.1,\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1278\",\"type\":\"Patch\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"mpmZmZmZH0CamZmZmZkfQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQDMzMzMzMyBAMzMzMzMzIEBmZmZmZmYgQGZmZmZmZiBAZmZmZmZmIEBmZmZmZmYgQGZmZmZmZiBAZmZmZmZmIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIECamZmZmZkgQJqZmZmZmSBAMzMzMzOzIEAzMzMzM7MgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQM3MzMzMTCFAzczMzMxMIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUAAAAAAAIAhQAAAAAAAgCFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQBSuR+F6FCJAFK5H4XoUIkCamZmZmRkiQJqZmZmZGSJAmpmZmZkZIkCamZmZmRkiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkDhehSuR+EiQOF6FK5H4SJAZmZmZmbmIkBmZmZmZuYiQGZmZmZm5iJAZmZmZmbmIkBmZmZmZuYiQGZmZmZm5iJAZmZmZmbmIkBmZmZmZuYiQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAzczMzMxMI0DNzMzMzEwjQGZmZmZmZiNAZmZmZmZmI0BmZmZmZmYjQGZmZmZmZiNAexSuR+F6I0B7FK5H4XojQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAzczMzMzMI0DNzMzMzMwjQDMzMzMzMyRAMzMzMzMzJEAzMzMzMzMkQDMzMzMzMyRAZmZmZmZmJEBmZmZmZmYkQM3MzMzMzCRAzczMzMzMJEDNzMzMzMwkQM3MzMzMzCRA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[174]},\"y\":{\"__ndarray__\":\"AAAAAAAAAADIpHiBTIqHP8ikeIFMioc/yKR4gUyKlz/IpHiBTIqXP5Z7GmG5p6E/lnsaYbmnoT/IpHiBTIqnP8ikeIFMiqc/+s3Wod9srT/6zdah32ytP5Z7GmG5p7E/lnsaYbmnsT8vkEnxApm0Py+QSfECmbQ/yKR4gUyKtz/IpHiBTIq3P2G5pxGWe7o/YbmnEZZ7uj/6zdah32y9P/rN1qHfbL0/SvECmRQvwD9K8QKZFC/AP5Z7GmG5p8E/lnsaYbmnwT/jBTIpXiDDP+MFMileIMM/L5BJ8QKZxD8vkEnxApnEP3waYbmnEcY/fBphuacRxj/IpHiBTIrHP8ikeIFMisc/FS+QSfECyT8VL5BJ8QLJP2G5pxGWe8o/YbmnEZZ7yj+uQ7/ZOvTLP65Dv9k69Ms/+s3Wod9szT/6zdah32zNP0dY7mmE5c4/R1juaYTlzj9K8QKZFC/QP0rxApkUL9A/cLYO/Wbr0D9wtg79ZuvQP5Z7GmG5p9E/lnsaYbmn0T+8QCbFC2TSP7xAJsULZNI/4wUyKV4g0z/jBTIpXiDTPwnLPY2w3NM/Ccs9jbDc0z8vkEnxApnUPy+QSfECmdQ/VVVVVVVV1T9VVVVVVVXVP3waYbmnEdY/fBphuacR1j+i32wd+s3WP6LfbB36zdY/yKR4gUyK1z/IpHiBTIrXP+5phOWeRtg/7mmE5Z5G2D8VL5BJ8QLZPxUvkEnxAtk/O/SbrUO/2T879JutQ7/ZP2G5pxGWe9o/YbmnEZZ72j+HfrN16DfbP4d+s3XoN9s/rkO/2Tr02z+uQ7/ZOvTbP9QIyz2NsNw/1AjLPY2w3D/6zdah32zdP/rN1qHfbN0/IJPiBTIp3j8gk+IFMineP0dY7mmE5d4/R1juaYTl3j9tHfrN1qHfP20d+s3Wod8/SvECmRQv4D9K8QKZFC/gP93TCMs9jeA/3dMIyz2N4D9wtg79ZuvgP3C2Dv1m6+A/A5kUL5BJ4T8DmRQvkEnhP5Z7GmG5p+E/lnsaYbmn4T8pXiCT4gXiPyleIJPiBeI/vEAmxQtk4j+8QCbFC2TiP08jLPc0wuI/TyMs9zTC4j/jBTIpXiDjP+MFMileIOM/dug3W4d+4z926Ddbh37jPwnLPY2w3OM/Ccs9jbDc4z+crUO/2TrkP5ytQ7/ZOuQ/L5BJ8QKZ5D8vkEnxApnkP8JyTyMs9+Q/wnJPIyz35D9VVVVVVVXlP1VVVVVVVeU/6Ddbh36z5T/oN1uHfrPlP3waYbmnEeY/fBphuacR5j8P/Wbr0G/mPw/9ZuvQb+Y/ot9sHfrN5j+i32wd+s3mPzXCck8jLOc/NcJyTyMs5z/IpHiBTIrnP8ikeIFMiuc/W4d+s3Xo5z9bh36zdejnP+5phOWeRug/7mmE5Z5G6D+BTIoXyKToP4FMihfIpOg/FS+QSfEC6T8VL5BJ8QLpP6gRlnsaYek/qBGWexph6T879JutQ7/pPzv0m61Dv+k/ztah32wd6j/O1qHfbB3qP2G5pxGWe+o/YbmnEZZ76j/0m61Dv9nqP/SbrUO/2eo/h36zdeg36z+HfrN16DfrPxphuacRlus/GmG5pxGW6z+uQ7/ZOvTrP65Dv9k69Os/QSbFC2RS7D9BJsULZFLsP9QIyz2NsOw/1AjLPY2w7D9n69Bvtg7tP2fr0G+2Du0/+s3Wod9s7T/6zdah32ztP42w3NMIy+0/jbDc0wjL7T8gk+IFMinuPyCT4gUyKe4/s3XoN1uH7j+zdeg3W4fuP0dY7mmE5e4/R1juaYTl7j/aOvSbrUPvP9o69JutQ+8/bR36zdah7z9tHfrN1qHvPwAAAAAAAPA/\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[174]}},\"selected\":{\"id\":\"1336\"},\"selection_policy\":{\"id\":\"1335\"}},\"id\":\"1258\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1276\"}},\"id\":\"1281\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1346\",\"type\":\"Selection\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"zczMzMzMHkDNzMzMzMweQM3MzMzMzB5AzczMzMzMHkAzMzMzMzMfQDMzMzMzMx9AmpmZmZmZH0CamZmZmZkfQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQDMzMzMzMyBAMzMzMzMzIEAzMzMzMzMgQDMzMzMzMyBAZmZmZmZmIEBmZmZmZmYgQGZmZmZmZiBAZmZmZmZmIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIECamZmZmZkgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUAzMzMzM7MhQDMzMzMzsyFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQGZmZmZm5iFAZmZmZmbmIUAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAMzMzMzMzIkAzMzMzMzMiQDMzMzMzMyJAzczMzMxMIkDNzMzMzEwiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkBmZmZmZmYiQGZmZmZmZiJAZmZmZmZmIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkCamZmZmZkiQJqZmZmZmSJAmpmZmZmZIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQM3MzMzMzCJAzczMzMzMIkDNzMzMzMwiQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0AzMzMzMzMjQDMzMzMzMyNAMzMzMzMzI0BmZmZmZmYjQGZmZmZmZiNAZmZmZmZmI0BmZmZmZmYjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAmpmZmZmZI0CamZmZmZkjQJqZmZmZmSNAzczMzMzMI0DNzMzMzMwjQM3MzMzMzCNAzczMzMzMI0AAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQAAAAAAAACRAAAAAAAAAJEAAAAAAAAAkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAZmZmZmZmJEBmZmZmZmYkQGZmZmZmZiRAAAAAAAAAJUAAAAAAAAAlQAAAAAAAACVAAAAAAAAAJUAzMzMzMzMlQDMzMzMzMyVAMzMzMzMzJUAzMzMzMzMlQJqZmZmZmSVAmpmZmZmZJUAAAAAAAAAmQAAAAAAAACZA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[252]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[252]}},\"selected\":{\"id\":\"1344\"},\"selection_policy\":{\"id\":\"1343\"}},\"id\":\"1282\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"angle\":{\"value\":3.141592653589793},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#ff7e0e\"},\"line_width\":{\"value\":2},\"x\":{\"value\":7.7},\"y\":{\"value\":0}},\"id\":\"1290\",\"type\":\"Ray\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#ff7e0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1285\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#ff7e0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1284\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1288\"},\"glyph\":{\"id\":\"1289\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1291\"},\"nonselection_glyph\":{\"id\":\"1290\"},\"view\":{\"id\":\"1293\"}},\"id\":\"1292\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data\":{},\"selected\":{\"id\":\"1346\"},\"selection_policy\":{\"id\":\"1345\"}},\"id\":\"1288\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1288\"}},\"id\":\"1293\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#ff7e0e\"},\"line_width\":{\"value\":2},\"x\":{\"value\":11.0},\"y\":{\"value\":1}},\"id\":\"1297\",\"type\":\"Ray\"},{\"attributes\":{\"line_color\":{\"value\":\"#ff7e0e\"},\"line_width\":{\"value\":2},\"x\":{\"value\":11.0},\"y\":{\"value\":1}},\"id\":\"1295\",\"type\":\"Ray\"},{\"attributes\":{\"angle\":{\"value\":3.141592653589793},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#ff7e0e\"},\"line_width\":{\"value\":2},\"x\":{\"value\":7.7},\"y\":{\"value\":0}},\"id\":\"1291\",\"type\":\"Ray\"},{\"attributes\":{\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#ff7e0e\"},\"line_width\":{\"value\":2},\"x\":{\"value\":11.0},\"y\":{\"value\":1}},\"id\":\"1296\",\"type\":\"Ray\"},{\"attributes\":{\"source\":{\"id\":\"1294\"}},\"id\":\"1299\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":0.5,\"fill_color\":\"#1f77b3\",\"line_alpha\":0,\"line_color\":\"#1f77b4\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1253\",\"type\":\"Patch\"},{\"attributes\":{},\"id\":\"1347\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1294\"},\"glyph\":{\"id\":\"1295\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1297\"},\"nonselection_glyph\":{\"id\":\"1296\"},\"view\":{\"id\":\"1299\"}},\"id\":\"1298\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1348\",\"type\":\"Selection\"},{\"attributes\":{\"data\":{},\"selected\":{\"id\":\"1338\"},\"selection_policy\":{\"id\":\"1337\"}},\"id\":\"1264\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1328\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"angle\":{\"value\":3.141592653589793},\"line_color\":{\"value\":\"#1f77b3\"},\"line_width\":{\"value\":2},\"x\":{\"value\":7.9},\"y\":{\"value\":0}},\"id\":\"1265\",\"type\":\"Ray\"},{\"attributes\":{\"tools\":[{\"id\":\"1238\"},{\"id\":\"1239\"},{\"id\":\"1240\"},{\"id\":\"1241\"},{\"id\":\"1242\"},{\"id\":\"1243\"}]},\"id\":\"1245\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1329\",\"type\":\"AllLabels\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#1f77b3\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1261\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1331\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"label\":{\"value\":\"2012\"},\"renderers\":[{\"id\":\"1286\"},{\"id\":\"1280\"}]},\"id\":\"1302\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1332\",\"type\":\"AllLabels\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b3\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1260\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1258\"}},\"id\":\"1263\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1258\"},\"glyph\":{\"id\":\"1259\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1261\"},\"nonselection_glyph\":{\"id\":\"1260\"},\"view\":{\"id\":\"1263\"}},\"id\":\"1262\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1333\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1334\",\"type\":\"Selection\"},{\"attributes\":{\"axis_label\":\"beak depth (mm)\",\"coordinates\":null,\"formatter\":{\"id\":\"1331\"},\"group\":null,\"major_label_policy\":{\"id\":\"1332\"},\"ticker\":{\"id\":\"1231\"}},\"id\":\"1230\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1238\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1228\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1224\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1335\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"angle\":{\"value\":3.141592653589793},\"line_color\":{\"value\":\"#ff7e0e\"},\"line_width\":{\"value\":2},\"x\":{\"value\":7.7},\"y\":{\"value\":0}},\"id\":\"1289\",\"type\":\"Ray\"},{\"attributes\":{},\"id\":\"1336\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1235\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1234\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1237\",\"type\":\"Grid\"},{\"attributes\":{\"fill_alpha\":0.2,\"fill_color\":\"#1f77b3\",\"hatch_alpha\":0.2,\"line_alpha\":0.2,\"line_color\":\"#1f77b4\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1255\",\"type\":\"Patch\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1325\",\"type\":\"Title\"},{\"attributes\":{\"axis\":{\"id\":\"1230\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1233\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1337\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1338\",\"type\":\"Selection\"},{\"attributes\":{\"click_policy\":\"hide\",\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"1301\"},{\"id\":\"1302\"}],\"location\":\"center\"},\"id\":\"1300\",\"type\":\"Legend\"},{\"attributes\":{\"angle\":{\"value\":3.141592653589793},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b3\"},\"line_width\":{\"value\":2},\"x\":{\"value\":7.9},\"y\":{\"value\":0}},\"id\":\"1266\",\"type\":\"Ray\"},{\"attributes\":{\"line_color\":\"#1f77b3\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1259\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1239\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1226\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1231\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1339\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"1975\"},\"renderers\":[{\"id\":\"1262\"},{\"id\":\"1256\"}]},\"id\":\"1301\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"1252\"}},\"id\":\"1257\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1340\",\"type\":\"Selection\"},{\"attributes\":{\"axis_label\":\"ECDF\",\"coordinates\":null,\"formatter\":{\"id\":\"1328\"},\"group\":null,\"major_label_policy\":{\"id\":\"1329\"},\"ticker\":{\"id\":\"1235\"}},\"id\":\"1234\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":0.1,\"fill_color\":\"#1f77b3\",\"hatch_alpha\":0.1,\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1254\",\"type\":\"Patch\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"mpmZmZmZH0CamZmZmZkfQJqZmZmZmR9AmpmZmZmZH0CamZmZmZkfQJqZmZmZmR9AAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAAAAAAAAAgQAAAAAAAACBAAAAAAAAAIEAzMzMzMzMgQDMzMzMzMyBAMzMzMzMzIEAzMzMzMzMgQGZmZmZmZiBAZmZmZmZmIEBmZmZmZmYgQGZmZmZmZiBAZmZmZmZmIEBmZmZmZmYgQGZmZmZmZiBAZmZmZmZmIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIECamZmZmZkgQJqZmZmZmSBAmpmZmZmZIECamZmZmZkgQJqZmZmZmSBAMzMzMzOzIEAzMzMzM7MgQDMzMzMzsyBAMzMzMzOzIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAzczMzMzMIEDNzMzMzMwgQM3MzMzMzCBAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAAAAAAAAAIUAAAAAAAAAhQAAAAAAAACFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQDMzMzMzMyFAMzMzMzMzIUAzMzMzMzMhQM3MzMzMTCFAzczMzMxMIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUBmZmZmZmYhQGZmZmZmZiFAZmZmZmZmIUAAAAAAAIAhQAAAAAAAgCFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUCamZmZmZkhQJqZmZmZmSFAmpmZmZmZIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQM3MzMzMzCFAzczMzMzMIUDNzMzMzMwhQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAAAAAiQAAAAAAAACJAAAAAAAAAIkAAAAAA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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[348]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[348]}},\"selected\":{\"id\":\"1334\"},\"selection_policy\":{\"id\":\"1333\"}},\"id\":\"1252\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"angle\":{\"value\":3.141592653589793},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b3\"},\"line_width\":{\"value\":2},\"x\":{\"value\":7.9},\"y\":{\"value\":0}},\"id\":\"1267\",\"type\":\"Ray\"},{\"attributes\":{},\"id\":\"1222\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1341\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1243\",\"type\":\"HelpTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1244\"}},\"id\":\"1240\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1342\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1241\",\"type\":\"SaveTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1252\"},\"glyph\":{\"id\":\"1253\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1255\"},\"nonselection_glyph\":{\"id\":\"1254\"},\"view\":{\"id\":\"1257\"}},\"id\":\"1256\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_color\":\"#ff7e0e\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1283\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1242\",\"type\":\"ResetTool\"}],\"root_ids\":[\"1221\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.2\"}};\n", " const render_items = [{\"docid\":\"7d887e3a-5184-4847-a916-076eed44bbe7\",\"root_ids\":[\"1221\"],\"roots\":{\"1221\":\"e45c075d-4a58-4025-8d23-8f29c428e6a1\"}}];\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", " 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": "1221" } }, "output_type": "display_data" } ], "source": [ "p = iqplot.ecdf(\n", " data=df,\n", " q='beak depth (mm)',\n", " cats='year',\n", " style='staircase',\n", " conf_int=True\n", ")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is some overlap in the confidence intervals, especially at the tails, probably because birds with extreme beak depths are rare, but the middle range of the ECDFs have less overlap." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusions\n", "\n", "We have seen that we can use random number generation to directly simulate doing an experiment over and over again to get confidence intervals of a wide variety of statistical values. Note that in all of this, we have never assumed a statistical model for and of our data. We never made assumptions about normality or anything else. This branch of statistical inference is called **nonparametric statistics**—there are no parameters; everything is computed directly from the data. This highlights the power of bootstrap methods; they are direct and avoid unnecessary assumptions.\n", "\n", "That said, there is much to be said for parametric statistics. That is a broad topic we will not cover in the bootcamp." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing environment" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python implementation: CPython\n", "Python version : 3.9.12\n", "IPython version : 8.3.0\n", "\n", "numpy : 1.21.5\n", "pandas : 1.4.2\n", "bokeh : 2.4.2\n", "iqplot : 0.2.4\n", "jupyterlab: 3.3.2\n", "\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p numpy,pandas,bokeh,iqplot,jupyterlab" ] } ], "metadata": { "anaconda-cloud": {}, "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.9.12" } }, "nbformat": 4, "nbformat_minor": 4 }