diff --git a/notebooks/SciPy.ipynb b/notebooks/SciPy.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1ba4cc3fd3a1dee6864a99576391ad4b498d7252 --- /dev/null +++ b/notebooks/SciPy.ipynb @@ -0,0 +1,4337 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "8ccafd3d", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: scipy in /home/flaurent/.local/lib/python3.8/site-packages (1.7.1)\n", + "Requirement already satisfied: numpy<1.23.0,>=1.16.5 in /home/flaurent/.local/lib/python3.8/site-packages (from scipy) (1.21.1)\n" + ] + } + ], + "source": [ + "import sys\n", + "!\"{sys.executable}\" -m pip install scipy" + ] + }, + { + "cell_type": "markdown", + "id": "cf7e7b4c-6fbe-4b1c-81b7-6d5a851c2835", + "metadata": {}, + "source": [ + "<script src=\"https://polyfill.io/v3/polyfill.min.js?features=es6\"></script>\n", + "<script async src=\"https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js\"></script>" + ] + }, + { + "cell_type": "markdown", + "id": "6d2c6ebd", + "metadata": {}, + "source": [ + "<h1 align='center'>Statistical tests with the SciPy library</h1>\n", + "\n", + "<div style='text-align:center'><img src='https://docs.scipy.org/doc/scipy/reference/_static/scipyshiny_small.png' /></div>\n", + "\n", + "[SciPy](https://docs.scipy.org/doc/scipy/reference/) is a collection of mathematical tools aiming at diverse fields, with functionalities split in several modules:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "42342d74", + "metadata": {}, + "outputs": [], + "source": [ + "from scipy import (\n", + " cluster, # Clustering algorithms\n", + " constants, # Physical and mathematical constants\n", + " fftpack, # Fast Fourier Transform routines\n", + " integrate, # Integration and ordinary differential equation solvers\n", + " interpolate, # Interpolation and smoothing splines\n", + " io, # Input and Output\n", + " linalg, # Linear algebra\n", + " ndimage, # N-dimensional image processing\n", + " odr, # Orthogonal distance regression\n", + " optimize, # Optimization and root-finding routines\n", + " signal, # Signal processing\n", + " sparse, # Sparse matrices and associated routines\n", + " spatial, # Spatial data structures and algorithms\n", + " special, # Special functions\n", + " stats, # Statistical distributions and functions\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "1091dfd5", + "metadata": {}, + "source": [ + "Reminder about module loading:\n", + "\n", + "how to access the example function `ttest_ind` (Student t test for independent samples)?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "898957c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "skipping\n" + ] + } + ], + "source": [ + "%%script echo skipping\n", + "\n", + "import scipy.stats\n", + "scipy.stats.ttest_ind\n", + "\n", + "from scipy import stats\n", + "stats.ttest_ind\n", + "\n", + "from scipy.stats import *\n", + "ttest_ind" + ] + }, + { + "cell_type": "markdown", + "id": "9e2fe344", + "metadata": {}, + "source": [ + "`scipy.stats` content (see the [official documention](https://docs.scipy.org/doc/scipy/reference/reference/stats.html#module-scipy.stats)):\n", + "\n", + "* [Probability distributions](https://docs.scipy.org/doc/scipy/reference/reference/stats.html#probability-distributions)\n", + "* [Summary statistics](https://docs.scipy.org/doc/scipy/reference/reference/stats.html#summary-statistics)\n", + "* [Frequency statistics](https://docs.scipy.org/doc/scipy/reference/reference/stats.html#frequency-statistics)\n", + "* [Correlation functions](https://docs.scipy.org/doc/scipy/reference/reference/stats.html#correlation-functions)\n", + "* [Statistical tests](https://docs.scipy.org/doc/scipy/reference/reference/stats.html#statistical-tests)\n", + "* ...\n", + "\n", + "`scipy.stats` features basic functionalities and we will occasionally mention the <img src=\"img/statsmodels-logo-v2-horizontal.svg\" width=\"7%\" /> library as we will hit `scipy.stats` limitations." + ] + }, + { + "cell_type": "markdown", + "id": "91a5c5fe", + "metadata": { + "tags": [] + }, + "source": [ + "## Overview\n", + "\n", + "* We will merely review statistical tests\n", + " * Student $t$ tests\n", + " * compare a sample against the population mean\n", + " * compare two independent samples\n", + " * compare paired samples\n", + " * analyses of variance (one-way)\n", + " * compare more than two groups\n", + " * tests for other tests' assumptions\n", + " * normality/sphericity tests\n", + " * variance equality tests\n", + " * $\\chi^2$ tests for discrete variables\n", + " * goodness-of-fit test\n", + " * homogeneity and independence tests\n", + " \n", + "* Beforehands, we will have quick look at convenience functions for data exploration\n", + " * fitting a normal distribution\n", + " * kernel density estimation" + ] + }, + { + "cell_type": "markdown", + "id": "35bcd5a9-fd6f-4914-96a7-734d240efd8e", + "metadata": {}, + "source": [ + "## Workflows\n", + "\n", + "To find out whether an experimental condition (*treatment*) has an effect on a measurement, we collect *observations* for various groups that differ from one another in these experimental conditions, and we use a *statistical test* to determine whether there is *sufficient evidence* to conclude the treatment indeed has an effect.\n", + "\n", + "However, because experimental designs are often complex and involve multiple treatments, many studies also involve multiple tests, that are usually carried out after a so-called *omnibus* test.\n", + "\n", + "In addition, every statistical test makes various assumptions that in turn needs to be checked. As a consequence, every statistical analysis involves a series of tests and procedures.\n", + "\n", + "<table style=\"text-align:center\"><tr><th>Example worflow: </th></tr><tr><td><img src=\"img/example_anova_workflow.png\" width=\"70%\" /></td></tr></table>\n", + "\n", + "Contrary to statistical software with a GUI, the tools featured in programming languages such as Python do not offer much guidance in following such a workflow.\n", + "\n", + "<![CDATA[\n", + "# GraphViz source for https://sketchviz.com\n", + "\n", + "digraph G {\n", + "\n", + " graph [fontname = \"Handlee\"];\n", + " node [fontname = \"freesans\"];\n", + " edge [fontname = \"Handlee\"];\n", + "\n", + " bgcolor=transparent;\n", + "\n", + " subgraph cluster0 {\n", + " color=none;\n", + " n0 -> normality [label=\"yes\", constraint=false];\n", + " }\n", + "\n", + " subgraph cluster1 {\n", + " color=none;\n", + " node [style=filled];\n", + " anova; robust_f; nonparam;\n", + " }\n", + "\n", + " n0 -> nonparam [label=\"no\"];\n", + " normality -> H0_0;\n", + " H0_0 -> homoscedasticity [label=\"not rejected\"];\n", + " H0_0 -> transform [label=\"rejected\"];\n", + " transform -> homoscedasticity [label=\"success\"];\n", + " transform -> nonparam [label=\"failure\"];\n", + " homoscedasticity -> H0_1;\n", + " H0_1 -> anova [label=\"not rejected\"];\n", + " H0_1 -> robust_f [label=\"rejected\"];\n", + " H0_2 -> posthoc [label=\"rejected\"];\n", + " anova -> H0_2;\n", + " robust_f -> H0_2;\n", + " nonparam -> H0_2;\n", + "\n", + " n0 [shape=diamond, label=<n<SUB>i</SUB>≥8>];\n", + " normality [label=\"Normality test\"];\n", + " nonparam [label=\"Non-parametric\\nomnibus test;\\nK-W, Friedman\"];\n", + " H0_0 [shape=diamond, label=<H<SUB>0</SUB>>];\n", + " homoscedasticity [label=\"Homoscedasticity test\"];\n", + " transform [label=\"Data transform\"];\n", + " H0_1 [shape=diamond, label=<H<SUB>0</SUB>>];\n", + " anova [label=\"Standard ANOVA\"];\n", + " robust_f [label=\"Robust F test;\\nWelch, Yuen,\\nAlexander-Govern\"];\n", + " H0_2 [shape=diamond, label=<H<SUB>0</SUB>>];\n", + " posthoc [label=\"Post-hoc tests\"];\n", + "\n", + "}\n", + "]]>" + ] + }, + { + "cell_type": "markdown", + "id": "057c9475", + "metadata": {}, + "source": [ + "## Data exploration\n", + "\n", + "Let us first load some data:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "65104f3d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Age</th>\n", + " <th>OwnsHouse</th>\n", + " <th>PhysicalActivity</th>\n", + " <th>Sex</th>\n", + " <th>LivesWithPartner</th>\n", + " <th>LivesWithKids</th>\n", + " <th>BornInCity</th>\n", + " <th>Inbreeding</th>\n", + " <th>BMI</th>\n", + " <th>CMVPositiveSerology</th>\n", + " <th>FluIgG</th>\n", + " <th>MetabolicScore</th>\n", + " <th>LowAppetite</th>\n", + " <th>TroubleConcentrating</th>\n", + " <th>TroubleSleeping</th>\n", + " <th>HoursOfSleep</th>\n", + " <th>Listless</th>\n", + " <th>UsesCannabis</th>\n", + " <th>RecentPersonalCrisis</th>\n", + " <th>Smoking</th>\n", + " <th>Employed</th>\n", + " <th>Education</th>\n", + " <th>DustExposure</th>\n", + " <th>Income</th>\n", + " <th>HadMeasles</th>\n", + " <th>HadRubella</th>\n", + " <th>HadChickenPox</th>\n", + " <th>HadMumps</th>\n", + " <th>HadTonsillectomy</th>\n", + " <th>HadAppendicectomy</th>\n", + " <th>VaccineHepA</th>\n", + " <th>VaccineMMR</th>\n", + " <th>VaccineTyphoid</th>\n", + " <th>VaccineWhoopingCough</th>\n", + " <th>VaccineYellowFever</th>\n", + " <th>VaccineHepB</th>\n", + " <th>VaccineFlu</th>\n", + " <th>SUBJID</th>\n", + " <th>DepressionScore</th>\n", + " <th>HeartRate</th>\n", + " <th>Temperature</th>\n", + " <th>HourOfSampling</th>\n", + " <th>DayOfSampling</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>22.33</td>\n", + " <td>Yes</td>\n", + " <td>3.0</td>\n", + " <td>Female</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>94.9627</td>\n", + " <td>20.13</td>\n", + " <td>No</td>\n", + " <td>0.464319</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>9.00</td>\n", + " <td>3</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Never</td>\n", + " <td>No</td>\n", + " <td>PhD</td>\n", + " <td>No</td>\n", + " <td>(1000-2000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>2</td>\n", + " <td>0.0</td>\n", + " <td>66</td>\n", + " <td>36.8</td>\n", + " <td>8.883</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>28.83</td>\n", + " <td>Yes</td>\n", + " <td>0.0</td>\n", + " <td>Female</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>79.1024</td>\n", + " <td>21.33</td>\n", + " <td>Yes</td>\n", + " <td>-0.049817</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>7.05</td>\n", + " <td>3</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Active</td>\n", + " <td>Yes</td>\n", + " <td>Baccalaureat</td>\n", + " <td>No</td>\n", + " <td>(2000-3000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>3</td>\n", + " <td>0.0</td>\n", + " <td>66</td>\n", + " <td>37.4</td>\n", + " <td>9.350</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>23.67</td>\n", + " <td>Yes</td>\n", + " <td>0.0</td>\n", + " <td>Female</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>117.2540</td>\n", + " <td>22.18</td>\n", + " <td>No</td>\n", + " <td>0.332944</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>6.50</td>\n", + " <td>3</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>Active</td>\n", + " <td>Yes</td>\n", + " <td>Baccalaureat</td>\n", + " <td>Current</td>\n", + " <td>(2000-3000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>4</td>\n", + " <td>0.0</td>\n", + " <td>62</td>\n", + " <td>36.9</td>\n", + " <td>8.667</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>21.17</td>\n", + " <td>No</td>\n", + " <td>0.5</td>\n", + " <td>Female</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>94.1796</td>\n", + " <td>18.68</td>\n", + " <td>No</td>\n", + " <td>0.404886</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.0</td>\n", + " <td>10.00</td>\n", + " <td>3</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Never</td>\n", + " <td>No</td>\n", + " <td>PhD</td>\n", + " <td>No</td>\n", + " <td>(3000-inf]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>5</td>\n", + " <td>1.0</td>\n", + " <td>64</td>\n", + " <td>36.0</td>\n", + " <td>9.883</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>26.17</td>\n", + " <td>Yes</td>\n", + " <td>1.5</td>\n", + " <td>Female</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>105.1250</td>\n", + " <td>29.01</td>\n", + " <td>No</td>\n", + " <td>-0.303782</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>9.00</td>\n", + " <td>0</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Never</td>\n", + " <td>Yes</td>\n", + " <td>Baccalaureat</td>\n", + " <td>No</td>\n", + " <td>[0-1000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>8</td>\n", + " <td>0.0</td>\n", + " <td>67</td>\n", + " <td>36.7</td>\n", + " <td>8.550</td>\n", + " <td>81</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>812</th>\n", + " <td>21.42</td>\n", + " <td>Yes</td>\n", + " <td>6.0</td>\n", + " <td>Male</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>73.0073</td>\n", + " <td>24.75</td>\n", + " <td>No</td>\n", + " <td>0.210671</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>3.0</td>\n", + " <td>7.50</td>\n", + " <td>0</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Never</td>\n", + " <td>Yes</td>\n", + " <td>PhD</td>\n", + " <td>Current</td>\n", + " <td>(3000-inf]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>5167</td>\n", + " <td>0.0</td>\n", + " <td>44</td>\n", + " <td>36.6</td>\n", + " <td>8.550</td>\n", + " <td>270</td>\n", + " </tr>\n", + " <tr>\n", + " <th>813</th>\n", + " <td>38.33</td>\n", + " <td>No</td>\n", + " <td>1.5</td>\n", + " <td>Female</td>\n", + " <td>Yes</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>79.7187</td>\n", + " <td>23.53</td>\n", + " <td>No</td>\n", + " <td>0.354790</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.0</td>\n", + " <td>9.00</td>\n", + " <td>0</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Ex</td>\n", + " <td>Yes</td>\n", + " <td>Baccalaureat</td>\n", + " <td>No</td>\n", + " <td>(3000-inf]</td>\n", + " <td>Yes</td>\n", + " <td>Yes</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>5219</td>\n", + " <td>0.0</td>\n", + " <td>54</td>\n", + " <td>36.7</td>\n", + " <td>9.217</td>\n", + " <td>229</td>\n", + " </tr>\n", + " <tr>\n", + " <th>814</th>\n", + " <td>32.75</td>\n", + " <td>Yes</td>\n", + " <td>2.5</td>\n", + " <td>Female</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>86.6744</td>\n", + " <td>20.07</td>\n", + " <td>No</td>\n", + " <td>0.252037</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>8.00</td>\n", + " <td>3</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Never</td>\n", + " <td>No</td>\n", + " <td>Baccalaureat</td>\n", + " <td>No</td>\n", + " <td>(1000-2000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>5279</td>\n", + " <td>3.0</td>\n", + " <td>62</td>\n", + " <td>36.3</td>\n", + " <td>9.800</td>\n", + " <td>278</td>\n", + " </tr>\n", + " <tr>\n", + " <th>815</th>\n", + " <td>39.17</td>\n", + " <td>No</td>\n", + " <td>4.0</td>\n", + " <td>Male</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Yes</td>\n", + " <td>98.9744</td>\n", + " <td>22.77</td>\n", + " <td>Yes</td>\n", + " <td>0.264940</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.0</td>\n", + " <td>7.50</td>\n", + " <td>0</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Never</td>\n", + " <td>Yes</td>\n", + " <td>PhD</td>\n", + " <td>No</td>\n", + " <td>(2000-3000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>5303</td>\n", + " <td>0.0</td>\n", + " <td>39</td>\n", + " <td>36.3</td>\n", + " <td>9.583</td>\n", + " <td>277</td>\n", + " </tr>\n", + " <tr>\n", + " <th>816</th>\n", + " <td>59.00</td>\n", + " <td>No</td>\n", + " <td>0.0</td>\n", + " <td>Male</td>\n", + " <td>Yes</td>\n", + " <td>Yes</td>\n", + " <td>Yes</td>\n", + " <td>84.6433</td>\n", + " <td>27.39</td>\n", + " <td>Yes</td>\n", + " <td>0.281522</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0.0</td>\n", + " <td>8.00</td>\n", + " <td>0</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Never</td>\n", + " <td>No</td>\n", + " <td>Baccalaureat</td>\n", + " <td>No</td>\n", + " <td>(2000-3000]</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>No</td>\n", + " <td>5701</td>\n", + " <td>0.0</td>\n", + " <td>61</td>\n", + " <td>36.1</td>\n", + " <td>9.317</td>\n", + " <td>241</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>816 rows × 43 columns</p>\n", + "</div>" + ], + "text/plain": [ + " Age OwnsHouse PhysicalActivity Sex LivesWithPartner LivesWithKids \\\n", + "1 22.33 Yes 3.0 Female No No \n", + "2 28.83 Yes 0.0 Female Yes No \n", + "3 23.67 Yes 0.0 Female Yes No \n", + "4 21.17 No 0.5 Female No No \n", + "5 26.17 Yes 1.5 Female No No \n", + ".. ... ... ... ... ... ... \n", + "812 21.42 Yes 6.0 Male No No \n", + "813 38.33 No 1.5 Female Yes Yes \n", + "814 32.75 Yes 2.5 Female No No \n", + "815 39.17 No 4.0 Male No Yes \n", + "816 59.00 No 0.0 Male Yes Yes \n", + "\n", + " BornInCity Inbreeding BMI CMVPositiveSerology FluIgG \\\n", + "1 Yes 94.9627 20.13 No 0.464319 \n", + "2 Yes 79.1024 21.33 Yes -0.049817 \n", + "3 Yes 117.2540 22.18 No 0.332944 \n", + "4 No 94.1796 18.68 No 0.404886 \n", + "5 Yes 105.1250 29.01 No -0.303782 \n", + ".. ... ... ... ... ... \n", + "812 Yes 73.0073 24.75 No 0.210671 \n", + "813 No 79.7187 23.53 No 0.354790 \n", + "814 No 86.6744 20.07 No 0.252037 \n", + "815 Yes 98.9744 22.77 Yes 0.264940 \n", + "816 Yes 84.6433 27.39 Yes 0.281522 \n", + "\n", + " MetabolicScore LowAppetite TroubleConcentrating TroubleSleeping \\\n", + "1 0 0 0 1.0 \n", + "2 1 0 0 1.0 \n", + "3 2 0 0 1.0 \n", + "4 0 0 0 2.0 \n", + "5 1 0 0 1.0 \n", + ".. ... ... ... ... \n", + "812 0 0 0 3.0 \n", + "813 1 0 0 2.0 \n", + "814 0 0 0 1.0 \n", + "815 0 0 0 2.0 \n", + "816 1 0 0 0.0 \n", + "\n", + " HoursOfSleep Listless UsesCannabis RecentPersonalCrisis Smoking \\\n", + "1 9.00 3 No No Never \n", + "2 7.05 3 No No Active \n", + "3 6.50 3 Yes No Active \n", + "4 10.00 3 No No Never \n", + "5 9.00 0 No No Never \n", + ".. ... ... ... ... ... \n", + "812 7.50 0 No No Never \n", + "813 9.00 0 No Yes Ex \n", + "814 8.00 3 No Yes Never \n", + "815 7.50 0 No No Never \n", + "816 8.00 0 No No Never \n", + "\n", + " Employed Education DustExposure Income HadMeasles HadRubella \\\n", + "1 No PhD No (1000-2000] No No \n", + "2 Yes Baccalaureat No (2000-3000] No No \n", + "3 Yes Baccalaureat Current (2000-3000] No No \n", + "4 No PhD No (3000-inf] No No \n", + "5 Yes Baccalaureat No [0-1000] No No \n", + ".. ... ... ... ... ... ... \n", + "812 Yes PhD Current (3000-inf] No No \n", + "813 Yes Baccalaureat No (3000-inf] Yes Yes \n", + "814 No Baccalaureat No (1000-2000] No No \n", + "815 Yes PhD No (2000-3000] No No \n", + "816 No Baccalaureat No (2000-3000] No No \n", + "\n", + " HadChickenPox HadMumps HadTonsillectomy HadAppendicectomy VaccineHepA \\\n", + "1 Yes No No No No \n", + "2 Yes No No No No \n", + "3 Yes No No No No \n", + "4 Yes No No No No \n", + "5 No No No No No \n", + ".. ... ... ... ... ... \n", + "812 Yes No No No No \n", + "813 Yes No No No No \n", + "814 No Yes No No No \n", + "815 No Yes No No No \n", + "816 No No Yes No No \n", + "\n", + " VaccineMMR VaccineTyphoid VaccineWhoopingCough VaccineYellowFever \\\n", + "1 No No Yes No \n", + "2 No No Yes No \n", + "3 No No No No \n", + "4 No No No No \n", + "5 No No Yes No \n", + ".. ... ... ... ... \n", + "812 No No No No \n", + "813 No No No No \n", + "814 No No No No \n", + "815 Yes No No No \n", + "816 No No No No \n", + "\n", + " VaccineHepB VaccineFlu SUBJID DepressionScore HeartRate Temperature \\\n", + "1 Yes No 2 0.0 66 36.8 \n", + "2 Yes No 3 0.0 66 37.4 \n", + "3 Yes No 4 0.0 62 36.9 \n", + "4 Yes No 5 1.0 64 36.0 \n", + "5 Yes No 8 0.0 67 36.7 \n", + ".. ... ... ... ... ... ... \n", + "812 Yes No 5167 0.0 44 36.6 \n", + "813 Yes No 5219 0.0 54 36.7 \n", + "814 Yes No 5279 3.0 62 36.3 \n", + "815 No No 5303 0.0 39 36.3 \n", + "816 No No 5701 0.0 61 36.1 \n", + "\n", + " HourOfSampling DayOfSampling \n", + "1 8.883 40 \n", + "2 9.350 40 \n", + "3 8.667 40 \n", + "4 9.883 40 \n", + "5 8.550 81 \n", + ".. ... ... \n", + "812 8.550 270 \n", + "813 9.217 229 \n", + "814 9.800 278 \n", + "815 9.583 277 \n", + "816 9.317 241 \n", + "\n", + "[816 rows x 43 columns]" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "pd.options.display.max_columns = None\n", + "\n", + "dataframe = pd.read_csv('../data/mi.csv', index_col=0)\n", + "dataframe" + ] + }, + { + "cell_type": "markdown", + "id": "066f85d9", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "source": [ + "<div class=\"alert alert-block alert-info\">\n", + "[TODO] dataset curation to be moved to the practical session\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "911d3a75", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'OwnsHouse': ['No', 'Yes'],\n", + " 'Sex': ['Female', 'Male'],\n", + " 'LivesWithPartner': ['No', 'Yes'],\n", + " 'LivesWithKids': ['No', 'Yes'],\n", + " 'BornInCity': ['No', 'Yes'],\n", + " 'CMVPositiveSerology': ['No', 'Yes'],\n", + " 'UsesCannabis': ['No', 'Yes'],\n", + " 'RecentPersonalCrisis': ['No', 'Yes'],\n", + " 'Smoking': ['Active', 'Ex', 'Never'],\n", + " 'Employed': ['No', 'Yes'],\n", + " 'Education': ['Baccalaureat', 'Bachelor', 'PhD', 'UpToPrimary', 'Vocational'],\n", + " 'DustExposure': ['Current', 'No', 'Past'],\n", + " 'Income': ['(1000-2000]', '(2000-3000]', '(3000-inf]', '[0-1000]'],\n", + " 'HadMeasles': ['No', 'Yes'],\n", + " 'HadRubella': ['No', 'Yes'],\n", + " 'HadChickenPox': ['No', 'Yes'],\n", + " 'HadMumps': ['No', 'Yes'],\n", + " 'HadTonsillectomy': ['No', 'Yes'],\n", + " 'HadAppendicectomy': ['No', 'Yes'],\n", + " 'VaccineHepA': ['No', 'Yes'],\n", + " 'VaccineMMR': ['No', 'Yes'],\n", + " 'VaccineTyphoid': ['No', 'Yes'],\n", + " 'VaccineWhoopingCough': ['No', 'Yes'],\n", + " 'VaccineYellowFever': ['No', 'Yes'],\n", + " 'VaccineHepB': ['No', 'Yes'],\n", + " 'VaccineFlu': ['No', 'Yes']}" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{ col: list(np.unique(dataframe[col])) for col in dataframe.columns if dataframe.dtypes[col].hasobject }" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "d49b3a46", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Age</th>\n", + " <th>OwnsHouse</th>\n", + " <th>PhysicalActivity</th>\n", + " <th>Sex</th>\n", + " <th>LivesWithPartner</th>\n", + " <th>LivesWithKids</th>\n", + " <th>BornInCity</th>\n", + " <th>Inbreeding</th>\n", + " <th>BMI</th>\n", + " <th>CMVPositiveSerology</th>\n", + " <th>FluIgG</th>\n", + " <th>MetabolicScore</th>\n", + " <th>LowAppetite</th>\n", + " <th>TroubleConcentrating</th>\n", + " <th>TroubleSleeping</th>\n", + " <th>HoursOfSleep</th>\n", + " <th>Listless</th>\n", + " <th>UsesCannabis</th>\n", + " <th>RecentPersonalCrisis</th>\n", + " <th>Smoking</th>\n", + " <th>Employed</th>\n", + " <th>Education</th>\n", + " <th>DustExposure</th>\n", + " <th>Income</th>\n", + " <th>HadMeasles</th>\n", + " <th>HadRubella</th>\n", + " <th>HadChickenPox</th>\n", + " <th>HadMumps</th>\n", + " <th>HadTonsillectomy</th>\n", + " <th>HadAppendicectomy</th>\n", + " <th>VaccineHepA</th>\n", + " <th>VaccineMMR</th>\n", + " <th>VaccineTyphoid</th>\n", + " <th>VaccineWhoopingCough</th>\n", + " <th>VaccineYellowFever</th>\n", + " <th>VaccineHepB</th>\n", + " <th>VaccineFlu</th>\n", + " <th>SUBJID</th>\n", + " <th>DepressionScore</th>\n", + " <th>HeartRate</th>\n", + " <th>Temperature</th>\n", + " <th>HourOfSampling</th>\n", + " <th>DayOfSampling</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>22.33</td>\n", + " <td>1</td>\n", + " <td>3.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>94.9627</td>\n", + " <td>20.13</td>\n", + " <td>0</td>\n", + " <td>0.464319</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>9.00</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>4</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>0.0</td>\n", + " <td>66</td>\n", + " <td>36.8</td>\n", + " <td>8.883</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>28.83</td>\n", + " <td>1</td>\n", + " <td>0.0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>79.1024</td>\n", + " <td>21.33</td>\n", + " <td>1</td>\n", + " <td>-0.049817</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>7.05</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>3</td>\n", + " <td>0.0</td>\n", + " <td>66</td>\n", + " <td>37.4</td>\n", + " <td>9.350</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>23.67</td>\n", + " <td>1</td>\n", + " <td>0.0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>117.2540</td>\n", + " <td>22.18</td>\n", + " <td>0</td>\n", + " <td>0.332944</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>6.50</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>4</td>\n", + " <td>0.0</td>\n", + " <td>62</td>\n", + " <td>36.9</td>\n", + " <td>8.667</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>21.17</td>\n", + " <td>0</td>\n", + " <td>0.5</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>94.1796</td>\n", + " <td>18.68</td>\n", + " <td>0</td>\n", + " <td>0.404886</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.0</td>\n", + " <td>10.00</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>4</td>\n", + " <td>0</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>5</td>\n", + " <td>1.0</td>\n", + " <td>64</td>\n", + " <td>36.0</td>\n", + " <td>9.883</td>\n", + " <td>40</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>26.17</td>\n", + " <td>1</td>\n", + " <td>1.5</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>105.1250</td>\n", + " <td>29.01</td>\n", + " <td>0</td>\n", + " <td>-0.303782</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>9.00</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>8</td>\n", + " <td>0.0</td>\n", + " <td>67</td>\n", + " <td>36.7</td>\n", + " <td>8.550</td>\n", + " <td>81</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>812</th>\n", + " <td>21.42</td>\n", + " <td>1</td>\n", + " <td>6.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>73.0073</td>\n", + " <td>24.75</td>\n", + " <td>0</td>\n", + " <td>0.210671</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>3.0</td>\n", + " <td>7.50</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>4</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>5167</td>\n", + " <td>0.0</td>\n", + " <td>44</td>\n", + " <td>36.6</td>\n", + " <td>8.550</td>\n", + " <td>270</td>\n", + " </tr>\n", + " <tr>\n", + " <th>813</th>\n", + " <td>38.33</td>\n", + " <td>0</td>\n", + " <td>1.5</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>79.7187</td>\n", + " <td>23.53</td>\n", + " <td>0</td>\n", + " <td>0.354790</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.0</td>\n", + " <td>9.00</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>5219</td>\n", + " <td>0.0</td>\n", + " <td>54</td>\n", + " <td>36.7</td>\n", + " <td>9.217</td>\n", + " <td>229</td>\n", + " </tr>\n", + " <tr>\n", + " <th>814</th>\n", + " <td>32.75</td>\n", + " <td>1</td>\n", + " <td>2.5</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>86.6744</td>\n", + " <td>20.07</td>\n", + " <td>0</td>\n", + " <td>0.252037</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.0</td>\n", + " <td>8.00</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>5279</td>\n", + " <td>3.0</td>\n", + " <td>62</td>\n", + " <td>36.3</td>\n", + " <td>9.800</td>\n", + " <td>278</td>\n", + " </tr>\n", + " <tr>\n", + " <th>815</th>\n", + " <td>39.17</td>\n", + " <td>0</td>\n", + " <td>4.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>98.9744</td>\n", + " <td>22.77</td>\n", + " <td>1</td>\n", + " <td>0.264940</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2.0</td>\n", + " <td>7.50</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>4</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>5303</td>\n", + " <td>0.0</td>\n", + " <td>39</td>\n", + " <td>36.3</td>\n", + " <td>9.583</td>\n", + " <td>277</td>\n", + " </tr>\n", + " <tr>\n", + " <th>816</th>\n", + " <td>59.00</td>\n", + " <td>0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>84.6433</td>\n", + " <td>27.39</td>\n", + " <td>1</td>\n", + " <td>0.281522</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0.0</td>\n", + " <td>8.00</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>5701</td>\n", + " <td>0.0</td>\n", + " <td>61</td>\n", + " <td>36.1</td>\n", + " <td>9.317</td>\n", + " <td>241</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>816 rows × 43 columns</p>\n", + "</div>" + ], + "text/plain": [ + " Age OwnsHouse PhysicalActivity Sex LivesWithPartner LivesWithKids \\\n", + "1 22.33 1 3.0 1 0 0 \n", + "2 28.83 1 0.0 1 1 0 \n", + "3 23.67 1 0.0 1 1 0 \n", + "4 21.17 0 0.5 1 0 0 \n", + "5 26.17 1 1.5 1 0 0 \n", + ".. ... ... ... ... ... ... \n", + "812 21.42 1 6.0 0 0 0 \n", + "813 38.33 0 1.5 1 1 1 \n", + "814 32.75 1 2.5 1 0 0 \n", + "815 39.17 0 4.0 0 0 1 \n", + "816 59.00 0 0.0 0 1 1 \n", + "\n", + " BornInCity Inbreeding BMI CMVPositiveSerology FluIgG \\\n", + "1 1 94.9627 20.13 0 0.464319 \n", + "2 1 79.1024 21.33 1 -0.049817 \n", + "3 1 117.2540 22.18 0 0.332944 \n", + "4 0 94.1796 18.68 0 0.404886 \n", + "5 1 105.1250 29.01 0 -0.303782 \n", + ".. ... ... ... ... ... \n", + "812 1 73.0073 24.75 0 0.210671 \n", + "813 0 79.7187 23.53 0 0.354790 \n", + "814 0 86.6744 20.07 0 0.252037 \n", + "815 1 98.9744 22.77 1 0.264940 \n", + "816 1 84.6433 27.39 1 0.281522 \n", + "\n", + " MetabolicScore LowAppetite TroubleConcentrating TroubleSleeping \\\n", + "1 0 0 0 1.0 \n", + "2 1 0 0 1.0 \n", + "3 2 0 0 1.0 \n", + "4 0 0 0 2.0 \n", + "5 1 0 0 1.0 \n", + ".. ... ... ... ... \n", + "812 0 0 0 3.0 \n", + "813 1 0 0 2.0 \n", + "814 0 0 0 1.0 \n", + "815 0 0 0 2.0 \n", + "816 1 0 0 0.0 \n", + "\n", + " HoursOfSleep Listless UsesCannabis RecentPersonalCrisis Smoking \\\n", + "1 9.00 3 0 0 0 \n", + "2 7.05 3 0 0 2 \n", + "3 6.50 3 1 0 2 \n", + "4 10.00 3 0 0 0 \n", + "5 9.00 0 0 0 0 \n", + ".. ... ... ... ... ... \n", + "812 7.50 0 0 0 0 \n", + "813 9.00 0 0 1 1 \n", + "814 8.00 3 0 1 0 \n", + "815 7.50 0 0 0 0 \n", + "816 8.00 0 0 0 0 \n", + "\n", + " Employed Education DustExposure Income HadMeasles HadRubella \\\n", + "1 0 4 0 1 0 0 \n", + "2 1 2 0 2 0 0 \n", + "3 1 2 2 2 0 0 \n", + "4 0 4 0 3 0 0 \n", + "5 1 2 0 0 0 0 \n", + ".. ... ... ... ... ... ... \n", + "812 1 4 2 3 0 0 \n", + "813 1 2 0 3 1 1 \n", + "814 0 2 0 1 0 0 \n", + "815 1 4 0 2 0 0 \n", + "816 0 2 0 2 0 0 \n", + "\n", + " HadChickenPox HadMumps HadTonsillectomy HadAppendicectomy \\\n", + "1 1 0 0 0 \n", + "2 1 0 0 0 \n", + "3 1 0 0 0 \n", + "4 1 0 0 0 \n", + "5 0 0 0 0 \n", + ".. ... ... ... ... \n", + "812 1 0 0 0 \n", + "813 1 0 0 0 \n", + "814 0 1 0 0 \n", + "815 0 1 0 0 \n", + "816 0 0 1 0 \n", + "\n", + " VaccineHepA VaccineMMR VaccineTyphoid VaccineWhoopingCough \\\n", + "1 0 0 0 1 \n", + "2 0 0 0 1 \n", + "3 0 0 0 0 \n", + "4 0 0 0 0 \n", + "5 0 0 0 1 \n", + ".. ... ... ... ... \n", + "812 0 0 0 0 \n", + "813 0 0 0 0 \n", + "814 0 0 0 0 \n", + "815 0 1 0 0 \n", + "816 0 0 0 0 \n", + "\n", + " VaccineYellowFever VaccineHepB VaccineFlu SUBJID DepressionScore \\\n", + "1 0 1 0 2 0.0 \n", + "2 0 1 0 3 0.0 \n", + "3 0 1 0 4 0.0 \n", + "4 0 1 0 5 1.0 \n", + "5 0 1 0 8 0.0 \n", + ".. ... ... ... ... ... \n", + "812 0 1 0 5167 0.0 \n", + "813 0 1 0 5219 0.0 \n", + "814 0 1 0 5279 3.0 \n", + "815 0 0 0 5303 0.0 \n", + "816 0 0 0 5701 0.0 \n", + "\n", + " HeartRate Temperature HourOfSampling DayOfSampling \n", + "1 66 36.8 8.883 40 \n", + "2 66 37.4 9.350 40 \n", + "3 62 36.9 8.667 40 \n", + "4 64 36.0 9.883 40 \n", + "5 67 36.7 8.550 81 \n", + ".. ... ... ... ... \n", + "812 44 36.6 8.550 270 \n", + "813 54 36.7 9.217 229 \n", + "814 62 36.3 9.800 278 \n", + "815 39 36.3 9.583 277 \n", + "816 61 36.1 9.317 241 \n", + "\n", + "[816 rows x 43 columns]" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataframe = dataframe.applymap(lambda x: {\n", + " 'No': 0, 'Yes': 1, # OwnsHouse, LivesWithPartner, LivesWithKids, BornInCity, CMVPositiveSerology, UsesCannabis, RecentPersonalCrisis, Employed, DustExposure, HadMeasles, HadRubella, HadChickenPox, HadMumps, HadTonsillectomy, HadAppendicectomy, VaccineHepA, VaccineMMR, VaccineTyphoid, VaccineWhoopingCough, VaccineHepB, VaccineFlu\n", + " 'Female': 1, 'Male': 0, # Sex\n", + " 'Active': 2, 'Ex': 1, 'Never': 0, # Smoking\n", + " 'Baccalaureat': 2, 'Bachelor': 3, 'PhD': 4, 'UpToPrimary': 1, 'Vocational': 0, # Education\n", + " 'Current': 2, 'Past': 1, # DustExposure\n", + " '(1000-2000]': 1, '(2000-3000]': 2, '(3000-inf]': 3, '[0-1000]': 0, # Income\n", + "}.get(x, x))\n", + "dataframe" + ] + }, + { + "cell_type": "markdown", + "id": "ae8b5f34", + "metadata": {}, + "source": [ + "### Summary statistics\n", + "\n", + "<div class=\"alert alert-block alert-success\">\n", + "The most important datum in a dataset is the sample size $n$. Here $n=816$.\n", + "</div>\n", + "\n", + "A first exploration step consists of calling the `describe` method, that gives a collection of different summary statistics for each variable, depending on whether the variable is numerical or not:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cb2f29e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Age</th>\n", + " <th>OwnsHouse</th>\n", + " <th>PhysicalActivity</th>\n", + " <th>Sex</th>\n", + " <th>LivesWithPartner</th>\n", + " <th>LivesWithKids</th>\n", + " <th>BornInCity</th>\n", + " <th>Inbreeding</th>\n", + " <th>BMI</th>\n", + " <th>CMVPositiveSerology</th>\n", + " <th>FluIgG</th>\n", + " <th>MetabolicScore</th>\n", + " <th>LowAppetite</th>\n", + " <th>TroubleConcentrating</th>\n", + " <th>TroubleSleeping</th>\n", + " <th>HoursOfSleep</th>\n", + " <th>Listless</th>\n", + " <th>UsesCannabis</th>\n", + " <th>RecentPersonalCrisis</th>\n", + " <th>Smoking</th>\n", + " <th>Employed</th>\n", + " <th>Education</th>\n", + " <th>DustExposure</th>\n", + " <th>Income</th>\n", + " <th>HadMeasles</th>\n", + " <th>HadRubella</th>\n", + " <th>HadChickenPox</th>\n", + " <th>HadMumps</th>\n", + " <th>HadTonsillectomy</th>\n", + " <th>HadAppendicectomy</th>\n", + " <th>VaccineHepA</th>\n", + " <th>VaccineMMR</th>\n", + " <th>VaccineTyphoid</th>\n", + " <th>VaccineWhoopingCough</th>\n", + " <th>VaccineYellowFever</th>\n", + " <th>VaccineHepB</th>\n", + " <th>VaccineFlu</th>\n", + " <th>SUBJID</th>\n", + " <th>DepressionScore</th>\n", + " <th>HeartRate</th>\n", + " <th>Temperature</th>\n", + " <th>HourOfSampling</th>\n", + " <th>DayOfSampling</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " <td>816.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>mean</th>\n", + " <td>46.485711</td>\n", + " <td>0.352941</td>\n", + " <td>2.751804</td>\n", + " <td>0.511029</td>\n", + " <td>0.613971</td>\n", + " <td>0.438725</td>\n", + " <td>0.531863</td>\n", + " <td>91.904255</td>\n", + " <td>24.208958</td>\n", + " <td>0.354167</td>\n", + " <td>0.203601</td>\n", + " <td>0.932598</td>\n", + " <td>0.512255</td>\n", + " <td>0.355392</td>\n", + " <td>1.119771</td>\n", + " <td>7.499246</td>\n", + " <td>1.290441</td>\n", + " <td>0.057598</td>\n", + " <td>0.289216</td>\n", + " <td>0.667892</td>\n", + " <td>0.515931</td>\n", + " <td>1.680147</td>\n", + " <td>0.339461</td>\n", + " <td>1.693627</td>\n", + " <td>0.382353</td>\n", + " <td>0.093137</td>\n", + " <td>0.639706</td>\n", + " <td>0.283088</td>\n", + " <td>0.080882</td>\n", + " <td>0.230392</td>\n", + " <td>0.044118</td>\n", + " <td>0.207108</td>\n", + " <td>0.050245</td>\n", + " <td>0.245098</td>\n", + " <td>0.083333</td>\n", + " <td>0.493873</td>\n", + " <td>0.197304</td>\n", + " <td>576.877451</td>\n", + " <td>0.544526</td>\n", + " <td>59.209559</td>\n", + " <td>36.431985</td>\n", + " <td>9.214806</td>\n", + " <td>185.485294</td>\n", + " </tr>\n", + " <tr>\n", + " <th>std</th>\n", + " <td>13.854402</td>\n", + " <td>0.478178</td>\n", + " <td>3.565008</td>\n", + " <td>0.500185</td>\n", + " <td>0.487136</td>\n", + " <td>0.496536</td>\n", + " <td>0.499290</td>\n", + " <td>12.936172</td>\n", + " <td>3.181184</td>\n", + " <td>0.478553</td>\n", + " <td>0.232411</td>\n", + " <td>0.893942</td>\n", + " <td>1.674008</td>\n", + " <td>1.408535</td>\n", + " <td>0.931400</td>\n", + " <td>1.017186</td>\n", + " <td>2.055716</td>\n", + " <td>0.233125</td>\n", + " <td>0.453676</td>\n", + " <td>0.785606</td>\n", + " <td>0.500053</td>\n", + " <td>1.455060</td>\n", + " <td>0.625598</td>\n", + " <td>1.003923</td>\n", + " <td>0.486260</td>\n", + " <td>0.290803</td>\n", + " <td>0.480380</td>\n", + " <td>0.450775</td>\n", + " <td>0.272822</td>\n", + " <td>0.421342</td>\n", + " <td>0.205482</td>\n", + " <td>0.405482</td>\n", + " <td>0.218584</td>\n", + " <td>0.430409</td>\n", + " <td>0.276555</td>\n", + " <td>0.500269</td>\n", + " <td>0.398208</td>\n", + " <td>518.489935</td>\n", + " <td>1.333918</td>\n", + " <td>9.206104</td>\n", + " <td>0.318461</td>\n", + " <td>0.378376</td>\n", + " <td>84.971737</td>\n", + " </tr>\n", + " <tr>\n", + " <th>min</th>\n", + " <td>20.170000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>43.727000</td>\n", + " <td>18.500000</td>\n", + " <td>0.000000</td>\n", + " <td>-0.430491</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>3.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>2.000000</td>\n", + " <td>0.000000</td>\n", + " <td>37.000000</td>\n", + " <td>35.700000</td>\n", + " <td>8.433000</td>\n", + " <td>17.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25%</th>\n", + " <td>35.830000</td>\n", + " <td>0.000000</td>\n", + " <td>0.500000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>84.077225</td>\n", + " <td>21.770000</td>\n", + " <td>0.000000</td>\n", + " <td>0.065082</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>7.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>300.750000</td>\n", + " <td>0.000000</td>\n", + " <td>54.000000</td>\n", + " <td>36.200000</td>\n", + " <td>8.917000</td>\n", + " <td>136.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>50%</th>\n", + " <td>47.710000</td>\n", + " <td>0.000000</td>\n", + " <td>2.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>91.862800</td>\n", + " <td>23.850000</td>\n", + " <td>0.000000</td>\n", + " <td>0.227855</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>7.500000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>2.000000</td>\n", + " <td>0.000000</td>\n", + " <td>2.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>556.500000</td>\n", + " <td>0.000000</td>\n", + " <td>58.000000</td>\n", + " <td>36.400000</td>\n", + " <td>9.233000</td>\n", + " <td>187.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>75%</th>\n", + " <td>58.352500</td>\n", + " <td>1.000000</td>\n", + " <td>4.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>100.008000</td>\n", + " <td>26.210000</td>\n", + " <td>1.000000</td>\n", + " <td>0.363819</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>2.000000</td>\n", + " <td>8.000000</td>\n", + " <td>3.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>3.000000</td>\n", + " <td>1.000000</td>\n", + " <td>3.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>779.250000</td>\n", + " <td>1.000000</td>\n", + " <td>65.000000</td>\n", + " <td>36.600000</td>\n", + " <td>9.550000</td>\n", + " <td>263.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>max</th>\n", + " <td>69.750000</td>\n", + " <td>1.000000</td>\n", + " <td>49.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>150.107000</td>\n", + " <td>32.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.769841</td>\n", + " <td>4.000000</td>\n", + " <td>14.000000</td>\n", + " <td>14.000000</td>\n", + " <td>3.000000</td>\n", + " <td>12.000000</td>\n", + " <td>14.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>2.000000</td>\n", + " <td>1.000000</td>\n", + " <td>4.000000</td>\n", + " <td>2.000000</td>\n", + " <td>3.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>5701.000000</td>\n", + " <td>14.000000</td>\n", + " <td>100.000000</td>\n", + " <td>37.700000</td>\n", + " <td>11.217000</td>\n", + " <td>335.000000</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Age OwnsHouse PhysicalActivity Sex LivesWithPartner \\\n", + "count 816.000000 816.000000 816.000000 816.000000 816.000000 \n", + "mean 46.485711 0.352941 2.751804 0.511029 0.613971 \n", + "std 13.854402 0.478178 3.565008 0.500185 0.487136 \n", + "min 20.170000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 35.830000 0.000000 0.500000 0.000000 0.000000 \n", + "50% 47.710000 0.000000 2.000000 1.000000 1.000000 \n", + "75% 58.352500 1.000000 4.000000 1.000000 1.000000 \n", + "max 69.750000 1.000000 49.000000 1.000000 1.000000 \n", + "\n", + " LivesWithKids BornInCity Inbreeding BMI CMVPositiveSerology \\\n", + "count 816.000000 816.000000 816.000000 816.000000 816.000000 \n", + "mean 0.438725 0.531863 91.904255 24.208958 0.354167 \n", + "std 0.496536 0.499290 12.936172 3.181184 0.478553 \n", + "min 0.000000 0.000000 43.727000 18.500000 0.000000 \n", + "25% 0.000000 0.000000 84.077225 21.770000 0.000000 \n", + "50% 0.000000 1.000000 91.862800 23.850000 0.000000 \n", + "75% 1.000000 1.000000 100.008000 26.210000 1.000000 \n", + "max 1.000000 1.000000 150.107000 32.000000 1.000000 \n", + "\n", + " FluIgG MetabolicScore LowAppetite TroubleConcentrating \\\n", + "count 816.000000 816.000000 816.000000 816.000000 \n", + "mean 0.203601 0.932598 0.512255 0.355392 \n", + "std 0.232411 0.893942 1.674008 1.408535 \n", + "min -0.430491 0.000000 0.000000 0.000000 \n", + "25% 0.065082 0.000000 0.000000 0.000000 \n", + "50% 0.227855 1.000000 0.000000 0.000000 \n", + "75% 0.363819 1.000000 0.000000 0.000000 \n", + "max 0.769841 4.000000 14.000000 14.000000 \n", + "\n", + " TroubleSleeping HoursOfSleep Listless UsesCannabis \\\n", + "count 816.000000 816.000000 816.000000 816.000000 \n", + "mean 1.119771 7.499246 1.290441 0.057598 \n", + "std 0.931400 1.017186 2.055716 0.233125 \n", + "min 0.000000 3.000000 0.000000 0.000000 \n", + "25% 0.000000 7.000000 0.000000 0.000000 \n", + "50% 1.000000 7.500000 0.000000 0.000000 \n", + "75% 2.000000 8.000000 3.000000 0.000000 \n", + "max 3.000000 12.000000 14.000000 1.000000 \n", + "\n", + " RecentPersonalCrisis Smoking Employed Education DustExposure \\\n", + "count 816.000000 816.000000 816.000000 816.000000 816.000000 \n", + "mean 0.289216 0.667892 0.515931 1.680147 0.339461 \n", + "std 0.453676 0.785606 0.500053 1.455060 0.625598 \n", + "min 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 0.000000 0.000000 1.000000 2.000000 0.000000 \n", + "75% 1.000000 1.000000 1.000000 3.000000 1.000000 \n", + "max 1.000000 2.000000 1.000000 4.000000 2.000000 \n", + "\n", + " Income HadMeasles HadRubella HadChickenPox HadMumps \\\n", + "count 816.000000 816.000000 816.000000 816.000000 816.000000 \n", + "mean 1.693627 0.382353 0.093137 0.639706 0.283088 \n", + "std 1.003923 0.486260 0.290803 0.480380 0.450775 \n", + "min 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 1.000000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 2.000000 0.000000 0.000000 1.000000 0.000000 \n", + "75% 3.000000 1.000000 0.000000 1.000000 1.000000 \n", + "max 3.000000 1.000000 1.000000 1.000000 1.000000 \n", + "\n", + " HadTonsillectomy HadAppendicectomy VaccineHepA VaccineMMR \\\n", + "count 816.000000 816.000000 816.000000 816.000000 \n", + "mean 0.080882 0.230392 0.044118 0.207108 \n", + "std 0.272822 0.421342 0.205482 0.405482 \n", + "min 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 0.000000 0.000000 \n", + "50% 0.000000 0.000000 0.000000 0.000000 \n", + "75% 0.000000 0.000000 0.000000 0.000000 \n", + "max 1.000000 1.000000 1.000000 1.000000 \n", + "\n", + " VaccineTyphoid VaccineWhoopingCough VaccineYellowFever VaccineHepB \\\n", + "count 816.000000 816.000000 816.000000 816.000000 \n", + "mean 0.050245 0.245098 0.083333 0.493873 \n", + "std 0.218584 0.430409 0.276555 0.500269 \n", + "min 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 0.000000 0.000000 \n", + "50% 0.000000 0.000000 0.000000 0.000000 \n", + "75% 0.000000 0.000000 0.000000 1.000000 \n", + "max 1.000000 1.000000 1.000000 1.000000 \n", + "\n", + " VaccineFlu SUBJID DepressionScore HeartRate Temperature \\\n", + "count 816.000000 816.000000 816.000000 816.000000 816.000000 \n", + "mean 0.197304 576.877451 0.544526 59.209559 36.431985 \n", + "std 0.398208 518.489935 1.333918 9.206104 0.318461 \n", + "min 0.000000 2.000000 0.000000 37.000000 35.700000 \n", + "25% 0.000000 300.750000 0.000000 54.000000 36.200000 \n", + "50% 0.000000 556.500000 0.000000 58.000000 36.400000 \n", + "75% 0.000000 779.250000 1.000000 65.000000 36.600000 \n", + "max 1.000000 5701.000000 14.000000 100.000000 37.700000 \n", + "\n", + " HourOfSampling DayOfSampling \n", + "count 816.000000 816.000000 \n", + "mean 9.214806 185.485294 \n", + "std 0.378376 84.971737 \n", + "min 8.433000 17.000000 \n", + "25% 8.917000 136.000000 \n", + "50% 9.233000 187.000000 \n", + "75% 9.550000 263.000000 \n", + "max 11.217000 335.000000 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataframe.describe()" + ] + }, + { + "cell_type": "markdown", + "id": "4c483874-e9db-440a-b1c8-7dd47a06008a", + "metadata": {}, + "source": [ + "An important feature of each variable is the number of *modes*.\n", + "Indeed, the notions of central tendency (=average/mean) and variability make sense for a single mode only." + ] + }, + { + "cell_type": "markdown", + "id": "5287cb1c", + "metadata": {}, + "source": [ + "### Rug plots and histograms\n", + "\n", + "A second step consists of visualizing the data, on a per-column basis:" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "id": "72a790bd", + "metadata": {}, + "outputs": [], + "source": [ + "X = 'HoursOfSleep' # variable\n", + "\n", + "x = dataframe[X] # measurements" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "id": "d6ab1d43", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "plt.hist(x, zorder=0, fill=False) # histogram\n", + "#plt.scatter(x, np.full_like(x, 8), c='g', marker='+', s=50) # rug plot\n", + "sns.rugplot(x, color='g')\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('counts');" + ] + }, + { + "cell_type": "markdown", + "id": "994df34d", + "metadata": {}, + "source": [ + "### Fitting a normal distribution\n", + "\n", + "If $X$ follows a normal distribution:\n", + "\n", + "$X \\sim \\mathcal{N}(\\mu, \\sigma^2)$\n", + "\n", + "then we can use the **empirical mean** and **unbiased variance** as estimators for $\\mu$ and $\\sigma^2$ respectively.\n", + "\n", + "`scipy.stats` exposes the `norm` function to define a normal distribution:" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "92b00d5d", + "metadata": {}, + "outputs": [], + "source": [ + "normal_distribution = stats.norm(x.mean(), x.var())" + ] + }, + { + "cell_type": "markdown", + "id": "5eefc50c-44fa-403b-92c6-16aec1204d26", + "metadata": {}, + "source": [ + "If unsure about how to fit the distribution parameters to the data, you can alternatively use `fit`:" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "4f114ad2-9cd2-431a-8b3e-2283006ef970", + "metadata": {}, + "outputs": [], + "source": [ + "normal_distribution = stats.norm(*stats.norm.fit(x))" + ] + }, + { + "cell_type": "markdown", + "id": "cef7bb4e-38b9-4abc-97e4-419a9650173b", + "metadata": {}, + "source": [ + "The object returned by `norm` features several distribution-related functions, *e.g.* `pdf`:" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "id": "8e114e17-8edb-4674-9309-c6f566885c0a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(x, zorder=0, fill=False, density=True) # histogram\n", + "#plt.scatter(x, np.full_like(x, .01), c='g', marker='+', s=50) # rug plot\n", + "sns.rugplot(x, color='g')\n", + "\n", + "grid = np.linspace(x.min(), x.max(), 100)\n", + "plt.plot(grid, normal_distribution.pdf(grid), 'r-')\n", + "\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('density');" + ] + }, + { + "cell_type": "markdown", + "id": "014a24bf", + "metadata": {}, + "source": [ + "Note the `density=True` argument to the `hist` function, and how we drew the normal distribution." + ] + }, + { + "cell_type": "markdown", + "id": "66d073f3", + "metadata": {}, + "source": [ + "### Kernel density estimation\n", + "\n", + "What if the variable does not look normally distributed?" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "id": "b74ba778", + "metadata": {}, + "outputs": [], + "source": [ + "X = 'BMI'\n", + "x = dataframe[X]" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "id": "321fd8e8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(x, zorder=0, fill=False) # histogram\n", + "#plt.scatter(x, np.full_like(x, 15), c='g', marker='+', s=50) # rug plot\n", + "sns.rugplot(x, color='g')\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('counts');" + ] + }, + { + "cell_type": "markdown", + "id": "eb19a4a8", + "metadata": {}, + "source": [ + "We can estimate the density function using kernel density estimation:\n", + "\n", + "$$X \\sim \\frac{1}{nh}\\sum_{i=0}^{n-1} \\mathcal{N}(x_i, h^2)$$\n", + "\n", + "$h$ is called the bandwidth and is automatically adjusted using the Scott's rule of thumb.\n", + "\n", + "See https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#kernel-density-estimation for more information." + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "id": "f0aa3b59", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "\n", + "plt.hist(x, zorder=0, fill=False, density=True) # histogram\n", + "#plt.scatter(x, np.full_like(x, .01), c='g', marker='+', s=50) # rug plot\n", + "sns.rugplot(x, color='g')\n", + "\n", + "sns.kdeplot(x, clip=(x.min(), x.max()), color='r', linestyle='-')\n", + "\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('density');" + ] + }, + { + "cell_type": "markdown", + "id": "6939b4b3-2998-4371-8ce5-a4407f70eb80", + "metadata": {}, + "source": [ + "Illustration of the kernels using a smaller sample:" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "489561ac-b89b-4214-873a-4c0828a9a264", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import random\n", + "\n", + "subsample = x.loc[random.sample(range(len(x)), 50)]\n", + "\n", + "kde = stats.gaussian_kde(subsample)\n", + "bandwidth = kde.factor # TODO: check `factor` is indeed the bandwidth\n", + "\n", + "plt.hist(subsample, zorder=0, fill=False, density=True) # histogram\n", + "plt.scatter(subsample, np.full_like(subsample, .01), c='g', marker='+', s=50) # rug plot\n", + "\n", + "grid = np.linspace(subsample.min(), subsample.max(), 100)\n", + "plt.plot(grid, kde(grid), 'r-')\n", + "\n", + "scale = .03\n", + "\n", + "for obs in subsample:\n", + " kernel = stats.norm(obs, bandwidth)\n", + " plt.plot(grid, scale * kernel.pdf(grid), 'r-', alpha=.2)\n", + "\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('density');" + ] + }, + { + "cell_type": "markdown", + "id": "06c4e1a9", + "metadata": { + "tags": [] + }, + "source": [ + "`seaborn.kdeplot` is based on `scipy.stats.gaussian_kde`. The equivalent code is:" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "id": "c9dd1ab3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(x, zorder=0, fill=False, density=True) # histogram\n", + "#plt.scatter(x, np.full_like(x, .01), c='g', marker='+', s=50) # rug plot\n", + "sns.rugplot(x, color='g')\n", + "\n", + "grid = np.linspace(x.min(), x.max(), 100)\n", + "kde = stats.gaussian_kde(x)\n", + "plt.plot(grid, kde(grid), 'r-')\n", + "\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('density');" + ] + }, + { + "cell_type": "markdown", + "id": "b373a0e7", + "metadata": {}, + "source": [ + "Coming back to our first variable..:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6eaa04b5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAArNElEQVR4nO3de5xVdb3/8deH4SIXBZMR5DqgICKiKF7T8JqYCppWllKSHfP8vHSz0ixTT6dTWZ08R09lllpe0CwTEcVL4TWJQZCrwIAMMwgKKIjcL5/fH9+9Yc8wlz0za+01M+v9fDz2Y81ea+21PrNnZn/mezd3R0RE0qtN0gGIiEiylAhERFJOiUBEJOWUCEREUk6JQEQk5domHUBDde/e3UtKSpIOQ0SkRZkxY8Yady+u6ViLSwQlJSWUlpYmHYaISItiZuW1HVPVkIhIyikRiIiknBKBiEjKKRGIiKScEoGISMopEYiIpJwSgYhIyikRiIiknBKBSHMwdy7svz+MHw+VlUlHIymjRCDSHNx5J2zaBA8/DGPGJB2NpIwSgUjSNmyABx+Ez38e/vM/YeZMqKhIOipJESUCkaQ9/DB89BFcdRWMHh32TZmSbEySKkoEIkl7+GEYNgyOPx6GDoXeveGZZ5KOSlJEiUAkSbt2wYwZMGoUmIXH6NHw/POwY0fS0UlKKBGIJGnJktBGMGLEnn1nnw3r18O0acnFJamiRCCSpJkzwzY3EZxyStjOmFH4eCSVlAhEkjRzJrRrB4cfvmdfjx7QrRu89VZiYUm6xJoIzGy0mS00szIzu6GG45eb2Wozm5V5fCXOeESanZkzQxLo0GHPPjMYMgQWLEguLkmV2BKBmRUBdwHnAEOBz5vZ0BpOfcTdj8o87okrHpFmxx3eeKNqtVDWkCEqEUjBxFkiOA4oc/el7r4NmACMjfF+Ii3LO+/A6tU1J4LDDoNVq2DduoKHJekTZyLoDeQOj6zM7KvuIjObbWaPmVnfGOMRaV5mzw7bo47a+9iQIWG7cGHBwpH0Srqx+EmgxN2HA88B99d0kpldaWalZla6evXqggYoEpslS8J20KC9j2UTgaqHpADiTAQrgNz/8Ptk9u3m7mvdfWvm6T3AMTVdyN3vdveR7j6yuLg4lmBFCm7JEujcOfQSqm7AgNCbSA3GUgBxJoLpwCAzG2Bm7YFLgIm5J5jZQTlPxwD6rZf0WLIEBg4MvYSqa9cODjlEJQIpiLZxXdjdd5jZNcAUoAj4g7vPM7PbgFJ3nwhcZ2ZjgB3A+8DlccUj0uwsXRo+7GszZAjMn1+4eCS1YksEAO4+GZhcbd/NOV/fCNwYZwwizZJ7SARnn137OQMHwtNPh3NrKjWIRCTpxmKRdFq5EjZvhoMPrv2cvn1hyxZYs6ZwcUkqKRGIJGHp0rAdOLD2c/r1C1stUiMxUyIQSUK262h9JQKA5cvjj0dSTYlAJAlLl0KbNtC/f+3nqEQgBaJEIJKEJUvCf/zt29d+TnFxmIxOJQKJmRKBSBKWLq27fQBCT6G+fZUIJHZKBCJJqKiou1ooq18/VQ1J7JQIRApt587QfbRPn/rPVYlACkCJQKTQ3n03JIPeNU3GW02/fiFpbN8ef1ySWkoEIoVWWRm2+ZQI+vWDXbvC2gUiMVEiECm0bCLIp0SQHUugdgKJkRKBSKGtyMzGnm+JANROILFSIhAptMrKMH6ge/f6z82WGlasqPs8kSZQIhAptBUrwgd8PjOK7rsvdOoUGoxFYqJEIFJolZX5tQ9ASBYHHaREILGKdT0CkTQpKSmhvLy83vMWAaXAF/JcY+AlYOeSJZw2YUKt5/Tv359ly5bldT2R6lQiEIlIeXk57l73Y9cuBu2zD5+//vr6z808TvnMZzh18OA6z8knAYnURolApJA++CAsNpNv1RCoakhip0QgUkgNGUyW1bMnbNgAGzfGE5OknhKByJYtcMstMHw4xF3P3pDBZFkHHRS2q1ZFH48ISgQiMHo03HorzJ8P3/1uvPdqyGCyrGwiUPWQxESJQNJt4UJ48UX48Y/h+9+HRx+F116L736VlaFLaM+e+b9GiUBipkQg6faXv4TtuHHw7W+HD90f/zi++61YEZJAu3b5v0aJQGKmRCDp9uc/w4knhqqazp3hwgth6tT4pn2urGxYtRDAAQdA27ZKBBIbJQJJr7IymDULLr54z77TTw+9c0pL47lndnqJhmjTJpQilAgkJkoEkl7PPBO2F164Z9+pp4bt3/8ezz0bUyIAjSWQWCkRSHq98QYUF0NJyZ59BxwARx4ZTyLYuBHWrWt4iQCUCCRWSgSSXrNmwYgRe88Cevrp8OqrYXxBlBrTdTRLVUMSIyUCSadt22DuXDjqqL2PnXYabN0K06dHe8/GDCbL6tkT1q6FHTuijUkEJQJJq/nzQ8+gESP2Pnb00WE7e3a092xKiaBHD3CH1aujjUmEmBOBmY02s4VmVmZmN9Rx3kVm5mY2Ms54RHabNStsa0oEvXrBxz4WfSJoSomgR4+wfffd6OIRyYgtEZhZEXAXcA4wFPi8mQ2t4bx9ga8B0+KKRWQvM2eGlb8OOWTvY2ahwfjNN6O954oVsP/+4b4NpUQgMYqzRHAcUObuS919GzABGFvDef8B/BSIuGVOpA4zZ4YP+6Kimo8PHw5z5sCuXdHds7FdR2HPlBSaeE5iEGci6A1U5DyvzOzbzcyOBvq6+1MxxiFSlXv4kD/yyNrPGT4cNm2CpUuju29jBpNlqUQgMUqssdjM2gC/BL6Vx7lXmlmpmZWuVmOZNNXataE//6GH1n7O8OFhG2X1UFNKBF26QMeOSgQSizgTwQqgb87zPpl9WfsCw4CpZrYMOAGYWFODsbvf7e4j3X1kcXFxjCFLKpSVhW1N7QNZhx8epnaIqsF4+/bwId7YEoFZKBUoEUgM4kwE04FBZjbAzNoDlwATswfdfb27d3f3EncvAV4Hxrh7TJO8iGTkkwg6doTBg6MrEaxcGaqkGlsiACUCiU1sicDddwDXAFOABcCj7j7PzG4zszFx3VekXmVl4T/sAQPqPm/oUHjrrWju2ZSuo1lKBBKTtnFe3N0nA5Or7bu5lnNPjTMWkd3KyqBfP+jQoe7zBg+GJ58Mo3nbNvFPpSmDybJ69IDXX29aHCI10MhiSZ+ysrqrhbIGDw51++XlTb9nYxatr65HD1izBnbubHo8IjmUCCR98k0EgwaF7aJFTb/nihWh3aFbt8Zfo2fPMK5hzZqmxyOSQ4lA0uWDD0L30XxLBACLFzf9vtmuo9VnOm2I7FgCDSqTiCkRSLosWRK2+SSC4mLo2jW6EkFTGopBg8okNkoEki75dB3NMgvVQ1EkgqYMJstSIpCYKBFIumRLBAMH5nf+4MFNrxratQveeUclAmm2lAgkXZYvD1U++c4AOnhw6DXUlNXK1qwJC+E0tUSw336hy6sSgURMiUDSpbw8jCHI16BBYURwtiTRGFEMJgNNMyGxUSKQdFm+HPr3z//8KHoORTGYLEuJQGKgRCDp4R4SQUNLBNC0BuOoSgSgRCCxUCKQ9Hj/fdi4sWElgq5d4cADm5YIli+Hdu32LC7TFD17KhFI5JQIJD2WLw/bhpQIoOk9hyoqQmmgTQR/bj16hAXsNc2EREiJQNIjO2dQQ0oEEBJBU0sEDU0+tenRIySBtWujuZ4ISgSSJo0tEQwaFKZ1+PDDxt23ogL69q3/vHxoLIHEQIlA0qO8PEz81r17w16X7TmUHZXcEDt3hsbiKEsEoEQgkVIikPTIVtE0dOK3bCJoTPXQu++G9QxUIpBmTIlA0qO8vOHtAwAHHxy2jUkE2eooJQJpxpQIJD0aOpgsq2PHUJJoTM+hioqwjapqqFs3aN9eiUAipUQg6bB1a/jwbOx/5oMHw8KFDX9d1CUCTTMhMVAikHTITvPQlESweHEYndwQFRXQpUvTViarTolAIqZEIOnQ1DWDBw+Gdesavkzk8uUh+TRlZbLqlAgkYkoEkg5RJAJoeINxlGMIsnr00HKVEiklAkmHbKNtYyd+a2wiyJYIotSjB7z3XljwRiQCSgSSDpWVYQK5ffdt3Ov79w8TxzUkEXz0UfjAznc1tHxlp5l4//1oryuppUQg6VBZ2bT/zNu2DeMJGtJzaOnSsM2OQ4iKxhJIxJQIJB2iWDy+oZPPZVc1UyKQZi6vRGBm55uZkoa0XFEkgkMPDfMN5TsFdFwlguy6BkoEEpF8P9w/Byw2s5+Z2ZA4AxKJ3LZt4UMzihLB1q17Gp7rs2RJGD+w//5Nu291KhFIxPJKBO5+GTACWALcZ2b/NLMrzayRLW8iBfTOO2EgWBSJAPJvJ1iyJPrSAITE0q6dEoFEJu/qHnf/EHgMmAAcBFwIvGFm18YUm0g0mjqGIGtIpjC8YEF+58eVCMzC8plKBBKRfNsIxprZ48BUoB1wnLufAxwJfKuO1402s4VmVmZmN9Rw/Cozm2Nms8zsFTMb2rhvQ6QOUSWCAw+E4mKYO7f+c3fsCLOdxpEIQKOLJVJt8zzv08B/u/tLuTvdfZOZXVHTC8ysCLgLOAuoBKab2UR3n59z2kPu/pvM+WOAXwKjG/g9iNQtmwiiGNg1bBjMm1f/eRUVIRnEmQg0ulgikm8iWFU9CZjZT939u+7+Qi2vOQ4oc/elmfMnAGOB3YkgU92U1Rlo4IxeInsrKSmhPLs+MfAr4MvAfl27NvnadwDjgf3qmzsorq6jWT16wOzZ8VxbUiffNoKzath3Tj2v6Q3kdq+ozOyrwsyuNrMlwM+A6/KMR6RW5eXluPvux9cuvJB9Dzusyr7GPq77zW/YF/Bly/Y6VkUhEsF77zV8NlSRGtSZCMzs381sDjDEzGbnPN4GIvl3xN3vcveDge8C368ljivNrNTMSlevXh3FbSVNmjqqONewYWFbXzvB/PnQuXPj5zaqT8+esH07fPBBPNeXVKmvRPAQcD7wRGabfRyT6VJalxVA7l9fn8y+2kwALqjpgLvf7e4j3X1kcXFxPbcVqSbKGUAPPzxs60sEs2fDEUdAm5jGYWosgUSovt9Sd/dlwNXAhpwHZvaxel47HRhkZgPMrD1wCTAx9wQzG5Tz9FygEWsBitQhqsFkWd26hWvVlQjcQyIYPjyae9ZEiUAiVF9j8UPAecAMQkNubguZA7VOq+juO8zsGmAKUAT8wd3nmdltQKm7TwSuMbMzge3AB8CXGv2diNQkO5gsyqmghw2DOXNqP75yZZgZ9IgjortndUoEEqE6E4G7n5fZDmjMxd19MjC52r6bc77+WmOuK5K37HQQUSaCESPg+edh8+awsH112d48KhFIC5HvgLKPm1nnzNeXmdkvzaxfvKGJRCCbCKKqGgI48cQwRqC0tObj2UQQZ4ngYx8LU2NrLIFEIN+WrF8Dm8wsO5J4CfCn2KISiUocJYITTgjbf/6z5uOzZ4f7RT3ZXK42bULPoXfeie8ekhr5JoIdHjpKjwXudPe7AE04J81fU1cmq0lxMRxySN2JIM5qoazevZUIJBL5JoINZnYjcBnwVGZtgnbxhSUSkYqKaKuFsk48MSSC6gO6PvooTEp35JHR37O6Xr2UCCQSDVmPYCtwhbuvIowJuD22qESiEuUYglwnnhgaapctq7p/6tTQfnDGGdHfszolAolIvusRrHL3X7r7y5nny939j/GGJhKBKEcV5zrxxLB9+eWq+59+Oowo/vjHo79ndb16hZHFmzfHfy9p1fLtNfRpM1tsZuvN7EMz22BmH9b/SpEEbd0a5uOJo2po+PCQYB55pOr+p5+G00+HDh2iv2d1vXqFrUoF0kT5Vg39DBjj7l3dfT9339fd94szMJEmi3L66eratIFLL4UpU3b35T8E4O23YXSBZlLPzmOkRCBNlG8ieNfd81yWSaSZiDMRAIwbFxayf/hhICzZBxQuEahEIBHJdz2CUjN7BPgbodEYAHf/axxBiUQijsFkuYYOhZEj4Te/gWOP5WYIjcQDa515JVpKBBKRfBPBfsAm4JM5+xxQIpDmK47BZNXdcgtcfDGcfDLbAe69N757VdetG+yzD6yoa1JfkfrllQjcfXzcgYhErrIyjO7t3Dm+e5x7LkyfDtdfz7gpU5gUZ9KpzkxdSCUS+fYaGmxmL5jZ3Mzz4WZW4yIyIs1GXIPJqhs2DJ55hqfiv9PeNLpYIpBvY/HvgBsJ00Xj7rMJ6wuINF9xDSZrTlQikAjkmwg6ufu/qu3bEXUwIpGKazBZc9Krl9oIpMnyTQRrzOxgQgMxZnYxsDK2qESaavNmWLOmMFVDSerVCzZtomvScUiLlm+voauBuwmL2K8A3gYujS0qkaaKewxBc9EvLAuixUGkKepMBGb2zZynk4F/EEoRG4GLgF/GF5pIExSi62hz0L8/oEQgTVNfiSA7ifuhwLHAE4R1i8cB1dsMRJqPbImgtVcNZUoE/RMOQ1q2+tYsvhXAzF4Cjnb3DZnnt0AyveVE8hL3qOLmokcPaN+eftu2JR2JtGD5Nhb3AHJ/07Zl9ok0TxUVcMAB0KlT0pHEq00b6NtXVUPSJPk2Fv8R+JeZPZ55fgFwXxwBiUTi7bdhwICkoyiMfv3ov2RJ0lFIC5bvFBP/aWZPA6dkdo1395nxhSXSRG+/XZjlIpuD/v1VIpAmybdEgLu/AbwRYywikTCA8nK44IKEIymQfv3oBbBtG7Rvn3Q00gLl20Yg0mLs/lBMS9VQ//7hD1kjjKWRlAik1dn98Z+WRJDpQsry5cnGIS2WEoG0OqlNBOXlycYhLZYSgbQ6Jdkv+qdkmFV29LRKBNJISgTS6gwAOOigsHpXGnTsyCoIPaVEGkGJQFqdAZCeaqGMMoCysqTDkBZKiUBanTQmgsUAixYlHYa0ULEmAjMbbWYLzazMzG6o4fg3zWy+mc3OLIWZkkpdic327fSB1CWCRQCrVsGGDUmHIi1QbInAzIqAu4BzgKHA581saLXTZgIj3X048Bjws7jikZQoL6cIUpcIFme/UPWQNEKcJYLjgDJ3X+ru24AJwNjcE9z9H+6+KfP0daCVTxUpsVu4MGwPPTTZOApsdyJYvLiu00RqFGci6A1U5DyvzOyrzRXA0zUdMLMrzazUzEpXr14dYYjS6qQ0EewuBygRSCM0i8ZiM7sMGAncXtNxd7/b3Ue6+8ji4uLCBicty6JFrAXo3j3pSApqE4T1i5UIpBHiTAQrgNx1Avtk9lVhZmcCNwFj3H1rjPFIGixcyMKkY0jKoEFKBNIocSaC6cAgMxtgZu2BS4CJuSeY2Qjgt4Qk8F6MsUhaKBEkHYW0QLElAnffAVwDTAEWAI+6+zwzu83MxmROux3oAvzZzGaZ2cRaLidSvw0bYOVKUtubftAgWL0a1q1LOhJpYfJej6Ax3H0yMLnavptzvj4zzvtLymQGVKW2RHD44WE7dy6cfHKysUiL0iwai0UikekxlNpEcNRRYTtrVpJRSAukRCCtx8KF0KYNqR1S1asXFBfDTK0iKw2jRCCtx4IFMGAA25KOIylmoVSgEoE0kBKBtB4zZ6ZnwfraHHVUaCPYvj3pSKQFUSKQ1uHDD8M8OyNGJB1Jso46KqzX/NZbSUciLYgSgbQOs2eHrRJB2Kp6SBpAiUBah2wDadoTweDBYWU2NRhLAygRSOswcyYceGBYojLN2raFkSPhlVeSjkRaECUCSZY7vPEGrFzZtOvMnBmqRcwiCatFO/10mDFDI4wlb0oEkpxp00JVzjHHQJ8+cP758MEHDb/Otm0wb56qhbLOPBN27YKpU5OORFoIJQJJRmUljBkTPvh//Wv43vfg2Wfh7LNh/fqGXWvWrNBd8uijYwm1xTn+eOjUCZ5/PulIpIWIda4hkRrt3Amf/Sxs2gT/+AcMzaxgetxxcNFFMG4cPPFE/tU8L7wQtqNGxRNvS9O+PXziE3veF5F6qEQghffYY/DPf8Jdd+1JAhCqhn76U3jySXjggfyv98ILMGwY9OgRfawt1RlnhLEEy5cnHYm0AEoEUli7dsGPfgSHHQaXXbb38euuCzNnXncdvPtu/dfbsgVefTV88Mken/502N57b/3nbtwId9wBRxwRHl/6EqxdG2980qwoEUhsSkpKMLMqjwuLimDuXC5bsAArKtrruLVty+BXXmHbunXc27Pn3serPU7r2BG2bOH8O+7YvU+AgQNDe8vvfgc7dtR+3uLFobvp178O++0HBx8MEyaE9pZ58woWriRLiUBiU15ejrtXeTx+5pnQvz8PbN++17HsY5E77W+4gfGAv/Zaree5O/+46SYoKuLJ9et370ur6kly7JQpsGIFF7ZrV2MS/bgZHwwezJq33uIswF57DXviCY7Zto2Vy5czd9gwOtSTiEtKSpL+tiUCSgRSOBUVoT7/8svDwKe63HQT9O4N11wTGpdr4h7aG048Mfw3m3LVk+QT27dD3748fuSR+KZNVY9PnsyrHTuy/+DBdF+6lOdyjs1w56CnnmIYsPWGG+pMxOXl5Ul/2xIBJQIpnAcfDB/e48bVf26XLvDzn4fBZvfcU/M5L74Y1iD4yleijbO1aNs2dM1980246qpQRbRlC/z4x3DuuXDoofDSSzBgwN6v/dSnYPx4uP120Id9q2ctrSg9cuRILy0tTToMyYOZ7amqcQ89hLp3h5dfzu8C7nDaaTBnDsyfv3evoEsugSlT4J13oGPHmu9bQEndt95733or3HILHHBAKF2tWxfeu3vugc6da79oRUVoa7j6avjVrxp+X2lWzGyGu4+s6ZhKBFIYc+aE7ow19RSqjVnoYrppU3hdbhXR8uXw17+GaqacJCA1uPlm+Nvf4JxzYOzYMHDvoYfqTgIAffvCF74QGpzVi6hVUyKQwpg0KWzHjGnY6w4/HO68M4yS/cY3wgjizZvDwLMOHeDaa6OPtbUxCwngT3+C++6Ds87Kf7De9deHRHz33bGGKMlS1ZDEpkq1wUknhQ/x6dMbfiH30L3xf/4nJIbt20O3x7/9rcbEoqqhiI0aFcZ0LFiwVwJR1VDLoaohSdbq1fD663DeeY17vVkY8PTII2Gu/QED4P77G166kMYZNy40yusfsFZLiUDi9/TT4b/6xiaCrM9+NnwYPfNMfj2PJBoXXxyq4Roy7Ye0KEoEEr9Jk8KCMZomumXq1i2Uvh5+uO5RytJiKRFIvLZtC108zz0X2ujXrcW65JJQxffqq0lHIjHQX6bE65VX4MMPm14tJMn65CfD9NYTJyYdicRAiUDiNWlSqF/W7KAtW5cuYQnMiRNDe4+0KkoEEq9Jk8Lo4C5dko5EmmrMGCgrCz2IpFVRIpDYDILQ31/VQq1D9ueo6qFWJ9ZEYGajzWyhmZWZ2Q01HP+Emb1hZjvM7OI4Y5HC2/3xf+65SYYhUenbN/T8UiJodWJLBGZWBNwFnAMMBT5vZkOrnbYcuBx4KK44JDnnQVhCUnPWtx5jxoRlRlevTjoSiVCcJYLjgDJ3X+ru24AJwNjcE9x9mbvPBnbFGIckYd06TgFVC7U2558flhudPDnpSCRCcSaC3kBFzvPKzL4GM7MrzazUzEpX6z+RluHZZ2kHSgStzdFHQ69eqh5qZVpEY7G73+3uI919ZHFxcdLhSD4mTWItwAknJB2JRMkslAqmTAmL3EirEGciWAH0zXneJ7NPWrudO2HyZCYDFBUlHY1EbcwY2LgxrBAnrUKciWA6MMjMBphZe+ASQOXJNJg2DdauZVLScUg8TjstLAY0ST/h1iK2RODuO4BrgCnAAuBRd59nZreZ2RgAMzvWzCqBzwC/NbN5ccUjBTRpEhQVMSXpOCQeHTvCmWcqEbQibeO8uLtPBiZX23dzztfTCVVG0ppMmgSnnML6qVOTjkTict558OSTVO8PLi1Ti2gslhakvDysT3z++UlHInHKDBJUn7DWQYlAovX442GrRNC69e4NI0YoEbQSSgQSrccegyOPhEGDko5E4nb++ZwEsHZt0pFIEykRSHRWrAgLl1ysaaNS4bzzKIKwdKi0aEoEEp1stZASQToccwyrQL2HWgElAonOI4/A0KEwZEjSkUghtGnDUxBKBNu3Jx2NNIESgUSjrCwsSzluXNKRSAE9CbBunUYZt3BKBBKN++4Li9N/8YtJRyIFNAWgc2f485+TDkWaQIlAmm7nzpAIzj47zEwpqbEFwtxDf/kL7NiRdDjSSEoE0nTPPBN6DI0fn3QkkoTPfjZ0If3HP5KORBpJiUCa7vbbwzKGF1yQdCSShLPPhi5dQmcBaZGUCKRppk0LDYXf+Aa0a5d0NJKEjh3hoovg0UfD9NTS4igRSNP8139Bt27wla8kHYkk6YorYMMGNRq3UEoE0ngvvABPPAHf+hbsu2/S0UiSTj4ZBg+G3/8+6UikEZQIpHG2bYNrr4WBA+H665OORpJmFkoFr7wC8+cnHY00kBKBNM73vgcLFsCvfgX77JN0NNIcjB8f2gtuvz3pSKSBlAik4e69F37xC7j6ak03LXsUF4e2ogcegOXLk45GGkCJIG02bQq9Oy67DI4+Gvr3D3MDnXMO3HhjGBOwYUPNr925E267LVQBnHEG/Pd/FzZ2af6y1YQqFbQo5u5Jx9AgI0eO9NLS0qTDaDFKSkooLy+nCPgq8AOgJ7AKeAN4D+gMDAIOB9oBO4DpwIvAImArMBi4DDgY+CNwFbA5j/sn8ftlZqm6b5L3rvG+X/0q/OEPMHMmDBtW8JikZmY2w91H1nhMiaB1MzN80aIwGdy0aTBqFPzgB3DqqVBUVPXkjRvhtddg6tTw+Ne/qk4bcPLJ8PWvw6c/HRoH87l3c/lwasX3TfLeNd53zZpQyjzssDDGpI0qHpqDuhJBrIvXS/JOAzj22PDH+PDD8LnP1f4h3rkznHVWeABs2QKrVsHmzaEKqVOnQoUtLVn37vCzn4UqxJ/8JHQskGZNiaA1u//+MDtknz7w1FPhw7wh9tkHSkpiCExavfHjwziTm24Kv0Nf+EJ+r1u2DGbMgJUrw/Pu3UNb1qBBeZVCpXGUCFojd/jhD+E//oMXgTNfeSWM/hUpFLPQTlBRAZdeCnPmhCrJ6qXKVavguedC0pg6FcrLa77egAFhivOrrw69kyRSaiNobbZu3dOFb/x42t97L9tUb92q75vkveu97+bNYR6q3/4W9tsPPvlJOOigsJjNrFkhQQAccEBotzr1VDjppFCKhZAopk2Dxx4LCaNjx9Az6cYbNX6lgdRYnBbvvw8XXggvvQQ/+hF873tYmzb6cGrl903y3pZndc3JwFeAk4ADgQ+AxcDzwLPAm0B90R8K3AJcAiwEftijBxNWrWpM2KmkRACcet+pAEy9fGq0ASWgxu9lzpwwA2R5eRjwlamTre0Dwm4Nf8D+w8b//Ou7Rj4fTk2JI/s+vFj+YpVr1HXfbj/pBsC6G9ZVeR+zcXTt0LXKsazse13b75HdauAwqmRUlXNnrZrFUT2P2iuOWatmAew+lhtDvu9F7veS/Z4L8XOtcm4t73Xb20Kt846bG79YTa1xPPccXHUVLF0aGqR/8Qvo2rXR96lPc/nsaGocdSUC9etqDf70Jzj++DAQ7Pnn82+YE2mJzjoL5szhpxD+6TniiPB7L42mRNCSrV8PV14ZGtGOPTYM4DnllKSjEolfp07cAPDqq6EB+qyz4N/+DVavTjqyFqlVVw3lFu+z1Qej+o/avS/pol5D5H4vL7/9IpfOhl9Mbc8B67cx4Zy+fOGJpdB2705guUX3bFG7NnlVBTTgGvVVSzUmjurVQTVfAPyWPdfIVqEArN+6HoAiK2Kn76wzjlxFVkSX9l12v35U/1F1xxCR6u9FTd9LOBGo5W2N+uda5XU5P+NsdRCw+70tsj2DFvOpJmrU79fmzXDzzWHKky5dQo+5q6+G9u3rvV9tmstnR5RxqGqoleiyaQdj/76CeXfBH/8G73drz//7/gju/szAGpOASCpkZzydPRtOOAG++c0wqvn//q/2ebOkilhLBGY2GrgDKALucfefVDvegTB1zTHAWuBz7r6srmumqrF4y5Ywt/tLL8HEiWG7cycLS7rw0Kf6cev/zql3+L4ai6tSY3H9mn1jcV33dofJk8PkiP/6V0gS550XJlU87rgwMK2BJYXm8tkRZ2NxbP9GmlkRcBdwFlAJTDezie6eu2rFFcAH7n6ImV0C/BT4XBzxnDRzDWf98z14/rLwi9ChQ9hmH5061fzo3HnvfR07hv/AzcIHce42+4DwS7ljB2zfvvdj61b48MNQz599vPceVFaGx6JF8NZbYcZPCJN3fec7cOGFfHXu9XvuKSJ7mMG558KnPhXGH/zxj/D443uW0CwqgkMOCWMZ9tsv9DZq2xZ27ar6yP7dmfGDZfPZZRY+O8zC+R061P7YZ5/aj7VtG/72t24N/+jlPjZvrvmxZQts28atb8/jyVEHxfK2xVmfcBxQ5u5LAcxsAjAWyE0EYwldgwEeA+40M/MYiildN2yn5+I1lE1/kPZAB6B95rEPocgSpZ2NvOZ6oAJ4m9C3+k3CTKDlc+fC3LlhjeDLw7k2XkPuJd3yHcdwODAcGLpzJ4ctXEjxwoV0BboS6sd31fCA0OzSdz8whyWvP4gRPjQ7ZB77ZB5R20KY3Tf72AZ07waruq6L4W4xVg2Z2cXAaHf/Sub5OOB4d78m55y5mXMqM8+XZM5ZU+1aVwJXZp4eShhP0pJ1B9bUe1Z66P3YQ+9FVXo/qmrK+9Hf3Wucn6NFtDC6+93A3UnHERUzK62tri6N9H7sofeiKr0fVcX1fsRZybwC6JvzvE9mX43nmFlbQkltbYwxiYhINXEmgunAIDMbYGbtCVOETKx2zkTgS5mvLwb+Hkf7gIiI1C62qiF332Fm1wBTCO2mf3D3eWZ2G1Dq7hOB3wN/MrMy4H1CskiDVlPNFRG9H3vovahK70dVsbwfLW5ksYiIREsd0UVEUk6JQEQk5ZQICszMisxspplNSjqWpJlZNzN7zMzeMrMFZnZi0jElycy+YWbzzGyumT1sZqlagsvM/mBm72XGF2X3fczMnjOzxZnt/knGWCi1vBe3Z/5WZpvZ42bWLar7KREU3teABUkH0UzcATzj7kOAI0nx+2JmvYHrgJHuPozQwSItnSey7gNGV9t3A/CCuw8CXsg8T4P72Pu9eA4Y5u7DgUXAjVHdTImggMysD3AucE/SsSTNzLoCnyD0HMPdt7n7ukSDSl5boGNmTE0n4J2E4ykod3+J0Hsw11jg/szX9wMXFDKmpNT0Xrj7s+6encXvdcLYrEgoERTWr4DvsGcqkzQbAKwG7s1Uld1jZp2TDiop7r4C+DmwHFgJrHf3Z5ONqlno4e4rM1+vAnokGUwz8mXg6agupkRQIGZ2HvCeu89IOpZmoi1wNPBrdx8BbCQ9xf69ZOq+xxISZC+gs5ldlmxUzUtmsGnq+7ub2U3ADuDBqK6pRFA4HwfGmNkyYAJwupk9kGxIiaoEKt19Wub5Y4TEkFZnAm+7+2p33w78FTgp4Ziag3fN7CCAzPa9hONJlJldDpwHXBrlLAxKBAXi7je6ex93LyE0Av7d3VP7H5+7rwIqzOzQzK4zqDpFedosB04ws04W5lY+gxQ3nufInYbmS8ATCcaSqMxCX98Bxrj7piiv3SJmH5VW61rgwcxcVEuB8QnHkxh3n2ZmjwFvEIr9M0nZ9Apm9jBwKtDdzCqBHwI/AR41syuAcuCzyUVYOLW8FzcSlkF4LrMOw+vuflUk99MUEyIi6aaqIRGRlFMiEBFJOSUCEZGUUyIQEUk5JQIRkZRTIpBWwcw+qvb8cjO7M+Z7tjezX5lZWWZ2zCcy80llj1+XmVX1QTPrYWaTzOxNM5tvZpMz55TkzjApkgSNIxCpg5m1zZnoq7ofA/sCh7r7TjMbD/zVzI7PjPr8f8CZ7l5pZr8FnnP3OzLXHV6Qb0AkDyoRSKuX+a/775l53F8ws36Z/feZ2cU5532U2Z5qZi+b2URgvpl1NrOnMv/NzzWzz5lZJ8IAuG+4+04Ad78X2EqYPuQ3wEDgaTP7BnAQYVoNMufOriHOosyc89MzsX4159i3c/bfmvN9vZUpcSzIrO3QKfI3UFo9lQiktehoZrNynn+MMD0BwP8C97v7/Wb2ZeB/qH8646MJc7+/bWYXAe+4+7mwewrtQ4Dl7v5htdeVAoe7+1WZKQFOc/c1ZjYfeMTMrgGeB+519+rTTF9BmHX0WDPrALxqZs8CgzKP4wADJprZJwjTUhwKXOHur5rZHwilkJ/X92aJ5FKJQFqLze5+VPYB3Jxz7ETgoczXfwJOzuN6/3L3tzNfzwHOMrOfmtkp7r6+ocG5+xRCCeF3wBBgppkVVzvtk8AXMwltGnAAIQF8MvOYSZiCYkhmP0CFu7+a+fqBPL83kSqUCCTNdpD5GzCzNkD7nGMbs1+4+yJCCWEO8CMzuxlYAvQzs32rXfMYYF5NN3P39939IXcfB0wnLMyTy4BrcxLagMyaBAb8V87+Q9z999nLVr9Nft+6yB5KBJIGr7Fn2cdLgZczXy8jfHADjAHa1fRiM+sFbHL3B4DbgaPdfSNhxaxfmllR5rwvElYW+3sN1zg9W3+fSR4HE6p2ck0B/t3M2mXOG5xZrGcK8GUz65LZ39vMDsy8pp/tWev5C8Ar9b8dIlWpjUDS4FrCSmjfJqyKlp3l9HfAE2b2JvAMOaWAao4AbjezXcB24N8z+28k1Mcvyhx7C7iwlnnijwHuNLNsKeQed59uZiU559wDlABvZKaiXg1c4O7PmtlhwD8zs05+BFwG7AQWAldn2gfmA7/O/20RCTT7qEgLlUkikzKL3Ys0mqqGRERSTiUCEZGUU4lARCTllAhERFJOiUBEJOWUCEREUk6JQEQk5f4/31ZOrbHCVj4AAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = dataframe['HoursOfSleep']\n", + "\n", + "plt.hist(x, zorder=0, fill=False, density=True) # histogram\n", + "#plt.scatter(x, np.full_like(x, .01), c='g', marker='+', s=50) # rug plot\n", + "sns.rugplot(x, color='g')\n", + "\n", + "sns.kdeplot(x, clip=(x.min(), x.max()), color='r', linestyle='-')\n", + "\n", + "plt.xlabel(x.name)\n", + "plt.ylabel('density');" + ] + }, + { + "cell_type": "markdown", + "id": "c8c00e8c", + "metadata": { + "tags": [] + }, + "source": [ + "The estimated distribution is not Gaussian at all! Who's right?" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "ddfe2b2f", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 957.6x295.2 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grid = np.linspace(x.min(), x.max(), 100)\n", + "\n", + "normal_distribution = stats.norm(x.mean(), x.var())\n", + "normal_density = normal_distribution.pdf(grid)\n", + "\n", + "kde = stats.gaussian_kde(x)\n", + "kernel_density = kde(grid)\n", + "\n", + "_, axes = plt.subplots(1, 2, figsize=(13.3,4.1))\n", + "\n", + "ax = axes[0]\n", + "ax.hist(x, zorder=0, fill=False, density=True)\n", + "\n", + "ax = axes[1]\n", + "ax.hist(x, bins=20, zorder=0, fill=False, density=True)\n", + "\n", + "for ax in axes:\n", + " #ax.scatter(x, np.full_like(x, .01), c='g', marker='+', s=50)\n", + " sns.rugplot(x, color='g')\n", + "\n", + " ax.plot(grid, normal_density, 'r-', alpha=.5)\n", + " ax.plot(grid, kernel_density, 'r-')\n", + "\n", + " ax.set_xlabel(x.name)\n", + " ax.set_ylabel('density')" + ] + }, + { + "cell_type": "markdown", + "id": "183e562f-6819-4776-b946-c4837d273912", + "metadata": {}, + "source": [ + "The first histogram, with its default binning, misled us." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "eed4519b-0c2b-4d3b-996c-27e7507cd902", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 3. , 4.5 , 5. , 5.5 , 6. ,\n", + " 6.43955 , 6.5 , 6.8426 , 6.84315 , 6.90955 ,\n", + " 7. , 7.05 , 7.11666667, 7.20446667, 7.30128333,\n", + " 7.5 , 7.5266 , 7.64151667, 7.65855 , 7.72778333,\n", + " 7.79393333, 7.84613333, 7.8547 , 7.9115 , 8. ,\n", + " 8.33333333, 8.5 , 9. , 9.5 , 10. ,\n", + " 11. , 12. ])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.unique(x)" + ] + }, + { + "cell_type": "markdown", + "id": "cb8febd8", + "metadata": {}, + "source": [ + "Any selection bias?\n", + "\n", + "Let us check $HoursOfSleep$ does not follow a normal distribution with the `normaltest` function:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "417bfc62", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "NormaltestResult(statistic=17.050178832107033, pvalue=0.00019842697373015917)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.normaltest(x)" + ] + }, + { + "cell_type": "markdown", + "id": "655b0fc0", + "metadata": { + "tags": [] + }, + "source": [ + "...and with the `kstest` function:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "5b1b8872", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "KstestResult(statistic=0.17109280360924561, pvalue=2.3554256360953683e-21)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.kstest(x, normal_distribution.cdf)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "4c3a3826-f138-4623-a2ae-b5e1856447a3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "KstestResult(statistic=0.17109280360924561, pvalue=1.1777128180476841e-21)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.kstest(x, normal_distribution.cdf, alternative='less') # one-sided variant" + ] + }, + { + "cell_type": "markdown", + "id": "5b2b7d19", + "metadata": {}, + "source": [ + "# Statistical testing\n", + "\n", + "> What did we do?\n", + "\n", + "We compared our **observations** `x` with some **expectation**.\n", + "\n", + "We actually formulated a so-called *null hypothesis*, denoted $H_0$, that models the situation such that \"nothing is going on\", *i.e.* the observations meet the expectation.\n", + "\n", + "We also implicitly defined an alternative hypothesis, usually denoted $H_1$ or $H_A$, that can simply be the opposite of $H_0$.\n", + "\n", + "For example:\n", + "\n", + "$$\n", + "\\left\\{\n", + "\\begin{array}{ l l l }\n", + "H_0: & X \\sim \\mathcal{N}(\\mu, \\sigma^2) & \\mbox{with } \\mu \\mbox{ approximated as } \\bar{x} \\mbox{ and } \\sigma^2 \\mbox{ as } \\frac{1}{n-1}\\sum_{i=0}^{n-1} (x_i - \\bar{x})^2 \\\\\n", + "H_A: & \\mbox{not } H_0\n", + "\\end{array}\n", + "\\right.\n", + "$$\n", + "\n", + "If we had a single observation – say $z=1.4$ – to compare with a distribution – say $\\mathcal{N}(0,1)$ – we would simply compute the probability for this value to come from this distribution:" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "8346ad8e", + "metadata": {}, + "outputs": [], + "source": [ + "z = 1.4\n", + "\n", + "N = stats.norm(0, 1)\n", + "\n", + "onesided_pvalue = N.sf(z) # sf= survival function\n", + "twosided_pvalue = 2 * min(N.cdf(z), N.sf(z))" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "404476b6", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grid = np.linspace(N.ppf(.001), N.ppf(.999), 100)\n", + "pdf_curve, = plt.plot(grid, N.pdf(grid), 'r-')\n", + "\n", + "z_line, = plt.plot([z, z], [0, N.pdf(z)], '-', zorder=1)\n", + "\n", + "tail = grid[z<=grid]\n", + "plt.fill_between(tail, np.zeros_like(tail), N.pdf(tail), alpha=.2)\n", + "\n", + "plt.axvline(0, linestyle='--', color='grey', linewidth=1)\n", + "plt.axhline(0, linestyle='--', color='grey', linewidth=1)\n", + "plt.xlim(grid[[0,-1]])\n", + "\n", + "plt.xlabel('$X$')\n", + "plt.ylabel('probability density')\n", + "plt.legend([pdf_curve, z_line], ['$\\mathcal{N}(0,1)$', '$z$']);\n", + "\n", + "plt.annotate(f'$\\\\approx {onesided_pvalue:.2f}$', (1.8, .03), xytext=(2, .13), arrowprops=dict(arrowstyle=\"->\"));" + ] + }, + { + "cell_type": "markdown", + "id": "99a007ac", + "metadata": {}, + "source": [ + "In practice, all tests boil down to comparing a single value with a reference distribution. Basically, a test expresses the discrepancy between the observations and the expectation as a *statistic*, and this statistic is supposed to follow a given distribution under $H_0$.\n", + "\n", + "This is used as a basis to estimate a *p*-value that estimates the probability of erroneously rejecting $H_0$.\n", + "\n", + "The experimenter also defines a significance level $\\alpha$, with common values $\\alpha=0.05$ or $0.01$, that sets the maximum tolerated risk of rejecting the null hypothesis by chance.\n", + "If the obtained <em>p</em>-value is lower than $\\alpha$, then s·he can conclude rejecting $H_0$." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "f4b02335-208a-4d2b-928d-0eae3ce8333c", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "<style>\n", + "#typeoferrors td { text-align: center; font-size: large; border-right: solid 1px black; border-bottom: solid 1px black; }\n", + "#typeoferrors td.wrong { color: orange; }\n", + "#typeoferrors span.sub { font-size: x-small; }\n", + "</style>\n", + "<table id=\"typeoferrors\" style=\"text-align: center; font-size: large; margin-left: 1px;\">\n", + " <tr><td rowspan=\"2\" colspan=\"2\"></td><td colspan=\"2\" style=\"font-size: small; border-top: solid 1px black;\">Conclusion about $H_0$<br />from the statistical test</td></tr>\n", + " <tr><td>accept</td><td>reject</td></tr>\n", + " <tr><td rowspan=\"2\" style=\"font-size: small; border-left: solid 1px black;\">Truth about $H_0$<br />in the population</td><td>true</td><td style=\"color: green;\">Correct</td><td class=\"wrong\">Type 1 error<br /><span class=\"sub\">observe difference<br />when none exists</span></td></tr>\n", + " <tr><td>false</td><td class=\"wrong\">Type 2 error<br /><span class=\"sub\">fail to observe difference<br />when one exists</span></td><td style=\"color: green;\">Correct</td></tr>\n", + "</table>\n", + "<a style=\"font-size: xx-small;\" href=\"https://faculty.nps.edu/rbassett/_book/hypothesis-testing-one-sample.html#fig:errorsHypTesting\">https://faculty.nps.edu/rbassett/_book/hypothesis-testing-one-sample.html#fig:errorsHypTesting</a>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "\n", + "<style>\n", + "#typeoferrors td { text-align: center; font-size: large; border-right: solid 1px black; border-bottom: solid 1px black; }\n", + "#typeoferrors td.wrong { color: orange; }\n", + "#typeoferrors span.sub { font-size: x-small; }\n", + "</style>\n", + "<table id=\"typeoferrors\" style=\"text-align: center; font-size: large; margin-left: 1px;\">\n", + " <tr><td rowspan=\"2\" colspan=\"2\"></td><td colspan=\"2\" style=\"font-size: small; border-top: solid 1px black;\">Conclusion about $H_0$<br />from the statistical test</td></tr>\n", + " <tr><td>accept</td><td>reject</td></tr>\n", + " <tr><td rowspan=\"2\" style=\"font-size: small; border-left: solid 1px black;\">Truth about $H_0$<br />in the population</td><td>true</td><td style=\"color: green;\">Correct</td><td class=\"wrong\">Type 1 error<br /><span class=\"sub\">observe difference<br />when none exists</span></td></tr>\n", + " <tr><td>false</td><td class=\"wrong\">Type 2 error<br /><span class=\"sub\">fail to observe difference<br />when one exists</span></td><td style=\"color: green;\">Correct</td></tr>\n", + "</table>\n", + "<a style=\"font-size: xx-small;\" href=\"https://faculty.nps.edu/rbassett/_book/hypothesis-testing-one-sample.html#fig:errorsHypTesting\">https://faculty.nps.edu/rbassett/_book/hypothesis-testing-one-sample.html#fig:errorsHypTesting</a>" + ] + }, + { + "cell_type": "markdown", + "id": "0e2642ae-4fdb-4e32-a742-abe78a37062b", + "metadata": {}, + "source": [ + "## *t* tests\n", + "\n", + "*t* tests derive a statistic that is supposed to follow the [Student's *t* distribution](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.t.html) under $H_0$:" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "id": "60e92736-96b4-41af-9a1d-a63f1ef350f4", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grid = np.linspace(-3.1, 3.1, 100)\n", + "\n", + "dfs = [1, 2, 5, 20]\n", + "\n", + "for df, color in zip(\n", + " dfs,\n", + " ['blue', 'green', 'orange', 'red'],\n", + "):\n", + " t = stats.t(df)\n", + " plt.plot(grid, t.pdf(grid), '-', color=color)\n", + " \n", + "plt.axvline(0, linestyle='--', color='grey', linewidth=1)\n", + "plt.axhline(0, linestyle='--', color='grey', linewidth=1)\n", + "plt.xlim(grid[[0,-1]])\n", + "plt.xlabel('$t$')\n", + "plt.ylabel('probability density')\n", + "plt.legend([ f'$df={df}$' for df in dfs ]);" + ] + }, + { + "cell_type": "markdown", + "id": "701ee597-2eec-4404-8a0e-601ae2121e19", + "metadata": {}, + "source": [ + "At high degrees of freedom, the *t* distribution approaches the normal distribution. At lower degrees of freedom, the *t* distribution exhibits heavier tails and is less sensitive to extreme values." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "29da7498-9762-4a65-91da-656fcf5739d6", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [], + "source": [ + "mu = 50\n", + "x = stats.norm.rvs(loc=46, scale=30, size=8)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "4ed85e5d-707a-4c6c-9d4e-403e089d3b5f", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 22.67778288, 45.95785693, -17.5783201 , -6.7727841 ,\n", + " 63.71684948, 83.87176802, 54.59617302, 70.0952708 ])" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "927a5176-6a2d-4467-93d9-fad9f79b4d45", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'49.5 81.9 64.0 17.3 59.8 94.6 69.9 12.4'" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = np.array([49.47257879, 81.93967205, 64.030398 , 17.25423608, 59.80082512,\n", + " 94.56012514, 69.91672899, 12.39640637])\n", + "' '.join(f'{xi:.1f}' for xi in x)" + ] + }, + { + "cell_type": "markdown", + "id": "70c31409-0e7f-42e0-95f8-76c329ebff8e", + "metadata": {}, + "source": [ + "### One-sample *t* test\n", + "\n", + "This test compares a sample's central tendency (*sample mean*) with a reference value (*population mean*).\n", + "\n", + "<table style=\"text-align: center;\"><tr><td>\n", + "<img src='img/8mice.svg' />\n", + "</td><td>\n", + "<img src='img/Scientific_journal_icon.svg' width=\"96px\" />\n", + "</td></tr><tr><td>\n", + "<code>x=[49.5 81.9 64.0 17.3 59.8 94.6 69.9 12.4]</code>\n", + "</td><td>\n", + "<code>μ=50</code>\n", + "</td></tr></table>\n", + "\n", + "Let us call $\\mu$ this reference value. Our expectation is that the sample mean $\\bar{X}$ is close enough to $\\mu$.\n", + "In other words, $H_0: \\bar{X} = \\mu$.\n", + "The statistic is:\n", + "$$\n", + "\\frac{\\bar{X} - \\mu}{\\mathrm{SEM}} \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\sim t(n-1) \\mbox{ } \\textrm{under} \\mbox{ } H_0\n", + "$$\n", + "\n", + "<div class=\"alert alert-block alert-info\" markdown=\"1\">\n", + "<code>scipy.stats</code> provides a <a href=\"https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.sem.html\">sem</a> function as an addition to <code>numpy</code>'s <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.std.html\">std</a>. <code>sem</code> is unbiased by default.\n", + "</div>\n", + "\n", + "`scipy`'s one-sample *t* test is [ttest_1samp](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_1samp.html):\n", + "\n", + "`scipy.stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate', alternative='two-sided')`" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "886a273d-bcb7-4124-b234-8b739ffae1c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Ttest_1sampResult(statistic=0.6024056396957578, pvalue=0.5658990587680466)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mu = 50\n", + "\n", + "x = np.array([49.47257879, 81.93967205, 64.030398, 17.25423608, 59.80082512,\n", + " 94.56012514, 69.91672899, 12.39640637])\n", + "\n", + "stats.ttest_1samp(x, mu)" + ] + }, + { + "cell_type": "markdown", + "id": "dac3b6db-2ad7-46b4-937f-9dda1015b7fc", + "metadata": {}, + "source": [ + "If we do not mind a negative difference (resp. positive difference), *i.e.* we consider the danger zone to begin only above (resp. below) the expected value, we can make the test one-sided to gain statistical power.\n", + "To this aim, we must choose and specify which side: here `'greater'` (resp. `'less'`):" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "b732c69f-1851-4ef2-bdc2-8f80b4c5281e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Ttest_1sampResult(statistic=0.6024056396957578, pvalue=0.2829495293840233)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.ttest_1samp(x, mu, alternative='greater')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "dc360e24-d676-4398-8e4b-dba71e9e68e8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(56.1713713175, 10.244544391411772)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x.mean(), stats.sem(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "9318d3d7-291d-4746-bf5c-5e949b9d01d9", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 74.69574213, 104.90783803, 84.7459419 , 84.71874306,\n", + " 59.06825588, -2.56513302, 65.9081996 , 86.73460923])" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x1 = x\n", + "x2 = stats.norm.rvs(loc=71, scale=30, size=8)\n", + "x2" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "0b82f89c-a5ec-42cf-bc61-c4d56bed2e41", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [], + "source": [ + "x2 = np.array([64.22723692, 96.56483856, 101.94191774, 85.31918879,\n", + " 66.4952999 , 63.88841224, 127.63861749, 55.00527005])" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "52086aad-ffa3-4588-86e0-1de74dd91496", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'64.2 96.6 101.9 85.3 66.5 63.9 127.6 55.0'" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "' '.join(f'{xi:.1f}' for xi in x2)" + ] + }, + { + "cell_type": "markdown", + "id": "2476620a-c9f5-40eb-9fdd-c620a772b64b", + "metadata": {}, + "source": [ + "### *t* test for independent samples\n", + "\n", + "This test compares the means of two samples or groups: $H_0: \\bar{X_1} = \\bar{X_2}$.\n", + "\n", + "<table style=\"text-align: center;\"><tr><td>\n", + "<img src='img/8mice.svg' />\n", + "</td><td>\n", + "<img src='img/8mutants1.svg' />\n", + "</td></tr><tr><td>\n", + "<code>x<sub>1</sub>=[49.5 81.9 64.0 17.3 59.8 94.6 69.9 12.4]</code>\n", + "</td><td>\n", + "<code>x<sub>2</sub>=[64.2 96.6 101.9 85.3 66.5 63.9 127.6 55.0]</code>\n", + "</td></tr></table>\n", + "\n", + "`scipy`'s *t* test for independent samples uses the statistic $t=\\frac{\\bar{X_1}-\\bar{X_2}}{\\sqrt{(\\frac{1}{n_1}+\\frac{1}{n_2})\\times\\textrm{PooledVariance}}}$ with $\\textrm{PooledVariance} = \\frac{1}{n_1+n_2-2}\\sum_{j\\in\\{1,2\\}}\\sum_i (x_{ij}-\\bar{x_j})^2$ and is available as [ttest_ind](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html):\n", + "\n", + "`scipy.stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0)`" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "6231e214-ac36-4c4f-8a16-e1551c8484b4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Ttest_indResult(statistic=-1.96174329619957, pvalue=0.06998888828308221)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x2 = np.array([64.22723692, 96.56483856, 101.94191774, 85.31918879,\n", + " 66.4952999, 63.88841224, 127.63861749, 55.00527005])\n", + "\n", + "stats.ttest_ind(x1, x2)" + ] + }, + { + "cell_type": "markdown", + "id": "abd35c81-ba5b-43c6-b4ef-b34457605baf", + "metadata": {}, + "source": [ + "1. Had we got a more precise assumption about *e.g.* $\\bar{X_2} > \\bar{X_1}$, we could have made a one-sided test that would have successfully rejected $H_0$.\n", + "\n", + " ...but this should be defined prior to carring out any test!\n", + " \n", + " More important than the *p*-value is the *effect size*, sometimes called Cohen's *d*: $d = \\frac{\\bar{X_2}-\\bar{X_1}}{\\sqrt{\\textrm{PooledVariance}}}$\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "3beb1fbb-a1ac-40aa-b4ce-b97f151392f5", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "787e7bcf569c4e9a9ae7ec1793569677", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.5, description='cohen_d', max=4.0, step=0.5), Output()), _dom_classe…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "import ipywidgets as widgets\n", + "from ipywidgets import interact\n", + "def plot_pdfs(cohen_d):\n", + " grid = np.linspace(-3, 3+cohen_d, 100)\n", + " x1 = stats.norm(0, 1).pdf(grid)\n", + " x2 = stats.norm(cohen_d, 1).pdf(grid)\n", + " plt.fill_between(grid, x1, alpha=.5)\n", + " plt.fill_between(grid, x2, alpha=.5)\n", + " plt.show()\n", + "slider = widgets.FloatSlider(.5, min=0, max=4, step=.5)\n", + "interact(plot_pdfs, cohen_d=slider);" + ] + }, + { + "cell_type": "markdown", + "id": "e85d9f23-11cb-4f66-b6cd-bd5f499bde38", + "metadata": {}, + "source": [ + "2. Had we found enough evidence to reject $H_0$, we could have concluded about an *association* between the mutation and the observed effect.\n", + " To further conclude in terms of *causation*, it is necessary to rule out all possible [confounders](https://en.wikipedia.org/wiki/Confounding) (supplier, cage effect, etc).\n", + "\n", + "3. `scipy`'s implementation does not require equal numbers of observations per group.\n", + " However, it assumes the groups are normally distributed (but is relatively robust to non-«extreme non-normality») and, more importantly, have similar variances ($0.5<\\frac{s_{X_1}}{s_{X_2}}<2$).\n", + " For heterogeneous groups, `ttest_ind` embarks various variants of the *t* test that can be selected with additional arguments:\n", + " * Welch's *t* test with `equal_var=False`;\n", + " * Yuen's *t* test with `equal_var=False` and `trim=0.2` (requires more data).\n", + " \n", + "<div class=\"alert alert-block alert-info\" markdown=\"1\">\n", + "<em>Tip</em>: always check for the underlying assumptions in the documentation.\n", + "</div>\n", + "\n", + "### *t* test for paired samples\n", + "\n", + "<img src='img/paired1.svg' />\n", + "\n", + "`scipy`'s *t* test for paired samples is [ttest_rel](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html):\n", + "\n", + "`scipy.stats.ttest_rel(a, b, axis=0, nan_policy='propagate', alternative='two-sided')`\n", + "\n", + "This is actually a one-sample *t* test of the between-group differences against a population mean equal to zero (compare [1](https://github.com/scipy/scipy/blob/v1.7.1/scipy/stats/stats.py#L6450-L6460) and [2](https://github.com/scipy/scipy/blob/v1.7.1/scipy/stats/stats.py#L5647-L5656))." + ] + }, + { + "cell_type": "markdown", + "id": "5b01e6fe-5670-4e45-9176-7e90b38445d2", + "metadata": {}, + "source": [ + "## Analysis of variance\n", + "\n", + "### One-way ANOVA\n", + "\n", + "Comparing three or more group means reads $H_0: \\bar{X_0} = \\bar{X_1} = ... = \\bar{X_k}$ and is usually carried out with an *analysis of variance*.\n", + "\n", + "The total variance ($\\propto\\textrm{TSS}$) is decomposed as the sum of two terms: *within-group* variance ($\\propto\\textrm{SSE}$) and *between-group* variance ($\\propto\\textrm{SST}$).\n", + "\n", + "$$\n", + "\\underbrace{\\sum_j\\sum_i (x_{ij} - \\bar{\\bar{x}})^2}_{\\textrm{TSS}} = \\underbrace{\\sum_j\\sum_i (\\bar{x_j} - \\bar{\\bar{x}})^2}_{\\textrm{SST}} + \\underbrace{\\sum_j\\sum_i (x_{ij} - \\bar{x_j})^2}_{\\textrm{SSE}}\n", + "$$\n", + "Many statistical tools give the following detailled table:\n", + "\n", + "| Source | Degrees of freedom | Sum of squares | Mean squares | F | *p*-value |\n", + "| :- | :-: | :-: | :-: | :-: | :-: |\n", + "| Treatment | $k-1$ | SST | MST | MST/MSE | p |\n", + "| Error | $N-k$ | SSE | MSE | | |\n", + "| Total | $N-1$ | TSS | | | |\n", + "\n", + "The statistic $F=\\frac{MST}{MSE}$ follows the Fisher's [F](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.f.html) distribution under $H_0$.\n", + "\n", + "More about it at: https://www.coursera.org/learn/stanford-statistics/lecture/pskeN/the-idea-of-analysis-of-variance\n", + "\n", + "The most basic [implementation](https://github.com/scipy/scipy/blob/v1.7.1/scipy/stats/mstats_basic.py#L2937-L2967) of the one-way ANOVA in SciPy is [f_oneway](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.f_oneway.html):" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "2bf0aafa-d23f-44fe-b9e0-cf4bf13e7314", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "F_onewayResult(statistic=2.3575322551335636, pvalue=0.11384795345837218)" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = [85, 86, 88, 75, 78, 94, 98, 79, 71, 80]\n", + "B = [91, 92, 93, 85, 87, 84, 82, 88, 95, 96]\n", + "C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]\n", + "\n", + "stats.f_oneway(A, B, C)" + ] + }, + { + "cell_type": "markdown", + "id": "fdfb04dc-71c6-476e-a957-ed2f52eff3f0", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "### Assumptions\n", + "\n", + "The standard ANOVA requires the data to exhibit the following properties:\n", + "\n", + "* independent observations,\n", + "* each group is normally distributed,\n", + "* all groups have equal variance (*homoscedasticity*),\n", + "* at least 5 observations ($n \\ge 5$) per group (and equal number).\n", + "\n", + "Alternative in the case of unequal variances: Alexander-Govern's test with [alexandergovern](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.alexandergovern.html)\n", + "\n", + "<div class=\"alert alert-block alert-info\" markdown=\"1\">\n", + "The ANOVA is an *omnibus* test and does not tell which groups exhibit differing means. Specific differences are identified in a posterior analysis using *post-hoc tests*.\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "id": "7a08e9ee-3849-4317-b45c-d62b882e49d5", + "metadata": {}, + "source": [ + "## Checking for common assumptions\n", + "\n", + "Visually checking for desired properties like normality or equal variance is acceptable, especially if the data are generally known to exhibit these properties.\n", + "\n", + "### Normality\n", + "\n", + "#### Graphical approaches\n", + "\n", + "Probability plots with [probplot](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.probplot.html) (equivalent to R's `qqnorm` function):" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "id": "6bcaa795-3a85-4b8c-aad9-d554e244a2ec", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 957.6x295.2 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(1245619531)\n", + "\n", + "x_normal = stats.norm.rvs(loc=0, scale=1, size=30) # generate 30 observations from the standard normal distribution\n", + "x_not_normal = stats.norm.rvs(loc=[-1,1], scale=[1,3], size=(15,2)).ravel() # generate 30 observations from a mixture of normal distributions\n", + "\n", + "_, axes = plt.subplots(1, 2, figsize=(13.3,4.1))\n", + "\n", + "stats.probplot(x_normal, plot=axes[0])\n", + "stats.probplot(x_not_normal, plot=axes[1]);" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "id": "e1f2356b-dd02-47d5-8e2c-82c77a6a5c97", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 957.6x295.2 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "_, axes = plt.subplots(1, 2, figsize=(13.3,4.1))\n", + "axes[0].hist(x_normal, bins=7)\n", + "axes[1].hist(x_not_normal, bins=7);" + ] + }, + { + "cell_type": "markdown", + "id": "2326fc45-7aff-4a1d-84f2-beb01618d307", + "metadata": {}, + "source": [ + "#### Normality tests\n", + "\n", + "* D'Agostino's test: [normaltest](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.normaltest.html), preferably for large samples ($n>20$),\n", + " * Similar test for skewness only: [skewtest](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.skewtest.html) ($n\\ge8$)," + ] + }, + { + "cell_type": "code", + "execution_count": 231, + "id": "e964be07-0696-4ff8-844a-3e7d318a7f3a", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 957.6x295.2 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "skewed_dist = lambda sigma, x: np.exp(-np.log(x)**2/(2*sigma**2))/(x*sigma*np.sqrt(2*np.pi))\n", + "\n", + "dists = {\n", + " 'laplace: ': stats.laplace(),\n", + " 'norm: ': stats.norm(),\n", + " 'uniform: ': stats.uniform(-2, 4),\n", + "}\n", + "\n", + "colors = ['blue', 'green', 'orange', 'red']\n", + "_, axes = plt.subplots(1, 2, figsize=(13.3,4.1))\n", + "\n", + "grid = np.linspace(0, 3, 100)\n", + "grid = grid[1:]\n", + "\n", + "ax = axes[0]\n", + "for sigma, color in zip((1,.5,.25), colors):\n", + " ax.plot(grid, skewed_dist(sigma, grid), '-', color=color, label=f'$\\sigma={sigma:.2f}$')\n", + " \n", + "ax.axhline(0, linestyle='--', color='grey', linewidth=1)\n", + "ax.set_xlim(grid[[0,-1]])\n", + "ax.set_title('skewness')\n", + "\n", + "grid = np.linspace(-5, 5, 100)\n", + " \n", + "ax = axes[1]\n", + "for distname, color in zip(dists, colors):\n", + " dist = dists[distname]\n", + " kurt = stats.kurtosis(dist.rvs(size=100), fisher=True)\n", + " if distname.startswith('norm') and kurt>0: distname += ' ';\n", + " ax.plot(grid, dist.pdf(grid), '-', color=color, label=f'{distname}${kurt:.2f}$')\n", + " \n", + "ax.axvline(0, linestyle='--', color='grey', linewidth=1)\n", + "ax.axhline(0, linestyle='--', color='grey', linewidth=1)\n", + "ax.set_xlim(grid[[0,-1]])\n", + "ax.set_title('kurtosis')\n", + "\n", + "for ax in axes:\n", + " ax.set_ylabel('probability density')\n", + " ax.legend();" + ] + }, + { + "cell_type": "markdown", + "id": "eed065d2-dd35-4fdb-ad91-8d387a06c7ea", + "metadata": {}, + "source": [ + "* Shapiro-Wilk's test: [shapiro](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.shapiro.html),\n", + "* Generic goodness-of-fit tests: [kstest](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.kstest.html) and [anderson](https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.stats.anderson.html).\n", + "\n", + "For smaller sample sizes, it still makes sense to make use of these tests. If they fail to reject $H_0$, one cannot conclude $X$ follows a normal distribution, but at least *extreme non-normality* cases are ruled out. *t* tests and *F* tests are actually fairly robust to moderate non-normality.\n", + "However, if such a normality test rejects $H_0$, then one should not proceed with applying a standard *t* test or *F* test." + ] + }, + { + "cell_type": "markdown", + "id": "b8c030d0-3d3e-4a19-9313-2f1f5738490b", + "metadata": {}, + "source": [ + "### Equal variance (homoscedasticity)\n", + "\n", + "#### Graphical approaches\n", + "\n", + "Simple per-group box plots." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "8a31b653-d891-4f07-ab8b-73562b2ed86d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "A = [85, 86, 88, 75, 78, 94, 98, 79, 71, 80]\n", + "B = [91, 92, 93, 85, 87, 84, 82, 88, 95, 96]\n", + "C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]\n", + "\n", + "df = pd.DataFrame(data=dict(A=A, B=B, C=C))\n", + "plt.boxplot(df, labels=df.columns);" + ] + }, + { + "cell_type": "markdown", + "id": "e985446d-d250-4d88-9a13-50a098cd016b", + "metadata": {}, + "source": [ + "#### Equality-of-variance tests\n", + "\n", + "* Bartlett's test: [bartlett](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.bartlett.html), most basic and common test,\n", + "* Levene's test: [levene](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.levene.html), better for skewed or heavy-tailed distributions,\n", + "* ...and others: Fligner-Killeen's test ([fligner](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.fligner.html)), Ansari-Bradley's test ([ansari](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ansari.html)), etc\n", + "\n", + "Example:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "280180fa-4f20-44a6-a463-2ce9b0ad75a4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BartlettResult(statistic=3.3024375753550457, pvalue=0.19181598314036113)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# copied-pasted from https://www.statology.org/bartletts-test-python/\n", + "A = [85, 86, 88, 75, 78, 94, 98, 79, 71, 80]\n", + "B = [91, 92, 93, 85, 87, 84, 82, 88, 95, 96]\n", + "C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]\n", + "\n", + "stats.bartlett(A, B, C)" + ] + }, + { + "cell_type": "markdown", + "id": "e906820a-af04-4a9d-992f-f2e07a7aed91", + "metadata": {}, + "source": [ + "In the above example, as there is not enough evidence to reject $H_0$ ($p>0.05$), we can proceed to perform a standard one-way ANOVA. Otherwise, we would go for an Alexander-Govern's test or Welch's *F* test instead.\n", + "\n", + "<div class=\"alert alert-block alert-info\" markdown=\"1\">\n", + "The Welch's *F* test is not available in `scipy.stats` nor in `statsmodels`. Install the `Pingouin` package and check out the [welch_anova](https://pingouin-stats.org/generated/pingouin.welch_anova.html) function instead.\n", + "</div>\n", + "\n", + "The Bartlett's test statistic follows $\\chi^2_{k-1}$ with $k$ the number of groups. As most tests based on the $\\chi^2$ distribution, the *p*-value is one-sided." + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "id": "b8123d48-7285-4fa3-8473-04f316dedffc", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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fNwfvapHx5n18zF/H4IZZ9b+j7M/l7mO9fL3eby/RyH3GfViy+8zg3LKqcapnOKf2JRTAh+ncsqpxxnUnKKV2kVERERExDOh2mVLRERERESKARUkIiIiIiLiGRUkIiIiIiLiGRUkIiIiIiLiGRUkIiIiIiLiGRUkIiIiIiLiGRUkIiIiIiLimSivAxApaowxlwIXAWWBD6y1P3kbkYiIhCvlFCkOtDCiSIAYY8oBL1trB3gdi4iIhDflFCnK1GVLJHD+D3jb6yBERKRIUE6RIksFicgpMsaUMsZsNMb8M+vntsaYucaYOGPMC8CP1trZHocpIiJhQDlFijN12RIpBGNMAjATaAr8CVwHdAZuAGYAc621//EuQhERCRfKKVJcqSARKSRjzCJgPjDHWvui1/GIiEj4Uk6R4khdtkQKbz5QBXjZ60BERCTsKadIsaOCRKQQjDEVgXOBb6y1mV7HIyIi4Us5RYorddkSKQRjzEhgP3DAWnuL1/GIiEj4Uk6R4kotJCKnyBhzK3AIeBjo4HE4IiISxpRTpDhTC4nIKTDGnA6MAjpYa3cbY34GrLW2u8ehiYhImFFOkeJOBYmIiIiIiHhGXbZERERERMQzKkhERERERMQzKkhERERERMQzKkhERERERMQzKkhERERERMQzKkhERERERMQzKkhERERERMQzKkhERERERMQzKkhERERERMQz/w8pvX2eIg7QBAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 957.6x295.2 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grid = np.linspace(0, 20, 200)\n", + "\n", + "dfs = [2, 3, 5, 9]\n", + "\n", + "_, axes = plt.subplots(1, 2, figsize=(13.3,4.1))\n", + "\n", + "ax = axes[0]\n", + "for df, color in zip(\n", + " dfs,\n", + " ['blue', 'green', 'orange', 'red'],\n", + "):\n", + " chi2 = stats.chi2.pdf(grid, df)\n", + " ax.plot(grid, chi2, '-', color=color)\n", + " \n", + "ax.axhline(0, linestyle='--', color='grey', linewidth=1)\n", + "ax.set_xlim(grid[0],grid[-1])\n", + "ax.set_xlabel('$\\chi^2$')\n", + "ax.set_ylabel('probability density')\n", + "ax.legend([ f'$df={df}$' for df in dfs ])\n", + "\n", + "ax = axes[1]\n", + "df, color = 2, 'blue'\n", + "chi2 = stats.chi2.pdf(grid, df)\n", + "ax.plot(grid, chi2, '-', color=color)\n", + "ax.axhline(0, linestyle='--', color='grey', linewidth=1)\n", + "ax.set_xlim(grid[0],grid[-1])\n", + "ax.set_xlabel('$\\chi^2$')\n", + "ax.set_ylabel('probability density');\n", + "\n", + "A = [85, 86, 88, 75, 78, 94, 98, 79, 71, 80]\n", + "B = [91, 92, 93, 85, 87, 84, 82, 88, 95, 96]\n", + "C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]\n", + "bartlett_statistic, bartlett_pvalue = stats.bartlett(A, B, C)\n", + "bartlett_statistic_line, = ax.plot([bartlett_statistic]*2, [0, stats.chi2.pdf(bartlett_statistic, df)], '-', zorder=1)\n", + "\n", + "tail = grid[bartlett_statistic<=grid]\n", + "ax.fill_between(tail, np.zeros_like(tail), stats.chi2.pdf(tail, df), alpha=.2)\n", + "\n", + "ax.annotate(f'$\\\\approx {bartlett_pvalue:.2f}$', (4, .02), xytext=(8, .1), arrowprops=dict(arrowstyle=\"->\"));" + ] + }, + { + "cell_type": "markdown", + "id": "b73039db-6593-4c0c-be5e-854ddeffe79e", + "metadata": {}, + "source": [ + "## $\\chi^2$ tests\n", + "\n", + "When the sum of the observations is known, *e.g.* observations are frequencies -- proportions that sum to $1$, we use a $\\chi^2$ test instead of an ANOVA.\n", + "\n", + "### Goodness-of-fit\n", + "\n", + "Example:\n", + "Comparing the frequencies of the different allele variants at a given locus between a reference genome and a test genome.\n", + "\n", + "Another popular example: [Color proportion of M&Ms [Coursera]](https://www.coursera.org/learn/stanford-statistics/lecture/rAwbR/the-color-proportions-of-m-ms):\n", + "\n", + "| blue | orange | green | yellow | red | brown |\n", + "| :-: | :-: | :-: | :-: | :-: | :-: |\n", + "| 24% | 20% | 16% | 14% | 13% | 13% |" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "84f4e9b3-a653-422c-8fc5-83b29869ba87", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "410" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expected_props = np.array([ .24, .2, .16, .14, .13, .13 ])\n", + "observed_counts = np.array([ 85, 79, 56, 64, 58, 68 ])\n", + "np.sum(observed_counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8bb2916a-e9a4-4bbe-b04f-14818bb68723", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([98.4, 82. , 65.6, 57.4, 53.3, 53.3])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expected_counts = expected_props * np.sum(observed_counts)\n", + "expected_counts" + ] + }, + { + "cell_type": "markdown", + "id": "a75bd8d7-f61e-49bc-80b4-cb1f05ccd7c1", + "metadata": {}, + "source": [ + "| | blue | orange | green | yellow | red | brown |\n", + "| --: | :-: | :-: | :-: | :-: | :-: | :-: |\n", + "| Expected | 98.4 | 82 | 65.6 | 57.4 | 53.3 | 53.3 |\n", + "| Observed | 85 | 79 | 56 | 64 | 58 | 58 |\n", + "\n", + "The statistic is:\n", + "\n", + "$$\n", + "\\chi^2 = \\sum_{i=1}^{k} \\frac{(O_i - E_i)^2}{E_i} \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\mbox{ } \\sim \\chi^2_{k-1} \\mbox{ } \\textrm{under} \\mbox{ } H_0\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "a8898631-a5b5-49e8-a158-3e149345391a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8.566983829178941" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "k = len(expected_counts)\n", + "chi2 = np.sum((observed_counts - expected_counts) ** 2 / expected_counts)\n", + "chi2" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7a8af457-13dc-483a-90e3-50d3949c8edf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.1276329790529603" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pvalue = stats.chi2(k-1).sf(chi2)\n", + "pvalue" + ] + }, + { + "cell_type": "markdown", + "id": "92886c91-f6ef-419d-bfda-e28d9dfcc7bc", + "metadata": {}, + "source": [ + "`scipy.stats`'s implementation of the test is [chisquare](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html):" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1e246915-e9be-4826-9677-d9f30348d0df", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Power_divergenceResult(statistic=8.566983829178941, pvalue=0.1276329790529603)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.chisquare(observed_counts, expected_counts)" + ] + }, + { + "cell_type": "markdown", + "id": "eedc49b0-07a1-474f-91ef-509148d8c6ca", + "metadata": {}, + "source": [ + "### Homogeneity and independence\n", + "\n", + "Example:\n", + "Comparing the frequency of cell types in cultures that differ in the treatments:\n", + "\n", + "| Observed | Type A cells | Type B cells | Type C cells | Type D cells |\n", + "| --: | :-: | :-: | :-: | :-: |\n", + "| Treatment 1 | 134 | 86 | 32 | 11 |\n", + "| Treatment 2 | 101 | 92 | 38 | 8 | \n", + "| Treatment 3 | 188 | 67 | 54 | 19 |\n", + "\n", + "$H_0$: the treatments have no effect on the frequency of the cell types.\n", + "\n", + "https://www.coursera.org/learn/stanford-statistics/lecture/78IMJ/the-chi-square-test-for-homogeneity-and-independence" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "13145d41-7dc3-4eff-9f9c-38d0abed1e8d", + "metadata": {}, + "outputs": [], + "source": [ + "observed_counts = np.array([\n", + " [ 134, 86, 32, 11 ],\n", + " [ 101, 92, 38, 8 ],\n", + " [ 188, 67, 54, 19 ],\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "fe4ce304-25ac-4734-9a0a-e20db59b742f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.50963855, 0.29518072, 0.14939759, 0.04578313])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expected_props = np.sum(observed_counts, axis=0) / np.sum(observed_counts)\n", + "expected_props" + ] + }, + { + "cell_type": "markdown", + "id": "7f4b4727-3a9b-474f-b6ad-b632be97b04e", + "metadata": {}, + "source": [ + "Under $H_0$, the expected proportions are:\n", + "\n", + "| Expected | Type A cells | Type B cells | Type C cells | Type D cells |\n", + "| --: | :-: | :-: | :-: | :-: |\n", + "| Treatment 1 | 51% | 29% | 15% | 5% |\n", + "| Treatment 2 | 51% | 29% | 15% | 5% | \n", + "| Treatment 3 | 51% | 29% | 15% | 5% |" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "087ea780-304c-459d-a7c0-066817f3d82f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[134.03493976, 77.63253012, 39.29156627, 12.04096386],\n", + " [121.80361446, 70.54819277, 35.7060241 , 10.94216867],\n", + " [167.16144578, 96.81927711, 49.00240964, 15.01686747]])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expected_counts = np.outer(np.sum(observed_counts, axis=1), expected_props)\n", + "expected_counts" + ] + }, + { + "cell_type": "markdown", + "id": "c0f49b1a-3a7a-4ad8-8d2a-9fd3513ad2a6", + "metadata": {}, + "source": [ + "| Expected | Type A cells | Type B cells | Type C cells | Type D cells |\n", + "| --: | :-: | :-: | :-: | :-: |\n", + "| Treatment 1 | 134 | 77.6 | 39.3 | 12 |\n", + "| Treatment 2 | 121.8 | 70.5 | 35.7 | 10.9 | \n", + "| Treatment 3 | 167.2 | 96.8 | 49 | 15 |" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "d9585b87-f5dd-4cf2-ad91-0a79dcc95c86", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "26.7075512595244" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "j, k = expected_counts.shape\n", + "dof = (j - 1) * (k - 1)\n", + "chi2 = np.sum((observed_counts - expected_counts) ** 2 / expected_counts)\n", + "chi2" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "a7cd985e-eb2b-4a72-a221-30e3e0fdf8ec", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.00016426084515914902" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.chi2(dof).sf(chi2)" + ] + }, + { + "cell_type": "markdown", + "id": "13d7ef58-e62d-48de-a3a4-2ccc2ac588cb", + "metadata": {}, + "source": [ + "`scipy.stats`'s $\\chi^2$ test for homogeneity/independence is [chi2_contingency](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html):" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "4cd7ea08-110a-4ff7-9521-0f12e4169d35", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(26.707551259524408,\n", + " 0.0001642608451591484,\n", + " 6,\n", + " array([[134.03493976, 77.63253012, 39.29156627, 12.04096386],\n", + " [121.80361446, 70.54819277, 35.7060241 , 10.94216867],\n", + " [167.16144578, 96.81927711, 49.00240964, 15.01686747]]))" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.chi2_contingency(observed_counts)" + ] + }, + { + "cell_type": "markdown", + "id": "45da92b9-cd4e-4d1b-8996-451285ef1896", + "metadata": {}, + "source": [ + "Due to the design of the test, it doesn't matter what factor is considered neutral under $H_0$:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "d7e7fd75-068c-4f37-b981-498890c4a0d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(26.707551259524408,\n", + " 0.0001642608451591484,\n", + " 6,\n", + " array([[134.03493976, 121.80361446, 167.16144578],\n", + " [ 77.63253012, 70.54819277, 96.81927711],\n", + " [ 39.29156627, 35.7060241 , 49.00240964],\n", + " [ 12.04096386, 10.94216867, 15.01686747]]))" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.chi2_contingency(observed_counts.T)" + ] + }, + { + "cell_type": "markdown", + "id": "5655a86a-84ab-42ab-98c0-5166242c1d1f", + "metadata": {}, + "source": [ + "## Analyses of association (recap)\n", + "\n", + "| Test | Types of variables |\n", + "| :-: | :-- |\n", + "| $\\chi^2$ test | categorical *vs* categorical |\n", + "| ANOVA | categorical (*e.g.* group) *vs* continuous (measurement) |\n", + "| ? | continuous *vs* continuous |\n", + "\n", + "## Correlation\n", + "\n", + "## Effect sizes and confidence intervals\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de47ba11-f486-44e3-9f3b-9ddffacc95ee", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/StatsModels.ipynb b/notebooks/StatsModels.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..f2dd6fd7b17131d18b0fdfc4dac8741e38f38d4b --- /dev/null +++ b/notebooks/StatsModels.ipynb @@ -0,0 +1,2057 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 280, + "id": "ce9d2cf1-9281-4a58-9dcd-3b0b1ab7cb0b", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: statsmodels in /home/flaurent/.local/lib/python3.8/site-packages (0.12.2)\n", + "Requirement already satisfied: scipy>=1.1 in /home/flaurent/.local/lib/python3.8/site-packages (from statsmodels) (1.7.1)\n", + "Requirement already satisfied: numpy>=1.15 in /home/flaurent/.local/lib/python3.8/site-packages (from statsmodels) (1.21.1)\n", + "Requirement already satisfied: patsy>=0.5 in /home/flaurent/.local/lib/python3.8/site-packages (from statsmodels) (0.5.1)\n", + "Requirement already satisfied: pandas>=0.21 in /home/flaurent/.local/lib/python3.8/site-packages (from statsmodels) (1.3.1)\n", + "Requirement already satisfied: six in /usr/lib/python3/dist-packages (from patsy>=0.5->statsmodels) (1.14.0)\n", + "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/lib/python3/dist-packages (from pandas>=0.21->statsmodels) (2.7.3)\n", + "Requirement already satisfied: pytz>=2017.3 in /usr/lib/python3/dist-packages (from pandas>=0.21->statsmodels) (2019.3)\n" + ] + } + ], + "source": [ + "import sys\n", + "!\"{sys.executable}\" -m pip install statsmodels" + ] + }, + { + "cell_type": "markdown", + "id": "f0b66572-e886-4b73-9a82-2f26a1295280", + "metadata": {}, + "source": [ + "<div style=\"text-align: center;\"><img alt=\"StatsModels logo\" src=\"img/statsmodels-logo-v2-horizontal.svg\" width=\"30%\" /></div>\n", + "\n", + "The `statsmodels` library stands out for its general modelling approach for designing statistical tests.\n", + "It leverages the principle of *regression* to represent the association between multiple variables." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d6590258-e1ac-4f62-8adf-3fa014376a22", + "metadata": {}, + "outputs": [], + "source": [ + "import statsmodels.api as sm\n", + "import statsmodels.formula.api as smf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7b4f63c1-9995-4516-aeb5-1fb4fe1db896", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from matplotlib import pyplot as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "markdown", + "id": "6cafc4c9-9d2e-4af1-b077-d9e1775fc352", + "metadata": {}, + "source": [ + "In the previous class, we performed an ANOVA to determine whether the following 3 groups of observations differ in their means:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "aec2f6b1-c4fc-465e-9434-b32333770e24", + "metadata": {}, + "outputs": [], + "source": [ + "A = [85, 86, 88, 75, 78, 94, 98, 79, 71, 80]\n", + "B = [91, 92, 93, 85, 87, 84, 82, 88, 95, 96]\n", + "C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bd00bd2f-b7eb-47e4-8af4-187ce9473481", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "F_onewayResult(statistic=2.3575322551335636, pvalue=0.11384795345837218)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from scipy import stats\n", + "stats.f_oneway(A, B, C)" + ] + }, + { + "cell_type": "markdown", + "id": "69aa48a3-1623-413b-b49d-1777b8ef92c9", + "metadata": {}, + "source": [ + "We can perform the same analysis with a linear model.\n", + "\n", + "Every modelling approach relies on a dataframe-like data layout. Each variable or factor should be coded as a column in a dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "696ff83f-d827-4513-9801-51488e5a1df0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([85, 86, 88, 75, 78, 94, 98, 79, 71, 80, 91, 92, 93, 85, 87, 84, 82,\n", + " 88, 95, 96, 79, 78, 88, 94, 92, 85, 83, 85, 82, 81]),\n", + " array(['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B',\n", + " 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C',\n", + " 'C', 'C', 'C', 'C'], dtype='<U1'))" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = np.concatenate((A, B, C))\n", + "Group = np.repeat(['A', 'B', 'C'], (len(A), len(B), len(C)))\n", + "X, Group" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c324bd0f-e769-4a0d-8e6b-d4d346e76f68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>X</th>\n", + " <th>Group</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>85</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>86</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>88</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>75</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>78</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>94</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>98</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>79</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>71</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>80</td>\n", + " <td>A</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>91</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>92</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>93</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>85</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>87</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>84</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>16</th>\n", + " <td>82</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>17</th>\n", + " <td>88</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>18</th>\n", + " <td>95</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>96</td>\n", + " <td>B</td>\n", + " </tr>\n", + " <tr>\n", + " <th>20</th>\n", + " <td>79</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>21</th>\n", + " <td>78</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>22</th>\n", + " <td>88</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>23</th>\n", + " <td>94</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>24</th>\n", + " <td>92</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25</th>\n", + " <td>85</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>26</th>\n", + " <td>83</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>27</th>\n", + " <td>85</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>28</th>\n", + " <td>82</td>\n", + " <td>C</td>\n", + " </tr>\n", + " <tr>\n", + " <th>29</th>\n", + " <td>81</td>\n", + " <td>C</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " X Group\n", + "0 85 A\n", + "1 86 A\n", + "2 88 A\n", + "3 75 A\n", + "4 78 A\n", + "5 94 A\n", + "6 98 A\n", + "7 79 A\n", + "8 71 A\n", + "9 80 A\n", + "10 91 B\n", + "11 92 B\n", + "12 93 B\n", + "13 85 B\n", + "14 87 B\n", + "15 84 B\n", + "16 82 B\n", + "17 88 B\n", + "18 95 B\n", + "19 96 B\n", + "20 79 C\n", + "21 78 C\n", + "22 88 C\n", + "23 94 C\n", + "24 92 C\n", + "25 85 C\n", + "26 83 C\n", + "27 85 C\n", + "28 82 C\n", + "29 81 C" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataframe = pd.DataFrame(dict(X=X, Group=Group))\n", + "dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c5544b7f-f731-4d82-8a83-61a790a1ef48", + "metadata": {}, + "outputs": [], + "source": [ + "del X, C, Group # we'll see why this statement later..." + ] + }, + { + "cell_type": "markdown", + "id": "e8178ed0-28b0-49e0-a8f0-034ebbf8a223", + "metadata": {}, + "source": [ + "`statsmodels` understands the Wilkinson formulae introduced in S and popularized by R.\n", + "\n", + "Let us designate *X* as the *dependent variable* or *response variable* in our analysis.\n", + "We use the query `'X ~ Group'`, or equivalently `'X ~ C(Group)'`, or else `'X ~ C(Group) + 1'`, to build a linear model of the effect of the *Group* categorical variable on *X*:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "21bf5c1d-caa3-4072-bc86-ce860b8f33c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: X R-squared: 0.149\n", + "Model: OLS Adj. R-squared: 0.086\n", + "Method: Least Squares F-statistic: 2.358\n", + "Date: Wed, 08 Sep 2021 Prob (F-statistic): 0.114\n", + "Time: 18:40:12 Log-Likelihood: -96.604\n", + "No. Observations: 30 AIC: 199.2\n", + "Df Residuals: 27 BIC: 203.4\n", + "Df Model: 2 \n", + "Covariance Type: nonrobust \n", + "==============================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "Intercept 83.4000 2.019 41.308 0.000 79.257 87.543\n", + "Group[T.B] 5.9000 2.855 2.066 0.049 0.041 11.759\n", + "Group[T.C] 1.3000 2.855 0.455 0.653 -4.559 7.159\n", + "==============================================================================\n", + "Omnibus: 0.758 Durbin-Watson: 1.379\n", + "Prob(Omnibus): 0.684 Jarque-Bera (JB): 0.665\n", + "Skew: 0.336 Prob(JB): 0.717\n", + "Kurtosis: 2.715 Cond. No. 3.73\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" + ] + } + ], + "source": [ + "fitted_model = smf.ols('X ~ Group', data=dataframe).fit()\n", + "print(fitted_model.summary())" + ] + }, + { + "cell_type": "markdown", + "id": "fa80f8df-1f58-4de0-be95-a551d27e07eb", + "metadata": {}, + "source": [ + "---\n", + "\n", + "In the summary table, we find the same *F* statistic and corresponding *p*-value as with `scipy.stats.f_oneway`:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "638bdd6b-6964-4209-b762-2991fd3fb7fc", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "F_onewayResult(statistic=2.3575322551335636, pvalue=0.11384795345837218)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = [85, 86, 88, 75, 78, 94, 98, 79, 71, 80]\n", + "B = [91, 92, 93, 85, 87, 84, 82, 88, 95, 96]\n", + "C = [79, 78, 88, 94, 92, 85, 83, 85, 82, 81]\n", + "stats.f_oneway(A, B, C)" + ] + }, + { + "cell_type": "markdown", + "id": "e64a5b9a-9214-4ecc-ad70-2505c5b9e78c", + "metadata": {}, + "source": [ + "To get a more classical table layout:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0fe841a0-21b1-4c92-a767-c4ab3abd37f8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " df sum_sq mean_sq F PR(>F)\n", + "Group 2.0 192.2 96.100000 2.357532 0.113848\n", + "Residual 27.0 1100.6 40.762963 NaN NaN\n" + ] + } + ], + "source": [ + "anova_table = sm.stats.anova_lm(fitted_model)\n", + "print(anova_table)" + ] + }, + { + "cell_type": "markdown", + "id": "e30bf249-4720-488e-a5d4-39497ca1e1c1", + "metadata": {}, + "source": [ + "The residuals are what the model cannot account for:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "a5b2750a-8965-4769-b053-cd95e3583320", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEGCAYAAAAwpAFeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAaw0lEQVR4nO3de5xdZX3v8c83oZgJgULINIQMQ4DhplQCmeKFS0GwIocawkEEFVEpwR54RahWsFKhFc8BDI2dtgJDicZabiopHKSRixesPS8Ok4s0ASUDJnFiEoZLIFch4dc/1koyDDOzdyZr7b323t/367Vfe+9nr2et3x6e8NvrWc96HkUEZmZmRTOi2gGYmZkNxAnKzMwKyQnKzMwKyQnKzMwKyQnKzMwKabdqB1COcePGxaRJk6odhtWp+fPnvxARzdU4ttu25amabTsLNZGgJk2aRFdXV7XDsDolaXm1ju22bXmqZtvOgrv4zMyskJygzMyskJygzMwalKTZkp6XtLhP2bWSVkpalD7OqFZ8TlBmZo3rW8DpA5TPiojJ6ePBCse0nROUmVmDiojHgJeqHcdgnKDMzOrXOEldfR7Ty6x3maQn0y7AfXKNcAhOUGZm9euFiGjv8+gso87NwCHAZGAVcFOeAQ6lJu6DGq6Ojg66u7tLbtfT0wNAS0tLyW3b2tqYMWPGLsdmtivcti0vEbFm22tJtwEPVCuWuk5Q5dq0aVO1QzDLhdu27SxJEyJiVfp2GrB4qO3zVNcJqtxfg9u26+joyDMcs8y4bVsWJN0JnExyraoHuAY4WdJkIIBlwCXViq+uE5SZmQ0uIs4foPj2igcyCA+SMDOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQvJcfDXCyyuYWaNxgqozXl7BzOqFE1SN8PIKZtZofA3KzMwKyQnKzMwKKdcEJemzkhZLWiLp8rTsWkkrJS1KH2fkGYOZmdWm3K5BSToKuBg4DngNmCfpgfTjWRExM69jm5lZ7ctzkMSRwOMRsRFA0k+Bs3M8npmZ1ZE8u/gWAydK2lfSaOAM4ID0s8skPSlptqR9BqosabqkLkldvb29OYZpZmZFlFuCioingRuAh4B5wCJgK3AzcAgwGVgF3DRI/c6IaI+I9ubm5rzCNDOzgsp1kERE3B4RUyLiJOBl4JmIWBMRWyPiDeA2kmtUZmZmb5L3KL4/SJ9bSa4/3SFpQp9NppF0BZqZmb1J3jNJfF/SvsDrwKURsVbSP0iaDASwDLgk5xjMzKwG5ZqgIuLEAcouyPOYZmZWHzyThJmZFZIni7WK89IhZlYOJygrLC8dYtbYnKCs4rx0iFkxSJoNnAk8HxFHpWVjgbuBSSQD2c6NiJerEZ+vQZmZNa5vAaf3K7sKeDQiDgUeTd9XhROUmVmDiojHgJf6FU8F5qSv5wBnVTKmvtzFZ2ZWv8ZJ6urzvjMiOkvUGR8Rq9LXq4Hx+YRWmhOUmVn9eiEi2odbOSJCUmQZ0M5wF5+ZmfW1ZtuUdOnz89UKxAnKzMz6uh+4MH19IXBftQJxF1+VlXvTarmWLl0KlD+Uuxy+CdastDxuQId8//1JuhM4meRaVQ9wDXA9cI+ki4DlwLm5HLwMTlBV1t3dzTOLF9A6Zmsm+9v99eSkePOyJzLZ34r1IzPZj5klinQDekScP8hHp1Y0kEE4QRVA65itXN2+vtphDOi6rjHVDsGsJvgG9Oz5GpSZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRWSE5SZmRVSrglK0mclLZa0RNLladlYSQ9LWpo+75NnDGZmVptyW7BQ0lHAxcBxwGvAPEkPANOBRyPieklXAVcBV+YVh5kVWx5Lpee5TLpVTp5nUEcCj0fExojYAvwUOBuYCsxJt5kDnJVjDGZWJzZt2lSo5dItf3ku+b4Y+KqkfYFNwBlAFzA+Ilal26wGxg9UWdJ0krMtWltbcwzTzKrJS6XbYHI7g4qIp4EbgIeAecAiYGu/bQKIQep3RkR7RLQ3NzfnFaaZmRVUnmdQRMTtwO0Akv430AOskTQhIlZJmgA8n2cMRdfT08OGdSO5rmtMtUMZ0PJ1I9kj7fs3M6ukvEfx/UH63Epy/ekO4H7gwnSTC4H78ozBzMxqU65nUMD302tQrwOXRsRaSdcD90i6CFgOnJtzDIXW0tLC5i2ruLp9fbVDGdB1XWMYVcaoKTOzrOXdxXfiAGUvAqfmeVwzM6t9nknCzMwKyQnKzMwKKe9rUGZmVmCSlgHrSG4D2hIR7dWNaAcnKDMzOyUiXqh2EP25i8/MzArJCcrMrLEF8JCk+ekUc4XhLj4zs/o1TlJXn/edEdHZb5sTImJlOrHCw5J+GRGPVTDGQTlBmZnVrxdKDXqIiJXp8/OS5pIskVSIBOUuPjOzBiVpD0l7bnsN/AnJShSF4DMoM7PGNR6YKwmSfHBHRMyrbkg7OEGZmTWoiHgOOLracQymJhNUuUtEl2vp0qVA+QunlcvLTtvOqoW27XZtlVKTCaq7u5uF//UUb4wem8n+9FqyZuL8Z1dnsj+AERtfymxf1jiK3rbdrq2SajJBAbwxeiyb335mtcMY1KinHqh2CBWV9S9/aNxf/0Vu243Wrq26ajZBWbF0d3ezcMlC2DvDnb6RPC1cuTCb/a3NZjdmtnMkHQ8siogNkj4OHAv8fUQsH6qeE5RlZ2944+Q3qh3FoEb8xHdVmFXJzcDRko4GPgf8M/Bt4I+HquQEZWaZc5ev9bMlIkLSVOAfI+L2dFX1ITlBmVnmuru7eWbxAlrHbM1sn7u/npwBb172RCb7W7F+ZCb7sbKsk/RF4OPASZJGAL9XqpITlJnlonXMVq5uX1/tMAZ1XdeYaofQSD4CfBS4KCJWS2oFvlaqkhOUmZnlKiJWA3/X5/0KkmtQQ3KCMjOzXEhaR7Kcx1s+AiIi9hqqvhOUmZnlIiL23JX6TlBmZkOohemnoDZGJKZrTo3a9j7t6huUE5SZ2RAyvwk96xvQofA3oUv6EHATsD/wPHAg8DTwjqHqOUGZmZWyt29C30VfAd4NPBIRx0g6hWTI+ZAK/63MzKzmvR4RLwIjJI2IiB8DQ670Cz6DKoQV60dmdk/Gmo3Jb47xo7P5tbdi/UgOy2RPZtbA1koaQ7KU/L9Keh7YUKpSrglK0hXAn5EMM/wv4FPALSTzL72SbvbJiFiUZxxF1tbWlun+XksvwI6adGgm+zuM7GM0s4YzFdgMXAF8DPh94G9LVcotQUmaCMwA3h4RmyTdA5yXfvyXEfG9vI5dS7IedbNtfx0dHZnu18xsuCKi79nSnHLr5d3FtxvQJOl1YDTw25yPZ2ZmBdPvht3dSebh21DqRt3cBklExEpgJrACWAW8EhEPpR9/VdKTkmZJettA9SVNl9Qlqau3tzevMM3MLGcRsWdE7JUmpCbgfwLfKFUvtwQlaR+SfseDSMa+75EuVPVF4Ajgj4CxwJUD1Y+Izohoj4j25ubmvMI0M7MKisS/AR8ote2gXXySWge7y1fSiRHxsxL7Pg34dUT0pnXuBd4bEd9JP/+dpG8Cny8VpJmZ1S5JZ/d5O4JkiPnmUvWGugb1E0m3ADdFxNb0IONJ7gY+gtJj2FcA75Y0GtgEnAp0SZoQEaskCTgLWFwqSDMzq2l/2uf1FmAZSQ/bkIZKUFOA64FFkj4L/CHwF8CNwCdK7TgiHpf0PWBBGtBCoBP4d0nNJLPZLgI+U2pfZmZWuyLiU8OpN2iCioiXgUvS5PQIyQi8d0dEz04EdQ1wTb/i9w0nUDMzqy2S/oGBl9sAICKGvM9m0EESkvaWdCvJzbWnA98jOftxgjEzs3J0AfNJZjA/FliaPiaTDDcf0lBdfAtIhgFeGhFbgIckTQa+IWl5RJy/a3FbPenp6YFXCj5p5VroKb8DwMx2UUTMAZD058AJaS4hHd9QaqDdkAnqpP7deemURO+VdPGwIzYzs0azD7AX8FL6fkxaNqShrkEN+lMzIm7b2eisvrW0tNCr3sIvSdAysaXaYZgVhqTTgb8HRgL/HBHX53So64GFkn5MMkDuJODaUpU8m7mZZa6np4cN67KbpT8Py9eNZI+exu3ylTQS+Cfg/UAP8ISk+yPiqayPFRHflPTvwLvSoisjYnWpegW+YGBmZjk6DuiOiOci4jXgLsq4N2lnSDoifT6WZEah36SP/dOyIfkMyqyafvtbkLa/PeAjH2H9Ky8ze+aF28tufc9ZdB4/jXk3f5bmDWsBeHr8gXz8gr/lSw/N5uwnf7p92w985uscuWYZX5/79e1l173/k8w9+hTm99nnYwdP5oqzr2DWvbM46blF28unfH4O037xY65++Fvbyy6fdjlPj5/ED2+5fEfcmzdDZydMmQILFiRlEyYk3+faa7l37tztm6665JDk41uf3V72ysnNvHLKePaf+Ut2W7cFgNcmjGL1Z9oYe/9Kxsx/efu2Kz93OLuv2kTzHTsmtnnxT/dnQ/tYWq/ZcZ//psP2pPdjB9L8r8tpembd9vIVf3MUe3S9xL7/d8dc1b0fbeXGzeP42ty5O/7+F1888Hc65xw+9dRyPn3vb7bX//Tn3wnA7JlPbi+7/fQWZp/Ryn1XP8G4V18H4Jcte3DRF47mC3c9y9T/XLN926lfaefwFeu58bZfbi+74SMHc//x+/HzGf+5vew/3rEPV15yJDfc+jQnLNnxNzm+47186OerufLu57aXdZ65d/L3nziRPsZJ6urzvjMiOtPXE0mSxTY97DjDycpfANNJJnjoLyhx25EiBh2iXhjt7e3R1bXjbzxjxgzmP7uazW8/s4pRDW3UUw8w5ZD9Kr7sRbWW25gxYwYLVy4s/DWoYyYe85a/jaT5EVFydc881FrbLrddz5gxg83LnuDq9vUVimznXdc1hlGT/qis71KPbVvSOcDpEfFn6fsLgHdFxGW5B1wmd/GZmTWmlcABfd63pGWZk/RhSXumr6+WdK+kY0rVc4IyM2tMTwCHSjpI0u4kC8ren9Ox/joi1kk6gWQi8dtJVlcfkq9BmZkNoV5vQo+ILZIuA35IMsx8dkQsySE6gK3p8/8guQ72A0nXlarkBGVm1qAi4kHgwQocamU6dd77gRvShWpLZvyaTFA9PT2M2PgKo556oNqhDGrExhfp6dlS7TCsxhS9bTdiu/ZN6Jk4l2RO15kRsVbSBOAvS1Uq8DmrmZnVg4jYCDwPnJAWbSGZNHZINXkG1dLSwprf7VbYobiQDMdtadmv2mFYjSl623a7tuGQdA3JIreHA98Efg/4DnD8UPVqMkE1oo6ODrq7u0tut3Rp8qNk2/1QQ2lraytrOzOzXTQNOIZklQwi4rfbhp0PxQmqzjQ1NVU7BDOz/l6LiJAUAJL2KKeSE1SN8JmOmdUiSQIeSEfx7Z0u1/RpoOSqGE5QZmaWm/TM6cMk8/K9SnId6ssR8XCpuk5QZmaWtwXA2ogoObS8LycoMzPL27uAj0laDmzYVhgR7xyqkhOUZWdtxtPBbJsIO6s179aSLDBgZpX2geFUcoKyTLS1tWW+z21D5g+deGg2O5yYT5xmNrSIWD6cek5Qlok8RhlWa20rMysGT3VkZmaF5ARlZmaF5ARlZmaF5ARlZmaFlGuCknSFpCWSFku6U9KodHnhxyV1S7o7XWrYzMzsTXJLUJImAjOA9og4imRJ4fOAG4BZEdEGvAxclFcMZmZWu/IeZr4b0CTpdWA0sAp4H/DR9PM5wLXAzTnHYWY2fGszvAk96xvQoW5vQs8tQUXESkkzgRXAJuAhYD7JfEzb1ozuYZA/q6TpwHSA1tbWvMI0MxtS1jd3Z34DOtTtTei5JShJ+wBTgYNI8vt3SdakL0tEdAKdAO3t7ZFDiGZmJWV9E7pvQC9fnl18pwG/joheAEn3kizvu7ek3dKzqBZgZY4xmFmVrFg/kuu6suvHWrMx6WIbP/qNTPa3Yv1IDstkT5aXPBPUCuDdkkaTdPGdCnQBPwbOAe4CLgTuyzEGM6uCPLqbXku7xkZNyqZr7DDqs1usnuR5DepxSd8jWQdkC7CQpMvuB8Bdkq5Ly27PKwYzqw7PzWhZyHUUX0RcA1zTr/g54Lg8j2tmZrXPM0mYmVkhOUGZmVkhOUGZmVkhOUGZmdlbSLpW0kpJi9LHGZWOwSvqmpnZYGZFxMxqHdxnUGZmVkg1ewY1YuNLjHrqgUz2pc2vAhCj9spkf5DEB/tltj9rHEVu227XNWecpK4+7zvTaeTKdZmkT5BMsvC5iHg52/CGVpMJKvvJG9cBcOghWf7D2893qdtOK37bdruuMS9ERPtgH0p6hIF/cXyJZJWJrwCRPt8EfDqPIAdTkwnKkzfWto6ODrq7u0tut23W53L+e7e1teUye0GluW1bJUXEaeVsJ+k2IJvT+p3ga1BWWE1NTTQ1NVU7DLOGJGlCn7fTgMWVjqEmz6CsttXDmY5ZA7hR0mSSLr5lwCWVDsAJyszM3iIiLqh2DO7iMzOzQnKCMjOzQnKCMjOzQnKCMjOzQnKCMjOzQvIoPjOzDORxAzrUz03ow+EEZWZWQb75vHxOUGZmGWjUs5w8+RqUmZkVkhOUmZkVkrv4zKyqPLu9DcYJysxqggcXNB4nKDOrKp/p2GB8DcrMzArJCcrMzAopty4+SYcDd/cpOhj4MrA3cDHQm5b/VUQ8mFccZmZWm3JLUBHxK2AygKSRwEpgLvApYFZEzMzr2GZmVvsq1cV3KvBsRCyv0PHMzKzGVSpBnQfc2ef9ZZKelDRb0j4VisHMzGpI7glK0u7Ah4DvpkU3A4eQdP+tAm4apN50SV2Sunp7ewfaxMzM6lglzqA+CCyIiDUAEbEmIrZGxBvAbcBxA1WKiM6IaI+I9ubm5gqEaWZmRVKJBHU+fbr3JE3o89k0YHEFYjAzsxqT60wSkvYA3g9c0qf4RkmTgQCW9fvMzMwMyDlBRcQGYN9+ZRfkeUwzM6sPnknCzMwKyQnKzMwKyQnKzMwKyQnKzMzeQtKHJS2R9Iak9n6ffVFSt6RfSfpAXjF4PSgzMxvIYuBs4Na+hZLeTjI70DuA/YFHJB0WEVuzDsBnUGZm9hYR8XQ66Xd/U4G7IuJ3EfFroJtBJlzYVU5QZmb1a9y2KePSx/QM9jkR+E2f9z1pWebcxWdmVr9eiIj2wT6U9Aiw3wAffSki7ssvrPI4QZmZNaiIOG0Y1VYCB/R535KWZc5dfGZmtjPuB86T9DZJBwGHAv8/jwM5QZmZ2VtImiapB3gP8ANJPwSIiCXAPcBTwDzg0jxG8IG7+MzMbAARMReYO8hnXwW+mncMPoMyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCcoIyM7NCquu5+Do6Ouju7i653dKlSwGYMWNGyW3b2trK2s4sT27b1gjqOkGVq6mpqdohmOXCbdtqWV0nKP8atHrltm2NwNegzMyskJygzMyskHJLUJIOl7Soz+NVSZdLGivpYUlL0+d98orBzMxqV24JKiJ+FRGTI2IyMAXYSLI641XAoxFxKPBo+t7MzOxNKtXFdyrwbEQsB6YCc9LyOcBZFYrBzMxqSKUS1HnAnenr8RGxKn29Ghg/UAVJ0yV1Serq7e2tRIxmZlYguScoSbsDHwK+2/+ziAggBqoXEZ0R0R4R7c3NzTlHaWZmRVOJM6gPAgsiYk36fo2kCQDp8/MViMHMzGqMkpOYHA8g3QX8MCK+mb7/GvBiRFwv6SpgbER8ocQ+eoHluQYK44AXcj5Gpfi77JwDI6Iqp+lu2zutXr5Lpb5H1dp2FnJNUJL2AFYAB0fEK2nZvsA9QCvJP8xzI+Kl3IIok6SuiGivdhxZ8Hexvurpb1gv36Vevkfecp3qKCI2APv2K3uRZFSfmZnZoDyThJmZFZIT1A6d1Q4gQ/4u1lc9/Q3r5bvUy/fIVe6DJMzMzIbDZ1BmZlZITlBmZlZITlCApLMkhaQjqh3LrpC0NZ05/heSFkh6b7VjGi5J+0m6S9KzkuZLelDSYdWOq9bUQ9t2u25cTlCJ84H/SJ9r2aZ0BvmjgS8C/6faAQ2HJJHMfP+TiDgkIqaQfJ8B5220IdVD23a7blANn6AkjQFOAC4imdS2XuwFvFztIIbpFOD1iLhlW0FE/CIiflbFmGpOnbZtt+sGkuuNujViKjAvIp6R9KKkKRExv9pBDVOTpEXAKGAC8L7qhjNsRwG1+t+gSOqlbbtdN6iGP4Mi6fq4K319F/XRFXIEcDrw7bRbwRpTvbRtt+sG1dD3QUkaC/QAvSTLfoxMnw+MGvzDSFofEWP6vF8D/GFE1NSM8ZJOBa6JiJOqHUutqqe27XbduBr9DOoc4F8i4sCImBQRBwC/Bk6scly7LB21NRJ4sdqxDMOPgLdJmr6tQNI7JdX8f5cKqsu27XbdWBo9QZ1PMqqmr+9Tu10hTelw3EXA3cCFEbG1yjHttPQX/jTgtHQ47hKSkVurqxtZTamntu123aAauovPzMyKq9HPoMzMrKCcoMzMrJCcoMzMrJCcoMzMrJCcoMzMrJCcoApM0nhJd0h6Lp35+P9JmlbtuMx2ldu2lcMJqqDSqVz+DXgsIg5OZz4+D2jpt53nU7Sa4rZt5fJ9UAWVTovy5Yj44wE++yRwNjCG5K76acBs4GBgIzA9Ip6UdC2wPiJmpvUWA2emu5lHMnHlscAS4BMRsTHP72QGbttWPp9BFdc7gAVDfH4scE76j/xvgIUR8U7gr4Bvl7H/w4FvRMSRwKvA/9rFeM3K5bZtZXGCqhGS/ildUfSJtOjhiHgpfX0C8C8AEfEjYF9Je5XY5W8i4ufp6++k+zCrOLdtG4wTVHEtIfklCUBEXAqcCjSnRRvK2McW3vzfeFSf1/37dt3Xa5Xitm1lcYIqrh8BoyT9eZ+y0YNs+zPgYwCSTgZeiIhXgWWk/yOQdCxwUJ86rZLek77+KMmy4GaV4LZtZfEgiQKTNAGYBbyLZF2fDcAtQBPQHhGXpduNZeALyU3AfcBE4HHgPcAH093PA7qAKcBTwAW+kGyV4rZt5XCCakCSJgEPRMRR1Y7FLEtu2/XFXXxmZlZIPoMyM7NC8hmUmZkVkhOUmZkVkhOUmZkVkhOUmZkVkhOUmZkV0n8DpaNUpJQLqecAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 432x288 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "_, axes = plt.subplots(1, 2)\n", + "sns.boxplot(x='Group', y='X', data=dataframe, ax=axes[0])\n", + "ax = axes[1]\n", + "sns.boxplot(x=dataframe['Group'], y=fitted_model.resid, ax=ax)\n", + "ax.set_ylabel('residuals')\n", + "ax.yaxis.set_label_position('right')\n", + "ax.yaxis.tick_right()\n", + "ax.axhline(0, linestyle='--', color='red', linewidth=1);" + ] + }, + { + "cell_type": "markdown", + "id": "a30928ea-89bd-40d1-aabf-93c9ff35686c", + "metadata": {}, + "source": [ + "In the bottom part of the table, a few statistics are given about the *residuals*:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "fc687c84-7ad2-4055-b00d-efbcb4545ea2", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==============================================================================\n", + "Omnibus: 0.758 Durbin-Watson: 1.379\n", + "Prob(Omnibus): 0.684 Jarque-Bera (JB): 0.665\n", + "Skew: 0.336 Prob(JB): 0.717\n", + "Kurtosis: 2.715 Cond. No. 3.73\n", + "==============================================================================\n" + ] + } + ], + "source": [ + "print(fitted_model.summary().tables[-1])" + ] + }, + { + "cell_type": "markdown", + "id": "38dc6aff-1529-4114-812b-8b802f857f4e", + "metadata": {}, + "source": [ + "For example, we find mentions of an [Omnibus test of normality](https://www.statsmodels.org/stable/generated/statsmodels.stats.stattools.omni_normtest.html) (*Omnibus*) and the [Jarque-Bera test of normality](https://www.statsmodels.org/stable/generated/statsmodels.stats.stattools.jarque_bera.html) (*JB*), and intermediate measurements of skewness (*Skew*) and kurtosis (*Kurtosis*).\n", + "The so-called omnibus test is actually the D'Agostino-Pearson test (`scipy.stats.normaltest`) applied to the residuals:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1ecb4ddd-d9f4-42cb-8611-0f0d69da4972", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "NormaltestResult(statistic=0.7583012334839461, pvalue=0.6844425164005732)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.normaltest(fitted_model.resid)" + ] + }, + { + "cell_type": "markdown", + "id": "01bf4c98-61b6-455e-a9fe-098f1b68abac", + "metadata": {}, + "source": [ + "Note that, here, the kurtosis is estimated as $\\beta_2$ and its expected value for a normal distribution is $3$.\n", + "\n", + "The [Durbin-Watson statistic](https://www.statsmodels.org/stable/generated/statsmodels.stats.stattools.durbin_watson.html) quantifies the autocorrelation of the residuals.\n", + "This statistic takes values in the $[0,4]$ range, it should be as close as possible to $2$, and informs about the homoscedasticity (=equality of variance) of the residuals.\n", + "\n", + "## Model\n", + "\n", + "The middle table is the most important one. It gives information about the terms in the linear model, and how significant is the contribution of each term in the model." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "02834d6d-cc6a-4746-9f2e-443c10a65fd3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==============================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "Intercept 83.4000 2.019 41.308 0.000 79.257 87.543\n", + "Group[T.B] 5.9000 2.855 2.066 0.049 0.041 11.759\n", + "Group[T.C] 1.3000 2.855 0.455 0.653 -4.559 7.159\n", + "==============================================================================\n" + ] + } + ], + "source": [ + "print(fitted_model.summary().tables[1])" + ] + }, + { + "cell_type": "markdown", + "id": "546d7d79-a709-4178-b338-acf08d0a29cf", + "metadata": {}, + "source": [ + "Three terms are mentioned, meaning that the *response variable* `X` is approximated as `a + b * Group[T.B] + c * Group[T.C]` with `a` the *intercept*. `a`, `b` and `c` are given in the `coef` column.\n", + "\n", + "At this point, we may ask:\n", + "\n", + "* why is `Group` decomposed as `Group[T.B]` and `Group[T.C]`?\n", + "* why group `A`, or `Group[T.A]`, does not appear in the table?\n", + "* why does the intercept equal group `A`'s mean?\n", + "\n", + "On the other side, `ols` did model group `A` as can be checked running post-hoc tests (more about these tests later):" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cdd44a30-6648-495f-98e7-c89739921066", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>coef</th>\n", + " <th>std err</th>\n", + " <th>t</th>\n", + " <th>P>|t|</th>\n", + " <th>Conf. Int. Low</th>\n", + " <th>Conf. Int. Upp.</th>\n", + " <th>pvalue-hs</th>\n", + " <th>reject-hs</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>B-A</th>\n", + " <td>5.9</td>\n", + " <td>2.855275</td>\n", + " <td>2.066351</td>\n", + " <td>0.048510</td>\n", + " <td>0.041461</td>\n", + " <td>11.758539</td>\n", + " <td>0.138585</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C-A</th>\n", + " <td>1.3</td>\n", + " <td>2.855275</td>\n", + " <td>0.455298</td>\n", + " <td>0.652535</td>\n", + " <td>-4.558539</td>\n", + " <td>7.158539</td>\n", + " <td>0.652535</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C-B</th>\n", + " <td>-4.6</td>\n", + " <td>2.855275</td>\n", + " <td>-1.611053</td>\n", + " <td>0.118798</td>\n", + " <td>-10.458539</td>\n", + " <td>1.258539</td>\n", + " <td>0.223484</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " coef std err t P>|t| Conf. Int. Low Conf. Int. Upp. \\\n", + "B-A 5.9 2.855275 2.066351 0.048510 0.041461 11.758539 \n", + "C-A 1.3 2.855275 0.455298 0.652535 -4.558539 7.158539 \n", + "C-B -4.6 2.855275 -1.611053 0.118798 -10.458539 1.258539 \n", + "\n", + " pvalue-hs reject-hs \n", + "B-A 0.138585 False \n", + "C-A 0.652535 False \n", + "C-B 0.223484 False " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "post_hoc_tests = fitted_model.t_test_pairwise('Group')\n", + "post_hoc_tests.result_frame" + ] + }, + { + "cell_type": "markdown", + "id": "e669dc20-cefa-4c40-9aa8-ed4299270731", + "metadata": {}, + "source": [ + "### Design matrices\n", + "\n", + "To understand what is happening, let us first have a look at the *endog* and *exog* matrices:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "86386730-0784-4304-bb82-c8909e7ffb01", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(DesignMatrix with shape (30, 1)\n", + " X\n", + " 85\n", + " 86\n", + " 88\n", + " 75\n", + " 78\n", + " 94\n", + " 98\n", + " 79\n", + " 71\n", + " 80\n", + " 91\n", + " 92\n", + " 93\n", + " 85\n", + " 87\n", + " 84\n", + " 82\n", + " 88\n", + " 95\n", + " 96\n", + " 79\n", + " 78\n", + " 88\n", + " 94\n", + " 92\n", + " 85\n", + " 83\n", + " 85\n", + " 82\n", + " 81\n", + " Terms:\n", + " 'X' (column 0),\n", + " DesignMatrix with shape (30, 3)\n", + " Intercept Group[T.B] Group[T.C]\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 0 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 1 0\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " 1 0 1\n", + " Terms:\n", + " 'Intercept' (column 0)\n", + " 'Group' (columns 1:3))" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from patsy import dmatrices\n", + "dmatrices('X ~ Group', dataframe)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "c0640c00-cfc4-4ef0-a76b-25db6c4a3400", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: formulaic in /home/flaurent/.local/lib/python3.8/site-packages (0.2.4)\n", + "Requirement already satisfied: astor in /home/flaurent/.local/lib/python3.8/site-packages (from formulaic) (0.8.1)\n", + "Requirement already satisfied: interface-meta>=1.2 in /home/flaurent/.local/lib/python3.8/site-packages (from formulaic) (1.2.4)\n", + "Requirement already satisfied: pandas in /home/flaurent/.local/lib/python3.8/site-packages (from formulaic) (1.3.1)\n", + "Requirement already satisfied: wrapt in /home/flaurent/.local/lib/python3.8/site-packages (from formulaic) (1.12.1)\n", + "Requirement already satisfied: scipy in /home/flaurent/.local/lib/python3.8/site-packages (from formulaic) (1.7.1)\n", + "Requirement already satisfied: numpy in /home/flaurent/.local/lib/python3.8/site-packages (from formulaic) (1.21.1)\n", + "Requirement already satisfied: pytz>=2017.3 in /usr/lib/python3/dist-packages (from pandas->formulaic) (2019.3)\n", + "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/lib/python3/dist-packages (from pandas->formulaic) (2.7.3)\n" + ] + } + ], + "source": [ + "import sys\n", + "!\"{sys.executable}\" -m pip install formulaic" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b9c4d0f8-ad65-4c37-bd31-2afcad0d1a42", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "( X\n", + " 0 85\n", + " 1 86\n", + " 2 88\n", + " 3 75\n", + " 4 78\n", + " 5 94\n", + " 6 98\n", + " 7 79\n", + " 8 71\n", + " 9 80\n", + " 10 91\n", + " 11 92\n", + " 12 93\n", + " 13 85\n", + " 14 87\n", + " 15 84\n", + " 16 82\n", + " 17 88\n", + " 18 95\n", + " 19 96\n", + " 20 79\n", + " 21 78\n", + " 22 88\n", + " 23 94\n", + " 24 92\n", + " 25 85\n", + " 26 83\n", + " 27 85\n", + " 28 82\n", + " 29 81,\n", + " Intercept Group[T.B] Group[T.C]\n", + " 0 1.0 0 0\n", + " 1 1.0 0 0\n", + " 2 1.0 0 0\n", + " 3 1.0 0 0\n", + " 4 1.0 0 0\n", + " 5 1.0 0 0\n", + " 6 1.0 0 0\n", + " 7 1.0 0 0\n", + " 8 1.0 0 0\n", + " 9 1.0 0 0\n", + " 10 1.0 1 0\n", + " 11 1.0 1 0\n", + " 12 1.0 1 0\n", + " 13 1.0 1 0\n", + " 14 1.0 1 0\n", + " 15 1.0 1 0\n", + " 16 1.0 1 0\n", + " 17 1.0 1 0\n", + " 18 1.0 1 0\n", + " 19 1.0 1 0\n", + " 20 1.0 0 1\n", + " 21 1.0 0 1\n", + " 22 1.0 0 1\n", + " 23 1.0 0 1\n", + " 24 1.0 0 1\n", + " 25 1.0 0 1\n", + " 26 1.0 0 1\n", + " 27 1.0 0 1\n", + " 28 1.0 0 1\n", + " 29 1.0 0 1)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from formulaic import model_matrix\n", + "model_matrix('X ~ Group', dataframe)" + ] + }, + { + "cell_type": "markdown", + "id": "ca7ee778-b453-4890-ae89-c7453f1a0b57", + "metadata": {}, + "source": [ + "The first argument is a vector that represents the response variable we previously called *X*.\n", + "In the `statsmodels` terminology, it is called *endog*.\n", + "Here, this is a vector because we model a single response variable.\n", + "\n", + "The second argument is the (main) *design matrix*, referred to as *exog* in `statsmodels`, and represents the terms involved as input to the linear model.\n", + "As already said, fitting such a model consists in finding `a`, `b` and `c` such that:\n", + "\n", + "`X ~ a * Intercept + b * Group[T.B] + c * Group[T.C]`\n", + "\n", + "As the intercept is a constant, the corresponding term is always modelled as a constant vector.\n", + "\n", + "We can observe that the `Group` variable is represented as several binary variables; one per level of the original categorical variable, **minus one**.\n", + "These binary variables are called *dummy variables*. All categorical variables (more exactly: all *cardinal* variables) are translated this way, into multiple dummy variables.\n", + "\n", + "`A` is not explicitly modelled, because all the values in a `Group[T.A]` column could be predicted knowing the corresponding values in the other two `Group` columns.\n", + "In other words, a `Group[T.A]` dummy variable would not bring additional information.\n", + "\n", + "Basically, `A` is taken as a reference group. The intercept is enough to capture group A's mean, and the `Group[T.B]` and `Group[T.C]` variables encodes the offsets with group A's mean for the other 2 groups.\n", + "\n", + "We could force `ols` to explicitly use an additional dummy variable for group A, designing the matrices ourselves.\n", + "Let us first try just adding the dummy variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "8960bbfa-ef9f-4530-94eb-2a894140b51b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Intercept</th>\n", + " <th>Group A</th>\n", + " <th>Group B</th>\n", + " <th>Group C</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>1.0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>16</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>17</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>18</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>20</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>21</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>22</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>23</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>24</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>26</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>27</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>28</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>29</th>\n", + " <td>1.0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Intercept Group A Group B Group C\n", + "0 1.0 1 0 0\n", + "1 1.0 1 0 0\n", + "2 1.0 1 0 0\n", + "3 1.0 1 0 0\n", + "4 1.0 1 0 0\n", + "5 1.0 1 0 0\n", + "6 1.0 1 0 0\n", + "7 1.0 1 0 0\n", + "8 1.0 1 0 0\n", + "9 1.0 1 0 0\n", + "10 1.0 0 1 0\n", + "11 1.0 0 1 0\n", + "12 1.0 0 1 0\n", + "13 1.0 0 1 0\n", + "14 1.0 0 1 0\n", + "15 1.0 0 1 0\n", + "16 1.0 0 1 0\n", + "17 1.0 0 1 0\n", + "18 1.0 0 1 0\n", + "19 1.0 0 1 0\n", + "20 1.0 0 0 1\n", + "21 1.0 0 0 1\n", + "22 1.0 0 0 1\n", + "23 1.0 0 0 1\n", + "24 1.0 0 0 1\n", + "25 1.0 0 0 1\n", + "26 1.0 0 0 1\n", + "27 1.0 0 0 1\n", + "28 1.0 0 0 1\n", + "29 1.0 0 0 1" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "endog, exog = model_matrix('X ~ Group', dataframe)\n", + "exog['Group[T.A]'] = (dataframe['Group'] == 'A').astype(int)\n", + "exog = exog.rename(columns={'Group[T.A]': 'Group A', 'Group[T.B]': 'Group B', 'Group[T.C]': 'Group C'})\n", + "exog = exog[['Intercept', 'Group A', 'Group B', 'Group C']]\n", + "exog" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "id": "b18356ea-7df2-4596-abe4-b6a320280809", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: X R-squared: 0.149\n", + "Model: OLS Adj. R-squared: 0.086\n", + "Method: Least Squares F-statistic: 2.358\n", + "Date: Wed, 08 Sep 2021 Prob (F-statistic): 0.114\n", + "Time: 15:03:29 Log-Likelihood: -96.604\n", + "No. Observations: 30 AIC: 199.2\n", + "Df Residuals: 27 BIC: 203.4\n", + "Df Model: 2 \n", + "Covariance Type: nonrobust \n", + "==============================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "Intercept 64.3500 0.874 73.606 0.000 62.556 66.144\n", + "Group A 19.0500 1.674 11.380 0.000 15.615 22.485\n", + "Group B 24.9500 1.674 14.904 0.000 21.515 28.385\n", + "Group C 20.3500 1.674 12.156 0.000 16.915 23.785\n", + "==============================================================================\n", + "Omnibus: 0.758 Durbin-Watson: 1.379\n", + "Prob(Omnibus): 0.684 Jarque-Bera (JB): 0.665\n", + "Skew: 0.336 Prob(JB): 0.717\n", + "Kurtosis: 2.715 Cond. No. 2.39e+16\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", + "[2] The smallest eigenvalue is 6.98e-32. This might indicate that there are\n", + "strong multicollinearity problems or that the design matrix is singular.\n" + ] + } + ], + "source": [ + "overdefined_model = sm.OLS(endog, exog).fit()\n", + "print(overdefined_model.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "id": "fd06b73c-9ebf-43fa-a775-32ba2b2b1703", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.boxplot(x='Group', y='X', data=dataframe);\n", + "print(fitted_model.summary())" + ] + }, + { + "cell_type": "markdown", + "id": "cb434446-78f5-4642-86b5-9204bcafc7e8", + "metadata": {}, + "source": [ + "Note the complaint about multicollinearity of the design matrix.\n", + "\n", + "The proper way of explicitly modelling all 3 groups consists of omitting the intercept:" + ] + }, + { + "cell_type": "code", + "execution_count": 227, + "id": "7d002631-bd0b-4614-9783-7542b9c107d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: X R-squared: 0.149\n", + "Model: OLS Adj. R-squared: 0.086\n", + "Method: Least Squares F-statistic: 2.358\n", + "Date: Wed, 08 Sep 2021 Prob (F-statistic): 0.114\n", + "Time: 17:03:17 Log-Likelihood: -96.604\n", + "No. Observations: 30 AIC: 199.2\n", + "Df Residuals: 27 BIC: 203.4\n", + "Df Model: 2 \n", + "Covariance Type: nonrobust \n", + "==============================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "Group A 83.4000 2.019 41.308 0.000 79.257 87.543\n", + "Group B 89.3000 2.019 44.230 0.000 85.157 93.443\n", + "Group C 84.7000 2.019 41.952 0.000 80.557 88.843\n", + "==============================================================================\n", + "Omnibus: 0.758 Durbin-Watson: 1.379\n", + "Prob(Omnibus): 0.684 Jarque-Bera (JB): 0.665\n", + "Skew: 0.336 Prob(JB): 0.717\n", + "Kurtosis: 2.715 Cond. No. 1.00\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" + ] + } + ], + "source": [ + "del exog['Intercept']\n", + "cell_means_model = sm.OLS(endog, exog).fit()\n", + "print(cell_means_model.summary())" + ] + }, + { + "cell_type": "markdown", + "id": "5843e4f4-102a-4eda-bd9a-c62ecfa301e0", + "metadata": {}, + "source": [ + "This is fine in the case of one-way ANOVA.\n", + "\n", + "[More about design matrices](https://en.wikipedia.org/wiki/Design_matrix).\n", + "\n", + "### Wilkinson formulae\n", + "\n", + "As categorical variables may be encoded as numerical values -- in which case Python cannot guess these variables are categorical, it is good practice to always tag these variables as categorical with `C()`, *e.g.* `C(Group)`.\n", + "\n", + "The intercept is implicit; `Y ~ X` and `Y ~ X + 1` are equivalent formulae. The intercept can be excluded making its contribution negative: `Y ~ X - 1`:" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "id": "d3de4753-0da7-4fe9-8412-eff18d66accf", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true, + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: X R-squared: 0.149\n", + "Model: OLS Adj. R-squared: 0.086\n", + "Method: Least Squares F-statistic: 2.358\n", + "Date: Wed, 08 Sep 2021 Prob (F-statistic): 0.114\n", + "Time: 17:10:22 Log-Likelihood: -96.604\n", + "No. Observations: 30 AIC: 199.2\n", + "Df Residuals: 27 BIC: 203.4\n", + "Df Model: 2 \n", + "Covariance Type: nonrobust \n", + "===============================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "-------------------------------------------------------------------------------\n", + "C(Group)[A] 83.4000 2.019 41.308 0.000 79.257 87.543\n", + "C(Group)[B] 89.3000 2.019 44.230 0.000 85.157 93.443\n", + "C(Group)[C] 84.7000 2.019 41.952 0.000 80.557 88.843\n", + "==============================================================================\n", + "Omnibus: 0.758 Durbin-Watson: 1.379\n", + "Prob(Omnibus): 0.684 Jarque-Bera (JB): 0.665\n", + "Skew: 0.336 Prob(JB): 0.717\n", + "Kurtosis: 2.715 Cond. No. 1.00\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" + ] + } + ], + "source": [ + "fitted_model = smf.ols('X ~ C(Group) - 1', data=dataframe).fit()\n", + "print(fitted_model.summary())" + ] + }, + { + "cell_type": "markdown", + "id": "e28fe336-37b9-4fa4-8670-1416e61aaf24", + "metadata": {}, + "source": [ + "The regression coefficients are also implicit. Although `Y ~ X` corresponds to $Y \\sim a + bX$, we do not write `Y ~ a + b * X`.\n", + "`a` and `b` are not known and are to be inferred.\n", + "\n", + "We can introduce multiple input variables, *i.e.* several terms, and -- optionally -- their *interactions*: `Y ~ A + B + A:B`, `Y ~ X1 + X2 + X3 + X1:X2 + X1:X3 + X2:X3 + X1:X2:X3`, `Y ~ X^2`.\n", + "\n", + "`A*B` is equivalent to `A + B + A:B`.\n", + "\n", + "`Y ~ X^2` actually corresponds to $Y \\sim a + bX + cX^2$. Similarly to the intercept, the contribution of the first-order term can be excluded making it negative: `Y ~ X^2 - X` corresponds to $Y \\sim a + cX^2$.\n", + "\n", + "[More about these formulae](https://www.mathworks.com/help/stats/wilkinson-notation.html)." + ] + }, + { + "cell_type": "markdown", + "id": "9bb874ed-ea52-44d6-9cec-008be52945a7", + "metadata": {}, + "source": [ + "### Implementation detail" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "id": "b3fdcfa3-fe7a-48f3-9a2f-b01723a6e440", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "X = C = Group = 0 # any value\n", + "\n", + "fitted_model = smf.ols('X ~ C(Group)', data=dataframe).fit()\n", + "# raises:\n", + "\n", + "# >>> PatsyError: Error evaluating factor: TypeError: 'int' object is not callable\n", + "# >>> X ~ C(Group)\n", + "# >>> ^^^^^^^^" + ] + }, + { + "cell_type": "markdown", + "id": "f7a62c11-5794-42a4-9c7e-160babc13731", + "metadata": { + "tags": [] + }, + "source": [ + "`statsmodels` uses `patsy` for processing Wilkinson formulae.\n", + "Per default, `patsy` evaluates the terms in the parent namespace (here the global namespace), which often conflicts with previously defined object names.\n", + "This default behavior can be disabled with `eval_env=-1`:" + ] + }, + { + "cell_type": "code", + "execution_count": 272, + "id": "e3e4e71e-27a4-4c96-ab41-050f4f7597d6", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: X R-squared: 0.149\n", + "Model: OLS Adj. R-squared: 0.086\n", + "Method: Least Squares F-statistic: 2.358\n", + "Date: Wed, 08 Sep 2021 Prob (F-statistic): 0.114\n", + "Time: 18:29:21 Log-Likelihood: -96.604\n", + "No. Observations: 30 AIC: 199.2\n", + "Df Residuals: 27 BIC: 203.4\n", + "Df Model: 2 \n", + "Covariance Type: nonrobust \n", + "==============================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "Intercept 83.4000 2.019 41.308 0.000 79.257 87.543\n", + "Group[T.B] 5.9000 2.855 2.066 0.049 0.041 11.759\n", + "Group[T.C] 1.3000 2.855 0.455 0.653 -4.559 7.159\n", + "==============================================================================\n", + "Omnibus: 0.758 Durbin-Watson: 1.379\n", + "Prob(Omnibus): 0.684 Jarque-Bera (JB): 0.665\n", + "Skew: 0.336 Prob(JB): 0.717\n", + "Kurtosis: 2.715 Cond. No. 3.73\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" + ] + } + ], + "source": [ + "fitted_model = smf.ols('X ~ C(Group)', data=dataframe, eval_env=-1).fit()" + ] + }, + { + "cell_type": "markdown", + "id": "4d5ea642-c933-44d8-9995-e1fe1a2d71d4", + "metadata": { + "tags": [] + }, + "source": [ + "Advice: encapsulate the call to `smf.ols` so that `eval_env` is always `-1`:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "16c01b5e-771e-46ce-b86d-195137e8b775", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import statsmodels.formula.api as smf\n", + "def ols(*args, **kwargs):\n", + " kwargs['eval_env'] = -1\n", + " return smf.ols(*args, **kwargs)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "6768710f-e796-4452-8c52-1ca6f484f170", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "fitted_model = ols('X ~ C(Group)', data=dataframe).fit()" + ] + }, + { + "cell_type": "markdown", + "id": "3a9f7441-3a68-49f1-b0a8-6096a7115fa2", + "metadata": {}, + "source": [ + "## Two-way ANOVA\n", + "\n", + "The model for a two-way ANOVA can be formulated as `X ~ C(Factor1) * C(Factor2)`.\n", + "Let us borrow from [statology](https://www.statology.org/two-way-anova-python/) the following data example:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "4d947388-de44-4f13-b2c0-e8b392856b79", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame({'water': np.repeat(['daily', 'weekly'], 15),\n", + " 'sun': np.tile(np.repeat(['low', 'med', 'high'], 5), 2),\n", + " 'height': [6, 6, 6, 5, 6, 5, 5, 6, 4, 5,\n", + " 6, 6, 7, 8, 7, 3, 4, 4, 4, 5,\n", + " 4, 4, 4, 4, 4, 5, 6, 6, 7, 8]})" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "215e908f-2c5f-4ec3-9eb4-8cb67f75a2f6", + "metadata": {}, + "outputs": [], + "source": [ + "plant_model = ols('height ~ water * sun', data=df).fit()" + ] + }, + { + "cell_type": "markdown", + "id": "905ce01a-84fd-49a1-aae8-f1b66a3dd320", + "metadata": {}, + "source": [ + "Again, we can use [anova_lm](https://www.statsmodels.org/stable/generated/statsmodels.stats.anova.anova_lm.html) to print a condensed table:" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "cc06b3ed-a066-4de3-884c-a7c82729c359", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " df sum_sq mean_sq F PR(>F)\n", + "water 1.0 8.533333 8.533333 16.0000 0.000527\n", + "sun 2.0 24.866667 12.433333 23.3125 0.000002\n", + "water:sun 2.0 2.466667 1.233333 2.3125 0.120667\n", + "Residual 24.0 12.800000 0.533333 NaN NaN\n" + ] + } + ], + "source": [ + "anova_table = sm.stats.anova_lm(plant_model)\n", + "print(anova_table)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "60de13e5-b798-4312-8d06-0ef79f480760", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sum_sq df F PR(>F)\n", + "water 444.133333 2.0 416.3750 2.334993e-19\n", + "sun 24.866667 2.0 23.3125 2.371556e-06\n", + "water:sun 2.466667 2.0 2.3125 1.206671e-01\n", + "Residual 12.800000 24.0 NaN NaN\n" + ] + } + ], + "source": [ + "model_variant = ols('height ~ water * sun - 1', data=df).fit()\n", + "print(sm.stats.anova_lm(model_variant, typ=2))" + ] + }, + { + "cell_type": "markdown", + "id": "16bc5b35-3e0f-46d2-8147-fd76b811aa56", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\" markdown=\"1\">\n", + "Don't remove the intercept!\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "6968743b-dda3-4ce2-be82-38af74ee2ff9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: height R-squared: 0.737\n", + "Model: OLS Adj. R-squared: 0.682\n", + "Method: Least Squares F-statistic: 13.45\n", + "Date: Wed, 08 Sep 2021 Prob (F-statistic): 2.62e-06\n", + "Time: 20:32:54 Log-Likelihood: -29.792\n", + "No. Observations: 30 AIC: 71.58\n", + "Df Residuals: 24 BIC: 79.99\n", + "Df Model: 5 \n", + "Covariance Type: nonrobust \n", + "==============================================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "----------------------------------------------------------------------------------------------\n", + "Intercept 6.8000 0.327 20.821 0.000 6.126 7.474\n", + "water[T.weekly] -0.4000 0.462 -0.866 0.395 -1.353 0.553\n", + "sun[T.low] -1.0000 0.462 -2.165 0.041 -1.953 -0.047\n", + "sun[T.med] -1.8000 0.462 -3.897 0.001 -2.753 -0.847\n", + "water[T.weekly]:sun[T.low] -1.4000 0.653 -2.143 0.042 -2.748 -0.052\n", + "water[T.weekly]:sun[T.med] -0.6000 0.653 -0.919 0.367 -1.948 0.748\n", + "==============================================================================\n", + "Omnibus: 1.012 Durbin-Watson: 1.647\n", + "Prob(Omnibus): 0.603 Jarque-Bera (JB): 0.297\n", + "Skew: 0.201 Prob(JB): 0.862\n", + "Kurtosis: 3.275 Cond. No. 9.77\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" + ] + } + ], + "source": [ + "print(plant_model.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "4d1c85a8-2bd8-450b-8e84-632b25874e4f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>coef</th>\n", + " <th>std err</th>\n", + " <th>t</th>\n", + " <th>P>|t|</th>\n", + " <th>Conf. Int. Low</th>\n", + " <th>Conf. Int. Upp.</th>\n", + " <th>pvalue-hs</th>\n", + " <th>reject-hs</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>low-high</th>\n", + " <td>-1.0</td>\n", + " <td>0.46188</td>\n", + " <td>-2.165064</td>\n", + " <td>0.040547</td>\n", + " <td>-1.953274</td>\n", + " <td>-0.046726</td>\n", + " <td>0.079450</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>med-high</th>\n", + " <td>-1.8</td>\n", + " <td>0.46188</td>\n", + " <td>-3.897114</td>\n", + " <td>0.000683</td>\n", + " <td>-2.753274</td>\n", + " <td>-0.846726</td>\n", + " <td>0.002048</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>med-low</th>\n", + " <td>-0.8</td>\n", + " <td>0.46188</td>\n", + " <td>-1.732051</td>\n", + " <td>0.096100</td>\n", + " <td>-1.753274</td>\n", + " <td>0.153274</td>\n", + " <td>0.096100</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " coef std err t P>|t| Conf. Int. Low Conf. Int. Upp. \\\n", + "low-high -1.0 0.46188 -2.165064 0.040547 -1.953274 -0.046726 \n", + "med-high -1.8 0.46188 -3.897114 0.000683 -2.753274 -0.846726 \n", + "med-low -0.8 0.46188 -1.732051 0.096100 -1.753274 0.153274 \n", + "\n", + " pvalue-hs reject-hs \n", + "low-high 0.079450 False \n", + "med-high 0.002048 True \n", + "med-low 0.096100 False " + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "post_hoc_tests = plant_model.t_test_pairwise('sun')\n", + "post_hoc_tests.result_frame" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "25b21f28-f70d-466e-bbb6-8a6fc86b3696", + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWAAAAD4CAYAAADSIzzWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAb0UlEQVR4nO3df1TW9cH/8edbFExp1BL9wn1bypKF8uNCUSK7GGWaA9NleazlFLHSvu3U3Mm5zjiKzs52f/N0nKtluZK76RbDptuapaaSyCnlAlEBNZnhvIMb1L6VQCTg5/4DvG4NkEtT3oCvxzkePtfn+vx4XW89r+vD+3OBxnEcRESk8/WyHUBE5FqlAhYRsUQFLCJiiQpYRMQSFbCIiCW9L2XjAQMGOEOGDLlKUUSkx/j/h5u/3vhduzm6iIKCgpOO4wR/ff0lFfCQIUPweDxXLpWI9ExZSc1fp+fYTNFlGGOOtbVeUxAiIpaogEVELFEBi4hYogIWEbFEBSzXhJKSEiIjIykpKbEdRcRLBSw9Xm1tLcnJyZSWlpKSkkJtba3tSCKACliuAWlpaVRXV+M4DlVVVcyZM8d2JBHgEj8HLFdfUlKS7Qg9SmVlJWVlZZw9exaA+vp6srOz2bt3LyEhIZbT9Sw5OTm2I3Q7KmDp0erq6hg0aBD+/v7edWfOnKGurs5iKpFmKuAuRlcRly81NZVJkybx4IMPXpHjlZeXM2nSJIqLi1s9t2jRIhITE7nnnnva3T8jI4PAwECeeeaZK5JHeh4VsMhlWLp0qe0I0gPoJpx0itraWlJSUoiJiSEyMpKsrCyg+feLnDx5EgCPx+OdA8/IyCAtLY2kpCTCwsJYuXLlJZ1v27ZtxMbGEhUVRVpaGl999RX5+flMnToVgL/+9a9cd911nDlzhvr6esLCwto8TlNTE4899hgjRoxgwoQJfPnll0Dz1fb69esB2LRpE7fddhujRo3iqaeeYtKkSd79S0tLL/s1SM+nApZO8e677xIaGsq+ffsoLi5m4sSJHe5z6NAhNm/ezJ49e1iyZAkNDQ0AJCcnU1FR0e5+9fX1pKamkpWVxYEDB2hsbOTll18mNjaWoqIiAHJzc4mMjCQ/P5/du3cTHx/f5rGOHDnCk08+SUlJCTfccANvvfVWq3PNnTuXd955h4KCAk6cOOHTaxABFbB0kqioKLZu3crChQvJzc0lKCiow31SUlIICAhgwIABDBw4kKqqKqD5ijM0NLTd/Q4fPszQoUMJDw8HYNasWezcuZPevXvzne98h4MHD7Jnzx5++tOfsnPnTnJzc3G73W0ea+jQobhcLgBGjRpFeXn5Bc8fOnSIsLAwhg4dCsDDDz/s02sQARWwdJLw8HAKCwuJiooiPT3dO4fau3fvCz4idr6AgADvsp+fH42Njd84R2JiIu+88w59+vThnnvuYdeuXezatQu3283x48dxuVy4XC5WrVp1RTJcjdcgPYduwkmnqKio4Nvf/jYzZszghhtu4Pe//z3QPAdcUFDA97///Vbf3l+u7373u5SXl1NWVsatt97KH/7wB773ve8B4Ha7mTlzJjNnziQ4OJhTp05RVVVFZGQkxhjvFAXQ6mq3vXMdPXqU8vJyhgwZ4p3bFvGFroClUxw4cIAxY8bgcrlYsmQJ6enpACxevJinn36auLg4/Pz8fDpWR3PAffv2Zc2aNUybNo2oqCh69erFvHnzAIiPj6eqqorExEQAoqOjiYqKwhhzWa/ruuuu43e/+x0TJ05k1KhRXH/99T5Nr4gAGMdxfN44Li7O0f+IIXKhmpoaAgMDcRyHJ598kmHDhjF//nzbsezS/4hxAWNMgeM4cV9frytgkW9o9erVuFwuRowYweeff87cuXNtR5JuQnPAIt/Q/PnzdcUrl0VXwCIilqiARUQsUQGLiFiiAhYRsUQFLCJiiQpYRMQSFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGxRAUsImKJClhExBIVsIiIJSpgERFLVMAiIpaogEVELFEBi4hYogIWEbFEBSwiYokKWETEEhWwiIglKmAREUtUwCIilqiARUQsUQGLiFiiAhYRsUQFLCJiiQpYRMQSFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGxRAUsImKJClhExBIVsIiIJSpgERFLVMAiIpaogEVELFEBi4hYogIWEbFEBSwiYokKWETEEhWwiIglKmAREUtUwCIilqiARUQsUQH3BCUlEBnZ/FVEug0VcHdXWwvJyVBaCikpzY9FpFtQAXd3aWlQXQ2OA1VVMGeO7UQi4qPenXampKROO9U1o7ISysrg7Nnmx/X1kJ0Ne/dCSIjdbD1JTo7tBNJDdV4By5VXVweDBoG///+uO3Omeb2IdHmdV8C6irAqMzMTj8fDiy++2Oq5wMBAampqWq1ftWoV/fr1Y+bMmZd1XBG5OF0BS7vmzZtnO4JIj6abcJeptraWlJQUYmJiiIyMJCsrC4AhQ4Zw8uRJADweD0ktc98ZGRmkpaWRlJREWFgYK1eu7PAcSUlJzJ8/n7i4OCIiIsjPz2fq1KkMGzaM9PR073Zr165lzJgxuFwu5s6dS1NTEwBr1qwhPDycMWPGkJeXd9Fz/eIXvyAmJobbb7+dqqoqb+bly5cDkJ+fT3R0NC6XiwULFhAZGendt6KigokTJzJs2DB+9rOf+TiCIqICvkzvvvsuoaGh7Nu3j+LiYiZOnNjhPocOHWLz5s3s2bOHJUuW0NDQAEBycjIVFRVt7uPv74/H42HevHlMmTKFl156ieLiYjIzMzl16hQHDx4kKyuLvLw8ioqK8PPzY926dVRWVrJ48WLy8vLYtWsXpaWl7eaqra3l9ttvZ9++fSQmJrJ69epW28yePZtXXnnFe47zFRUVkZWVxYEDB8jKyuL48eMdjoWIqIAvW1RUFFu3bmXhwoXk5uYSFBTU4T4pKSkEBAQwYMAABg4c6L3S3LRpE6GhoW3uM3nyZO/5RowYQUhICAEBAYSFhXH8+HG2bdtGQUEBo0ePxuVysW3bNo4ePcru3btJSkoiODgYf39/pk+f3m4uf39/Jk2aBMCoUaMoLy+/4PnPPvuM06dPk5CQAMAPf/jDC54fN24cQUFB9O3bl+HDh3Ps2LEOx0JEVMCXLTw8nMLCQqKiokhPT2fp0qUA9O7dm7MtHwurr6+/YJ+AgADvsp+fH42NjR2e59w+vXr1umD/Xr160djYiOM4zJo1i6KiIoqKijh8+DAZGRntHq+pqQmXy4XL5WLRokUA9OnTB2PMJeX6pq9LRFTAl62iooJ+/foxY8YMFixYQGFhIdA8B1xQUADAW2+9ddVzjBs3jvXr11NdXQ3Ap59+yrFjx4iPj+f999/n1KlTNDQ0kJ2dDTQX5LmyPvem0ZEbbriB66+/nt27dwPw5ptvXp0XI3KNUQFfpgMHDnhvfC1ZssR7U2zx4sU8/fTTxMXFtZorbc/F5oA7Mnz4cJYtW8aECROIjo5m/PjxVFZWEhISQkZGBgkJCYwdO5aIiIjLOv45r732Go899hgul4va2lqfplxE5OKM4zg+bxwXF+d4PJ6rGEe6qpqaGgIDAwH49a9/TWVlJb/5zW8sp5IuKyup+ev0HJspugxjTIHjOHFfX6/PAYtP/vGPf/CrX/2KxsZGbrnlFjIzM21HEun2VMDik+nTp1/0kxQicuk0BywiYokKWETEEhWwiIglKmAREUtUwCIilqiARUQsUQGLiFiiAhYRsUQFLCJiiQpYRMQSFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGxRAUsImKJClhExBIVsIiIJSpgERFLVMAiIpaogEVELFEBi4hYogIWEbFEBSwiYokKWETEEhWwiIglKmAREUtUwCIilqiARUQsUQGLiFiiAhYRsUQFLCJiiQpYRMQSFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGxRAUsImKJClhExBIVsIiIJSpgERFLVMAiIpaogEVELFEBi4hYogIWEbFEBSwiYokKWETEEhWwyCUqKSkhMjKSkpIS21Gkm1MBi1yC2tpakpOTKS0tJSUlhdraWtuRpBtTAYtcgrS0NKqrq3Ech6qqKubMmWM7knRjvW0HkKsjKSnJdoQep7KykrKyMs6ePQtAfX092dnZ7N27l5CQEMvpupYVCUUA/OTlpEveNycn54pm6cpUwCI+qqurY9CgQfj7+3vXnTlzhrq6OouppDtTAfdQ19JVRFeWmZmJx+PhxRdfbPXckCFD8Hg8DBgwwEKyqywrCYCcX+VYjdHVaQ5YRMQSFbB0K7W1taSkpBATE0NkZCRZWVlA89XkyZMnAfB4PN458IyMDNLS0khKSiIsLIyVK1d2eI6kpCTmz59PXFwcERER5OfnM3XqVIYNG0Z6erp3u7Vr1zJmzBhcLhdz586lqakJgDVr1hAeHs6YMWPIy8vz6XW98MILREZGEhkZyYoVKwB4/vnnvXnnz5/P3XffDcD27dt55JFHfDqudG0qYOlW3n33XUJDQ9m3bx/FxcVMnDixw30OHTrE5s2b2bNnD0uWLKGhoQGA5ORkKioq2tzH398fj8fDvHnzmDJlCi+99BLFxcVkZmZy6tQpDh48SFZWFnl5eRQVFeHn58e6deuorKxk8eLF5OXlsWvXLkpLSzvMV1BQwJo1a9i9ezcffvghq1evZu/evbjdbnJzc4HmN5WamhoaGhrIzc0lMTHxEkZNuioVsHQrUVFRbN26lYULF5Kbm0tQUFCH+6SkpBAQEMCAAQMYOHAgVVVVAGzatInQ0NA295k8ebL3fCNGjCAkJISAgADCwsI4fvw427Zto6CggNGjR+Nyudi2bRtHjx5l9+7dJCUlERwcjL+/P9OnT+8w365du7j//vvp378/gYGBTJ06ldzcXEaNGkVBQQFffPEFAQEBJCQk4PF4yM3Nxe12X8KoSVelApZuJTw8nMLCQqKiokhPT2fp0qUA9O7d+4KPh50vICDAu+zn50djY2OH5zm3T69evS7Yv1evXjQ2NuI4DrNmzaKoqIiioiIOHz5MRkZGu8dramrC5XLhcrlYtGiRT6+1T58+DB06lMzMTO644w7cbjc7duygrKyMiIgIn44hXZsKWLqViooK+vXrx4wZM1iwYAGFhYVA8xxwQUEBAG+99dZVzzFu3DjWr19PdXU1AJ9++inHjh0jPj6e999/n1OnTtHQ0EB2djbQXPznyvrcm8Y5brebjRs3UldXR21tLRs2bPBe4brdbpYvX05iYiJut5tVq1YRGxuLMeaqv0a5+lTA0q0cOHDAe+NryZIl3ptiixcv5umnnyYuLg4/Pz+fjnWxOeCODB8+nGXLljFhwgSio6MZP348lZWVhISEkJGRQUJCAmPHjvXpSnXkyJGkpqYyZswY4uPjefTRR4mNjQWaC7iyspKEhAQGDRpE3759Nf3QgxjHcXzeOC4uzvF4PFcxjoj0CC2fA2Z6js0UXYYxpsBxnLivr9cVsIiIJSpgERFLVMAiIpaogEVELFEBi4hYogIWEbFEBSwiYokKWETEEhWwiIglKmAREUtUwCIilqiARUQsUQGLiFiiAhYRsUQFLCJiiQpYRMQSFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGxRAUsImKJClhExBIVsIiIJSpgERFLVMAiIpaogEVELFEBi4hYogIWEbFEBSwiYokKWETEEhWwiIglKmAREUtUwCIilqiARUQsUQGLiFiiAhYRsUQFLCJiiQpYRMQSFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGxRAUsImKJClhExBIVsIiIJSpgERFLVMAiIpaogEVELFEBi/QAJSUlREZGUlJSYjuKXAIVsEg3V1tbS3JyMqWlpaSkpFBbW2s7kvhIBSzSzaWlpVFdXY3jOFRVVTFnzhzbkcRHvW0HkGtHUlKS7Qg9TmVlJWVlZZw9exaA+vp6srOz2bt3LyEhIdZyrUgoAuAnLydZy3Al5eTkXJXjqoBFurG6ujoGDRqEv7+/d92ZM2eoq6uzmEp8pQKWTnO1riJsW7FiBY8//jj9+vWzHaVN5eXlTJo0ieLi4gvW5+TksHz5ct5+++3LOm5GRgaBgYE888wzrZ/MSgLgoVseol+/fsycOZPU1FQmTZrEgw8+eFnn64k0ByzyDa1YseKSrzibmpquUpquZd68ecycOdN2jC5LBSwCPP/886xcuRKA+fPnc/fddwOwfft2HnnkEQCeeOIJ4uLiGDFiBIsXLwZg5cqVVFRUcNddd3HXXXcBsGXLFhISEhg5ciTTpk2jpqYGgCFDhrBw4UJGjhxJdnZ2u1mioqL47LPPcByHm266iTfeeAOAmTNnsnXrVpqamliwYAGjR48mOjqaV1555YLXcW79uYznO3r0KLGxseTn53vXnT17lmHDhnHixAnv41tvvdX7+HzPPfcc4eHh3HnnnRw+fNi7fvXq1YwePZqYmBgeeOAB6r5qfoPJyMhg+fLlFxxj+/bt/OAHP/A+3rp1K/fff3+749GTqYBFALfbTW5uLgAej4eamhoaGhrIzc0lMTERaC4fj8fD/v37ef/999m/fz9PPfUUoaGh7Nixgx07dnDy5EmWLVvGe++9R2FhIXFxcbzwwgve89x0000UFhby0EMPsWjRIv72t7+1yjJ27Fjy8vIoKSkhLCzMm+uDDz7gjjvu4LXXXiMoKIj8/Hzy8/NZvXo1H3/8MVu2bOHIkSPs2bOHoqIiCgoK2Llzp/e4hw8f5oEHHiAzM5PRo0d71/fq1YsZM2awbt06AN577z1iYmIIDg6+IFdBQQFvvvkmRUVFbNq06YISnzp1Kvn5+ezbt4+IiAhe2/Hf7Y71XXfdxaFDh7wFv2bNGtLS0nz7i+phNAcsAowaNYqCggK++OILAgICGDlyJB6Ph9zcXO+V8Z///GdeffVVGhsbqayspLS0lOjo6AuO8+GHH1JaWsrYsWOB5htiCQkJ3uenT5/uXV66dGmbWdxuNzt37uSWW27hiSee4NVXX+WTTz7hxhtvpH///mzZsoX9+/ezfv16AD7//HOOHDnCli1b2LJlC7GxsQDU1NRw5MgRbr75Zk6cOMGUKVP4y1/+wvDhw1udMy0tjSlTpvCTn/yE119/ndmzZ7faJjc3l/vvv9871z158mTvc8XFxaSnp/PZZ59RU1PDvbd+1e5YG2P40Y9+xNq1a5k9ezYffPCB9yr/WqMCFgH69OnD0KFDyczM5I477iA6OpodO3ZQVlZGREQEH3/8McuXLyc/P58bb7yR1NRU6uvrWx3HcRzGjx/Pn/70pzbP079//w6zJCYm8tJLL/Gvf/2L5557jg0bNrB+/Xrcbrf3HL/97W+59957L9hv8+bNPPvss8ydO/eC9eXl5QQFBXHzzTeza9euNgt48ODBDBo0iO3bt7Nnzx7WrVvH8ePHue+++4DmudyLSU1NZePGjcTExJCZmUnOmp9fdPvZs2dz33330bdvX6ZNm0bv3tdmFWkKQqSF2+1m+fLlJCYm4na7WbVqFbGxsRhj+OKLL+jfvz9BQUFUVVXxzjvvePe7/vrrOX36NAC33347eXl5lJWVAc0/pfbRRx9dUo7Bgwdz8uRJjhw5QlhYGHfeeac3F8C9997Lyy+/TENDAwAfffQRtbW13Hvvvbz++uveOedPPvmE6upqAPz9/dmwYQNvvPEGf/zjH9s876OPPsqMGTOYNm0afn5+DB48mKKiIoqKipg3bx6JiYls3LiRL7/8ktOnT/P3v//du+/p06cJCQmhoaHBO5VxMaGhoYSGhrJs2bI2r7avFdfm245IG9xuN8899xwJCQn079+fvn37eq86Y2JiiI2N5bbbbmPw4MHeKQaAxx9/nIkTJ3rngjMzM3n44Yf56qvmb8OXLVtGeHh4q/MtWrSIuLi4C76VPyc+Pt77SQm3282zzz7LnXfeCTQXZXl5OSNHjsRxHIKDg9m4cSMTJkzg4MGD3imPwMBA1q5di5+fH9B89f32228zfvx4AgMD+da3vnXBOSdPnszs2bPbLcSRI0cyffp0YmJiGDhw4AXzyL/85S+Jj48nODiY+Ph4Tu8/0OF4P/LII5w4cYKIiIgOt+2pjOM4Pm8cFxfneDyeqxhHRGzxeDzMnz/fe9PvG2n5HDDTc9rd5Mc//jGxsbHXxI9OG2MKHMeJa7X+UgrYGHMCOHYlg10hA4CTtkNcBuXuXMrdvv8DBAMfAzVX6JgXyx0BnAU+Anwvoc5xNcb7Fsdxgr++8pIKuKsyxnjaenfp6pS7cyl351LujukmnIiIJSpgERFLekoBv2o7wGVS7s6l3J1LuTvQI+aARUS6o55yBSwi0u2ogEVELOmWBWyMed4Yc8gYs98Ys8EYc0M725UbYw4YY4qMMdZ/guQSck80xhw2xpQZYy7+Q/WdwBgzzRhTYow5a4xp9+M5XXC8fc3d1cb728aYrcaYIy1fb2xnu6aWsS4yxrT+tWqdpKPxM8YEGGOyWp7fbYwZYiFmKz7kTjXGnDhvjB+94iEcx+l2f4AJQO+W5f8A/qOd7cqBAbbzXkpuwA/4JxAG+AP7gOGWc0cA3wVygLiLbNfVxrvD3F10vP8f8POW5Z9f5N93TRcY4w7HD/i/wKqW5YeArG6SOxV48Wrm6JZXwI7jbHEcp7Hl4YfAv9vM4ysfc48ByhzHOeo4zhngTWBKZ2Vsi+M4Bx3HOdzxll2Lj7m73Hi3nP8/W5b/E/iBvSgd8mX8zn8964FxxhjTiRnb0iX+3rtlAX9NGvBOO885wBZjTIEx5vFOzOSL9nL/G3D8vMf/1bKuO+jK492erjjegxzHqWxZ/m9gUDvb9TXGeIwxHxpjftA50VrxZfy827RcgHwO3NQp6drn69/7Ay1ThuuNMYOvdIgu+9vQjDHv0fzz6V/3C8dx/tqyzS+ARqC93393p+M4nxhjBgJbjTGHHMfZ2c62V8QVyt3pfMntgy453l3RxXKf/8BxHMcY095nRW9pGe8wYLsx5oDjOP+80lmvYX8H/uQ4zlfGmLk0X8XffSVP0GUL2HGcey72vDEmFZgEjHNaJmzaOMYnLV+rjTEbaP6246oWwhXI/Qlw/jvtv7esu6o6yu3jMbrcePugy423MabKGBPiOE6lMSYEqG7nGOfG+6gxJgeIpXleszP5Mn7ntvkvY0xvIAg41Tnx2tVhbsdxzs/4e5rn5q+objkFYYyZCPwMmOw4Tpv/Ha0xpr8x5vpzyzTfACtua9vO4ktuIB8YZowZaozxp/mmhbU73L7qiuPto6443n8DZrUszwJaXckbY240xgS0LA8AxgKlnZbwf/kyfue/ngeB7e1dNHWiDnO3vPmdMxk4eMVT2L4beZl3MMtonr8pavlz7g5rKLCpZTmM5jub+4ASmr8l7fK5Wx4n0/xr+v7ZRXLfT/Mc2VdAFbC5m4x3h7m76HjfBGwDjgDvAd9uWR8H/L5l+Q7gQMt4HwDmWMzbavyApTRfaAD0BbJb/v3vAcJsj7GPuX/V8m95H7ADuO1KZ9CPIouIWNItpyBERHoCFbCIiCUqYBERS1TAIiKWqIBFRCxRAYuIWKICFhGx5H8Ax6rclSXV4scAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "y = 0\n", + "for var in ('sun', 'water'):\n", + " post_hoc_tests = plant_model.t_test_pairwise(var).result_frame[['coef', 'Conf. Int. Low', 'Conf. Int. Upp.', 'reject-hs']]\n", + " for contrast in post_hoc_tests.index:\n", + " mean, lower_bound, upper_bound, reject = post_hoc_tests.loc[contrast]\n", + " plt.errorbar(mean, y, lolims=True, xerr=[[mean-lower_bound], [upper_bound-mean]], yerr=0, linestyle='', c='red' if reject else 'black')\n", + " plt.text(mean, y, f'{var}: {contrast}', ha='center', va='top')\n", + " y -= 1\n", + "plt.axvline(0, color='darkorange')\n", + "plt.yticks([]);" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "64fd9fe9-046e-4250-a1c8-c5e322a50606", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>coef</th>\n", + " <th>Conf. Int. Low</th>\n", + " <th>Conf. Int. Upp.</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>low-high</th>\n", + " <td>-1.0</td>\n", + " <td>-1.953274</td>\n", + " <td>-0.046726</td>\n", + " </tr>\n", + " <tr>\n", + " <th>med-high</th>\n", + " <td>-1.8</td>\n", + " <td>-2.753274</td>\n", + " <td>-0.846726</td>\n", + " </tr>\n", + " <tr>\n", + " <th>med-low</th>\n", + " <td>-0.8</td>\n", + " <td>-1.753274</td>\n", + " <td>0.153274</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " coef Conf. Int. Low Conf. Int. Upp.\n", + "low-high -1.0 -1.953274 -0.046726\n", + "med-high -1.8 -2.753274 -0.846726\n", + "med-low -0.8 -1.753274 0.153274" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "post_hoc_tests[['coef', 'Conf. Int. Low', 'Conf. Int. Upp.']]" + ] + }, + { + "cell_type": "markdown", + "id": "827d51e2-aeda-4528-bbb5-cbc69c159230", + "metadata": {}, + "source": [ + "## Post-hoc tests and multiple comparisons\n", + "[t_test_pairwise](https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLSResults.t_test_pairwise.html)'s argument `method` that can take method names listed in [multipletests](https://www.statsmodels.org/stable/generated/statsmodels.stats.multitest.multipletests.html) for corrected *p*-value approaches.\n", + "\n", + "[MultiComparison.turkeyhsd](https://www.statsmodels.org/stable/generated/statsmodels.sandbox.stats.multicomp.MultiComparison.html) for the Turkey \"Honest Significant Differences\" post-hoc test." + ] + }, + { + "cell_type": "markdown", + "id": "779f4f5a-8a7f-43d9-8b83-5fe703361ff6", + "metadata": {}, + "source": [ + "## Regression\n", + "Continuous independent variables\n", + "\n", + "### " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}