{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bootstrap Tutorial\n", "\n", "This notebook contains a tutorial on how to use the bootstrap functionality provided by estimagic. We start with the simplest possible example of calculating standard errors and confidence intervals for an OLS estimator without as well as with clustering. Then we progress to more advanced examples.\n", "\n", "In the example here, we will work with the \"exercise\" example dataset taken from the seaborn library.\n", "\n", "The working example will be a linear regression to investigate the effects of exercise time on pulse." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import estimagic as em\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "import statsmodels.api as sm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prepare the dataset" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", "
iddietpulsetimekindconstant
01low fat851rest1
11low fat8515rest1
21low fat8830rest1
32low fat901rest1
42low fat9215rest1
\n", "
" ], "text/plain": [ " id diet pulse time kind constant\n", "0 1 low fat 85 1 rest 1\n", "1 1 low fat 85 15 rest 1\n", "2 1 low fat 88 30 rest 1\n", "3 2 low fat 90 1 rest 1\n", "4 2 low fat 92 15 rest 1" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = sns.load_dataset(\"exercise\", index_col=0)\n", "replacements = {\"1 min\": 1, \"15 min\": 15, \"30 min\": 30}\n", "df = df.replace({\"time\": replacements})\n", "df[\"constant\"] = 1\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Doing a very simple bootstrap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first thing we need is a function that calculates the bootstrap outcome, given an empirical or re-sampled dataset. The bootstrap outcome is the quantity for which you want to calculate standard errors and confidence intervals. In most applications those are just parameter estimates.\n", "\n", "In our case, we want to regress \"pulse\" on \"time\" and a constant. Our outcome function looks as follows:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def ols_fit(data):\n", " y = data[\"pulse\"]\n", " x = data[[\"constant\", \"time\"]]\n", " params = sm.OLS(y, x).fit().params\n", "\n", " return params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In general, the user-specified outcome function may return any pytree (e.g. numpy.ndarray, pandas.DataFrame, dict etc.). In the example here, it returns a pandas.Series." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are ready to calculate confidence intervals and standard errors." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(constant 90.858983\n", " time 0.151361\n", " dtype: float64,\n", " constant 96.880057\n", " time 0.654426\n", " dtype: float64)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results_without_cluster = em.bootstrap(data=df, outcome=ols_fit)\n", "results_without_cluster.ci()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "constant 1.548116\n", "time 0.126410\n", "dtype: float64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results_without_cluster.se()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above function call represents the minimum that a user has to specify, making full use of the default options, such as drawing a 1_000 bootstrap draws, using the \"percentile\" bootstrap confidence interval, not making use of parallelization, etc.\n", "\n", "If, for example, we wanted to take 10_000 draws, while parallelizing on two cores, and using a \"bc\" type confidence interval, we would simply call the following:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(constant 91.309379\n", " time 0.192349\n", " dtype: float64,\n", " constant 96.286624\n", " time 0.607616\n", " dtype: float64)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results_without_cluster2 = em.bootstrap(\n", " data=df, outcome=ols_fit, n_draws=10_000, n_cores=2\n", ")\n", "\n", "results_without_cluster2.ci(ci_method=\"bc\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Doing a clustered bootstrap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the cluster robust variant of the bootstrap, the original dataset is divided into clusters according to the values of some user-specified variable, and then clusters are drawn uniformly with replacement in order to create the different bootstrap samples. \n", "\n", "In order to use the cluster robust boostrap, we simply specify which variable to cluster by. In the example we are working with, it seems sensible to cluster on individuals, i.e. on the column \"id\" of our dataset." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "constant 1.185239\n", "time 0.101723\n", "dtype: float64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results_with_cluster = em.bootstrap(data=df, outcome=ols_fit, cluster_by=\"id\")\n", "\n", "results_with_cluster.se()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the estimated standard errors are indeed of smaller magnitude when we use the cluster robust bootstrap. \n", "\n", "Finally, we can compare our bootstrap results to a regression on the full sample using statsmodels' OLS function.\n", "We see that the cluster robust bootstrap yields standard error estimates very close to the ones of the cluster robust regression, while the regular bootstrap seems to overestimate the standard errors of both coefficients.\n", "\n", "**Note**: We would not expect the asymptotic statsmodels standard errors to be exactly the same as the bootstrapped standard errors.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: pulse R-squared: 0.096\n", "Model: OLS Adj. R-squared: 0.086\n", "Method: Least Squares F-statistic: 13.75\n", "Date: Sat, 14 Jan 2023 Prob (F-statistic): 0.000879\n", "Time: 17:54:58 Log-Likelihood: -365.51\n", "No. Observations: 90 AIC: 735.0\n", "Df Residuals: 88 BIC: 740.0\n", "Df Model: 1 \n", "Covariance Type: cluster \n", "==============================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "constant 93.7611 1.205 77.837 0.000 91.400 96.122\n", "time 0.3873 0.104 3.708 0.000 0.183 0.592\n", "==============================================================================\n", "Omnibus: 20.828 Durbin-Watson: 0.827\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 26.313\n", "Skew: 1.173 Prob(JB): 1.93e-06\n", "Kurtosis: 4.231 Cond. No. 31.7\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors are robust to cluster correlation (cluster)\n" ] } ], "source": [ "y = df[\"pulse\"]\n", "x = df[[\"constant\", \"time\"]]\n", "\n", "\n", "cluster_robust_ols = sm.OLS(y, x).fit(cov_type=\"cluster\", cov_kwds={\"groups\": df[\"id\"]})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Splitting up the process" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In many situations, the above procedure is enough. However, sometimes it may be important to split the bootstrapping process up into smaller steps. Examples for such situations are:\n", "\n", "1. You want to look at the bootstrap estimates\n", "2. You want to do a bootstrap with a low number of draws first and add more draws later without duplicated calculations\n", "3. You have more bootstrap outcomes than just the parameters\n", "\n", "### 1. Accessing bootstrap outcomes\n", "\n", "The bootstrap outcomes are stored in the results object you get back when calling the bootstrap function. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[constant 93.732040\n", " time 0.580057\n", " dtype: float64,\n", " constant 92.909468\n", " time 0.309198\n", " dtype: float64,\n", " constant 94.257886\n", " time 0.428624\n", " dtype: float64,\n", " constant 93.872576\n", " time 0.410508\n", " dtype: float64,\n", " constant 92.076689\n", " time 0.542170\n", " dtype: float64]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = em.bootstrap(data=df, outcome=ols_fit, seed=1234)\n", "my_outcomes = result.outcomes\n", "\n", "my_outcomes[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To further compare the cluster bootstrap to the uniform bootstrap, let's plot the sampling distribution of the parameters on time. We can again see that the standard error is smaller when we cluster on the subject id. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "result_clustered = em.bootstrap(data=df, outcome=ols_fit, seed=1234, cluster_by=\"id\")\n", "my_outcomes_clustered = result_clustered.outcomes" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# clustered distribution in blue\n", "sns.histplot(\n", " pd.DataFrame(my_outcomes_clustered)[\"time\"], kde=True, stat=\"density\", linewidth=0\n", ")\n", "\n", "# non-clustered distribution in orange\n", "sns.histplot(\n", " pd.DataFrame(my_outcomes)[\"time\"],\n", " kde=True,\n", " stat=\"density\",\n", " linewidth=0,\n", " color=\"orange\",\n", ");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculating standard errors and confidence intervals from existing bootstrap result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you've already run ``bootstrap`` once, you can simply pass the existing result object to a new call of ``bootstrap``. Estimagic reuses the existing bootstrap outcomes and now only draws ``n_draws`` - ``n_existing`` outcomes instead of drawing entirely new ``n_draws``. Depending on the ``n_draws`` you specified (this is set to 1_000 by default), this may save considerable computation time. \n", "\n", "We can go on and compute confidence intervals and standard errors, just the same way as before, with several methods (e.g. \"percentile\" and \"bc\"), yet without duplicated evaluations of the bootstrap outcome function. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(constant 90.709236\n", " time 0.151193\n", " dtype: float64,\n", " constant 96.827145\n", " time 0.627507\n", " dtype: float64)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_results = em.bootstrap(\n", " data=df,\n", " outcome=ols_fit,\n", " existing_result=result,\n", ")\n", "my_results.ci(ci_method=\"t\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use this to calculate confidence intervals with several methods (e.g. \"percentile\" and \"bc\") without duplicated evaluations of the bootstrap outcome function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Extending bootstrap results with more draws\n", "\n", "It is often the case that, for speed reasons, you set the number of bootstrap draws quite low, so you can look at the results earlier and later decide that you need more draws. \n", "\n", "In the long run, we will offer a Dashboard integration for this. For now, you can do it manually.\n", "\n", "As an example, we will take an initial sample of 500 draws. We then extend it with another 1500 draws. \n", "\n", "*Note*: It is very important to use a different random seed when you calculate the additional outcomes!!!" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(constant 90.768859\n", " time 0.137692\n", " dtype: float64,\n", " constant 96.601067\n", " time 0.607616\n", " dtype: float64)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "initial_result = em.bootstrap(data=df, outcome=ols_fit, seed=5471, n_draws=500)\n", "initial_result.ci(ci_method=\"t\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(constant 90.689112\n", " time 0.128597\n", " dtype: float64,\n", " constant 96.696522\n", " time 0.622954\n", " dtype: float64)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combined_result = em.bootstrap(\n", " data=df, outcome=ols_fit, existing_result=initial_result, seed=2365, n_draws=2000\n", ")\n", "combined_result.ci(ci_method=\"t\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Using less draws than totally available bootstrap outcomes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You have a large sample of bootstrap outcomes but want to compute summary statistics only on a subset? No problem! Estimagic got you covered. You can simply pass any number of ``n_draws`` to your next call of ``bootstrap``, regardless of the size of the existing sample you want to use. We already covered the case where ``n_draws`` > ``n_existing`` above, in which case estimagic draws the remaining bootstrap outcomes for you.\n", "\n", "If ``n_draws`` <= ``n_existing``, estimagic takes a random subset of the existing outcomes - and voilà! " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(constant 90.619182\n", " time 0.130242\n", " dtype: float64,\n", " constant 96.557777\n", " time 0.625645\n", " dtype: float64)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "subset_result = em.bootstrap(\n", " data=df, outcome=ols_fit, existing_result=combined_result, seed=4632, n_draws=500\n", ")\n", "subset_result.ci(ci_method=\"t\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accessing the bootstrap samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also possible to just access the bootstrap samples. You may do so, for example, if you want to calculate your bootstrap outcomes in parallel in a way that is not yet supported by estimagic (e.g. on a large cluster or super-computer)." ] }, { "cell_type": "code", "execution_count": 16, "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", " \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", " \n", " \n", " \n", " \n", " \n", "
iddietpulsetimekindconstant
8830no fat11115running1
8730no fat991running1
8830no fat11115running1
3412low fat10315walking1
156no fat831rest1
.....................
7827no fat1001running1
7726no fat14330running1
8730no fat991running1
2910no fat10030rest1
7526no fat951running1
\n", "

90 rows × 6 columns

\n", "
" ], "text/plain": [ " id diet pulse time kind constant\n", "88 30 no fat 111 15 running 1\n", "87 30 no fat 99 1 running 1\n", "88 30 no fat 111 15 running 1\n", "34 12 low fat 103 15 walking 1\n", "15 6 no fat 83 1 rest 1\n", ".. .. ... ... ... ... ...\n", "78 27 no fat 100 1 running 1\n", "77 26 no fat 143 30 running 1\n", "87 30 no fat 99 1 running 1\n", "29 10 no fat 100 30 rest 1\n", "75 26 no fat 95 1 running 1\n", "\n", "[90 rows x 6 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from estimagic.inference import get_bootstrap_samples\n", "\n", "rng = np.random.default_rng(1234)\n", "my_samples = get_bootstrap_samples(data=df, rng=rng)\n", "my_samples[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "estimagic", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8 | packaged by conda-forge | (main, Nov 22 2022, 08:27:35) [Clang 14.0.6 ]" }, "vscode": { "interpreter": { "hash": "e8a16b1bdcc80285313db4674a5df2a5a80c75795379c5d9f174c7c712f05b3a" } } }, "nbformat": 4, "nbformat_minor": 4 }