{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Fish sleep and bacteria growth - A review of Statistical Thinking I and II\n", "> To begin, you'll use two data sets from Caltech researchers to rehash the key points of Statistical Thinking I and II to prepare you for the following case studies! This is the Summary of lecture \"Case Studies in Statistical Thinking\", via datacamp.\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- author: Chanseok Kang\n", "- categories: [Python, Datacamp, Statistics]\n", "- image: images/bs_rep_semilogy.png" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "plt.rcParams['figure.figsize'] = (10, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Case Studies in Statistical Thinking\n", "- Active bouts: a metric for wakefulness\n", " - Active bout: A period of time where a fish is consistently active\n", " - Active bout length: Number of consecutive minutes with activity\n", "- The exponential distribution\n", " - Poisson process: The timing of the next event is completely independent of when the previous event happened\n", " - Story of Exponential distribution: The waiting time between arrivals of a Poisson process is Exponentially distributed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### EDA: Plot ECDFs of active bout length\n", "An active bout is a stretch of time where a fish is constantly moving. Plot an ECDF of active bout length for the mutant and wild type fish for the seventh night of their lives. The data sets are in the numpy arrays `bout_lengths_wt` and `bout_lengths_mut`. The bout lengths are in units of minutes." ] }, { "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", "
genotypebout_lengthfish
0het12.001
1het33.001
2het0.961
3het4.981
4het1.981
\n", "
" ], "text/plain": [ " genotype bout_length fish\n", "0 het 12.00 1\n", "1 het 33.00 1\n", "2 het 0.96 1\n", "3 het 4.98 1\n", "4 het 1.98 1" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bout = pd.read_csv('./dataset/gandhi_et_al_bouts.csv', skiprows=4)\n", "bout.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "bout_lengths_mut = bout[bout['genotype'] == 'mut']['bout_length'].to_numpy()\n", "bout_lengths_wt = bout[bout['genotype'] == 'wt']['bout_length'].to_numpy()\n", "bout_lengths_het = bout[bout['genotype'] == 'het']['bout_length'].to_numpy()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import dc_stat_think as dcst\n", "\n", "# Generate x and y values for plotting ECDFs\n", "x_wt, y_wt = dcst.ecdf(bout_lengths_wt)\n", "x_mut, y_mut = dcst.ecdf(bout_lengths_mut)\n", "\n", "# Plot the ECDFs\n", "_ = plt.plot(x_wt, y_wt, marker='.', linestyle='none')\n", "_ = plt.plot(x_mut, y_mut, marker='.', linestyle='none')\n", "\n", "# Make a legend, label axes\n", "_ = plt.legend(('wt', 'mut'))\n", "_ = plt.xlabel('active bout length (min)')\n", "_ = plt.ylabel('ECDF')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Interpreting ECDFs and the story\n", "Q: While a more detailed analysis of distributions is often warranted for careful analyses, you can already get a feel for the distributions and the story behind the data by eyeballing the ECDFs. Which of the following would be the most reasonable statement to make about how the active bout lengths are distributed and what kind of process might be behind exiting the active bout to rest?\n", "\n", "A: The bout lengths appear Exponentially distributed, which implies that exiting an active bout to rest is a Poisson process; the fish have no apparent memory about when they became active." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bootstrap confidence intervals\n", "- EDA is the first step\n", "> \"Exploratory data analysis can never be the whole story, but nothing else can serve as a foundation stone - as the first step\". - John Tukey\n", "- Optimal parameter value\n", " - Optimal parameter value: The value of the parameter of a probability distribution that best describe the data\n", " - Optimal parameter for the Exponential disribution: Computed from the mean of the data\n", "- Bootstrap replicates\n", " - A statistic computed from a bootstrap sample\n", "- Bootstrap confidence interval\n", " - If we repeated measurements over and over again, p% of the observed values would lie within the p% confidence interval" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Parameter estimation: active bout length\n", "Compute the mean active bout length for wild type and mutant, with 95% bootstrap confidence interval. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "wt: mean = 3.874 min., conf. int. = [3.6, 4.1] min.\n", "mut: mean = 6.543 min., conf. int. = [6.1, 7.0] min.\n", "\n" ] } ], "source": [ "# Compute mean active bout length\n", "mean_wt = np.mean(bout_lengths_wt)\n", "mean_mut = np.mean(bout_lengths_mut)\n", "\n", "# Draw bootstrap replicates\n", "bs_reps_wt = dcst.draw_bs_reps(bout_lengths_wt, np.mean, size=10000)\n", "bs_reps_mut = dcst.draw_bs_reps(bout_lengths_mut, np.mean, size=10000)\n", "\n", "# Compute a 95% confidence interval\n", "conf_int_wt = np.percentile(bs_reps_wt, [2.5, 97.5])\n", "conf_int_mut = np.percentile(bs_reps_mut, [2.5, 97.5])\n", "\n", "# Print the results\n", "print(\"\"\"\n", "wt: mean = {0:.3f} min., conf. int. = [{1:.1f}, {2:.1f}] min.\n", "mut: mean = {3:.3f} min., conf. int. = [{4:.1f}, {5:.1f}] min.\n", "\"\"\".format(mean_wt, *conf_int_wt, mean_mut, *conf_int_mut))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Permutation and bootstrap hypothesis tests\n", "- Genotype definitions\n", " - Wile type: No mutations\n", " - Heterozygote: Mutation on one of two chromosomes\n", " - Mutant: Mutation on both chromosomes\n", "- Hypothesis test\n", " - Assessment of how reasonable the observed data are assuming a hypothesis is true\n", "- p-value\n", " - The probability of obtaining a value of your **test statistic** that is **at least as extreme as** what was observed, under the assumption the **null hypothesis** is true\n", " - Serves as a basis of comparison\n", " - Requires clear specification of:\n", " - **Null hypothesis** that can be simulated\n", " - **Test statistic** that can be calculated from observed and simulated data\n", " - Definition of **at least as extreme as**\n", "- Pipeline for hypothesis testing\n", " - Clearly state the null hypothesis\n", " - Define your test statistic\n", " - Generate many sets of simulated data assuming the null hypothesis is true\n", " - Compute the test statistic for each simulated data set\n", " - The p-value is the fraction of your simulated data sets for which the test statistic is at least as extreme as for the real data\n", "- Specifying the test\n", " - **Null hypothesis**: the active bout lengths of wild type and heterozygotic fish are identically distributed\n", " - **test statistic**: Difference in mean active bout length between heterozygotes and wile type\n", " - **At least as extreme as**: Test statistic is greater than or equal to what was observed\n", "- Permutation test\n", " - For eash replicate\n", " - Scramble labels of data points\n", " - Compute test statistic\n", " - p-value is fraction of replicates at least as extreme as what was observed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Permutation test: wild type versus heterozygote\n", "Test the hypothesis that the heterozygote and wild type bout lengths are identically distributed using a permutation test.\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p = 0.001\n" ] } ], "source": [ "# Compute the difference of means: diff_means_exp\n", "diff_means_exp = np.mean(bout_lengths_het) - np.mean(bout_lengths_wt)\n", "\n", "# Draw permutation replicates: perm_reps\n", "perm_reps = dcst.draw_perm_reps(bout_lengths_het, bout_lengths_wt, \n", " dcst.diff_of_means, size=10000)\n", "\n", "# Compute the p-value: p_val\n", "p_val = np.sum(perm_reps >= diff_means_exp) / len(perm_reps)\n", "\n", "# Print the result\n", "print('p = ', p_val)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A p-value of 0.001 suggests that the observed difference in means is unlikely to occur if heterozygotic and wild type fish have active bout lengths that are identically distributed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bootstrap hypothesis test\n", "The permutation test has a pretty restrictive hypothesis, that the heterozygotic and wild type bout lengths are identically distributed. Now, use a bootstrap hypothesis test to test the hypothesis that the means are equal, making no assumptions about the distributions.\n", "\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p-value = 0.0009\n" ] } ], "source": [ "# Concatenate arrays: bout_lengths_concat \n", "bout_lengths_concat = np.concatenate([bout_lengths_wt, bout_lengths_het])\n", "\n", "# Compute mean of all bout_lengths: mean_bout_length\n", "mean_bout_length = np.mean(bout_lengths_concat)\n", "\n", "# Generate shifted arrays\n", "wt_shifted = bout_lengths_wt - np.mean(bout_lengths_wt) + mean_bout_length\n", "het_shifted = bout_lengths_het - np.mean(bout_lengths_het) + mean_bout_length\n", "\n", "# Compute 10,000 bootstrap replicates from shifted array\n", "bs_reps_wt = dcst.draw_bs_reps(wt_shifted, np.mean, size=10000)\n", "bs_reps_het = dcst.draw_bs_reps(het_shifted, np.mean, size=10000)\n", "\n", "# Get replicates of difference of means: bs_replicates\n", "bs_reps = bs_reps_het - bs_reps_wt\n", "\n", "# Compute and print p-value: p\n", "p = np.sum(bs_reps >= diff_means_exp) / len(bs_reps)\n", "print('p-value =', p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get a result of similar magnitude as the permutation test, though slightly smaller, probably because the heterozygote bout length distribution has a heavier tail to the right." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear regressions and pairs bootstrap\n", "- Pairs bootstrap\n", " - resample data in pairs\n", " - Compute slope and intercept from resampled data\n", " - Each slope and intercept is a bootstrap replicate\n", " - Compute confidence intervals from percentiles of bootstrap replicates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Assessing the growth rate\n", "To compute the growth rate, you can do a linear regression of the logarithm of the total bacterial area versus time. Compute the growth rate and get a 95% confidence interval using pairs bootstrap. The time points, in units of hours, are stored in the numpy array `t` and the bacterial area, in units of square micrometers, is stored in `bac_area`." ] }, { "cell_type": "code", "execution_count": 8, "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", "
bacterial area (sq. microns)time (hr)
05.5747350.00
15.7120230.25
25.9033950.50
36.1946120.75
46.4567081.00
\n", "
" ], "text/plain": [ " bacterial area (sq. microns) time (hr)\n", "0 5.574735 0.00\n", "1 5.712023 0.25\n", "2 5.903395 0.50\n", "3 6.194612 0.75\n", "4 6.456708 1.00" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bac = pd.read_csv('./dataset/park_bacterial_growth.csv', skiprows=2)\n", "bac.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "bac_area = bac['bacterial area (sq. microns)'].to_numpy()\n", "t = bac['time (hr)'].to_numpy()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Growth rate: 0.2301 sq. µm/hour\n", "95% conf int: [0.2265, 0.2337] sq. µm/hour\n", "\n" ] } ], "source": [ "# Compute logarithm of the bacterial area: log_bac_area\n", "log_bac_area = np.log(bac_area)\n", "\n", "# Compute the slope and intercept: growth_rate, log_a0\n", "growth_rate, log_a0 = np.polyfit(t, log_bac_area, deg=1)\n", "\n", "# Draw 10,000 pairs bootstrap replicates: growth_rate_bs_reps, log_a0_bs_reps\n", "growth_rate_bs_reps, log_a0_bs_reps = dcst.draw_bs_pairs_linreg(t, log_bac_area, size=10000)\n", "\n", "# Compute confidence intervals: growth_rate_conf_int\n", "growth_rate_conf_int = np.percentile(growth_rate_bs_reps, [2.5, 97.5])\n", "\n", "# Print the result to the screen\n", "print(\"\"\"\n", "Growth rate: {0:.4f} sq. µm/hour\n", "95% conf int: [{1:.4f}, {2:.4f}] sq. µm/hour\n", "\"\"\".format(growth_rate, *growth_rate_conf_int))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Under these conditions, the bacteria add about 0.23 square micrometers worth of mass each hour. The error bar is very tight," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting the growth curve\n", "You saw in the previous exercise that the confidence interval on the growth curve is very tight. You will explore this graphically here by plotting several bootstrap lines along with the growth curve. You will use the `plt.semilogy()` function to make the plot with the y-axis on a log scale. This means that you will need to transform your theoretical linear regression curve for plotting by exponentiating it.\n", "\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot data points in a semilog-y plot with axis labeles\n", "_ = plt.semilogy(t, bac_area, marker='.', linestyle='none')\n", "\n", "# Generate x-values for the boostrap lines: t_bs\n", "t_bs = np.array([0, 14])\n", "\n", "# Plot the first 100 bootstrap lines\n", "for i in range(100):\n", " y = np.exp(growth_rate_bs_reps[i] * t_bs + log_a0_bs_reps[i])\n", " _ = plt.semilogy(t_bs, y, linewidth=0.5, alpha=0.05, color='red')\n", " \n", "# Label axes\n", "_ = plt.xlabel('time (hr)')\n", "_ = plt.ylabel('area (sq. µm)')\n", "plt.savefig('../images/bs_rep_semilogy.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see that the bootstrap replicates do not stray much. This is due to the exquisitly exponential nature of the bacterial growth under these experimental conditions." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }