diff --git a/notebooks/statsmodels_TP.ipynb b/notebooks/statsmodels_TP.ipynb index d876b1a113039f10883c8cec8b9226493fe0527f..256c2a7dcdc33957d374695e65f5a77deee3b38d 100644 --- a/notebooks/statsmodels_TP.ipynb +++ b/notebooks/statsmodels_TP.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": null, - "id": "d5065981", + "execution_count": 1, + "id": "4e16caf7", "metadata": {}, "outputs": [], "source": [ @@ -22,7 +22,7 @@ }, { "cell_type": "markdown", - "id": "4ddd8902", + "id": "358dce7a", "metadata": {}, "source": [ "# Multi-way ANOVA" @@ -30,7 +30,7 @@ }, { "cell_type": "markdown", - "id": "9c4680b9", + "id": "a1face9f", "metadata": { "heading_collapsed": true }, @@ -42,7 +42,7 @@ }, { "cell_type": "markdown", - "id": "d2d4fa47", + "id": "965cc75c", "metadata": {}, "source": [ "## A" @@ -51,14 +51,14 @@ { "cell_type": "code", "execution_count": null, - "id": "ae476b31", + "id": "7eb30cc9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "b32ced14", + "id": "154c1460", "metadata": { "heading_collapsed": true }, @@ -69,12 +69,12 @@ "\n", "Treat `Pclass` and `Sex` as factors.\n", "\n", - "Print an ANOVA table." + "Print an ANOVA table for different types of sum of squares.." ] }, { "cell_type": "markdown", - "id": "24492fad", + "id": "3ad89dec", "metadata": {}, "source": [ "## A" @@ -83,30 +83,56 @@ { "cell_type": "code", "execution_count": null, - "id": "0ad3c464", + "id": "39f58924", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "ded672e8", - "metadata": { - "heading_collapsed": true - }, + "id": "ecf3bcd9", + "metadata": {}, "source": [ "## Q\n", "\n", - "Let us ignore the not-normal residuals and play with post-hoc tests instead.\n", + "Because we have a large sample, we will ignore the not-normal residuals and play with post-hoc tests instead.\n", "\n", - "Split the ANOVA for levels of `Pclass` and `Sex`, perform all pairwise comparisons if it make sense, and correct for multiple comparisons.\n", + "First proceed considering type-3 sums of squares." + ] + }, + { + "cell_type": "markdown", + "id": "63677a0d", + "metadata": {}, + "source": [ + "## A" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09794922", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "d30cdb9c", + "metadata": {}, + "source": [ + "## Q\n", + "\n", + "Let us suppose we want to use type-1 sums of squares instead.\n", "\n", - "We are not interested in the significance of the slope of `Age` for the different levels of the factors." + "Proceed again to performing with `Sex` first, `Pclass` second, and `Age` last.\n", + "\n", + "In the post-hoc comparisons, we will disregard the effect of the slop of `Age`." ] }, { "cell_type": "markdown", - "id": "00ace9f5", + "id": "7a417d76", "metadata": {}, "source": [ "## A" @@ -115,14 +141,14 @@ { "cell_type": "code", "execution_count": null, - "id": "9f6645bb", + "id": "034acc94", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "9a863196", + "id": "b7b20012", "metadata": {}, "source": [ "# Linear model with multiple variables" @@ -130,21 +156,19 @@ }, { "cell_type": "markdown", - "id": "ef97cb7f", + "id": "144b0584", "metadata": { "heading_collapsed": true }, "source": [ "## Q\n", "\n", - "Load the `mi.csv` file and plot the variables `Temperature`, `HeartRate` and `PhysicalActivity`.\n", - "\n", - "We will try to «explain» `Temperature` from `HeartRate` and `PhysicalActivity`." + "Load the `mi.csv` file and plot the variables `Temperature` vs `HeartRate` and `PhysicalActivity`." ] }, { "cell_type": "markdown", - "id": "c66b1c3b", + "id": "35949307", "metadata": {}, "source": [ "## A" @@ -153,29 +177,25 @@ { "cell_type": "code", "execution_count": null, - "id": "4bdeea0c", + "id": "47cf88a3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "358d3903", - "metadata": { - "heading_collapsed": true - }, + "id": "62449fb6", + "metadata": {}, "source": [ "## Q" ] }, { "cell_type": "markdown", - "id": "f3003272", - "metadata": { - "hidden": true - }, + "id": "c71d2a4c", + "metadata": {}, "source": [ - "The `PhysicalActivity` variable exhibit a long-tail distribution. This is usually undesirable for an explanatory variable, because we cannot densely sample a large part of its domain of possible values, and therefore a model based on the data cannot be reliable.\n", + "The `PhysicalActivity` variable is very asymmetric. This is usually undesirable for an explanatory variable, because we cannot densely sample a large part of its domain of possible values, and therefore a model based on the data cannot be reliable.\n", "\n", "We will proceed to transforming `PhysicalActivity` using a simple natural logarithm. `log` is undefined at $0$ and tends to the infinite near $0$, which renders its straightforward application to `PhysicalActivity` inappropriate. Therefore we will also add $1$ to the `PhysicalActivity` measurements prior to applying `log`.\n", "\n", @@ -184,7 +204,7 @@ }, { "cell_type": "markdown", - "id": "34dff28d", + "id": "21e8879e", "metadata": {}, "source": [ "## A" @@ -193,14 +213,14 @@ { "cell_type": "code", "execution_count": null, - "id": "16e7787e", + "id": "0b8cac58", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "7887928e", + "id": "2c6d5225", "metadata": { "heading_collapsed": true }, @@ -214,7 +234,7 @@ }, { "cell_type": "markdown", - "id": "b9ed6879", + "id": "c47489e6", "metadata": {}, "source": [ "## A" @@ -223,14 +243,14 @@ { "cell_type": "code", "execution_count": null, - "id": "1044c8c6", + "id": "bf32c7e6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "49408adc", + "id": "1c7871a2", "metadata": { "heading_collapsed": true }, @@ -244,10 +264,8 @@ }, { "cell_type": "markdown", - "id": "1b977a53", - "metadata": { - "heading_collapsed": true - }, + "id": "12d7e9a5", + "metadata": {}, "source": [ "## A (with nested Q&A)" ] @@ -255,32 +273,20 @@ { "cell_type": "code", "execution_count": null, - "id": "b891fa3e", - "metadata": { - "hidden": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c469b3d5", - "metadata": { - "hidden": true - }, + "id": "82e9f8d6", + "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "475eb53d", - "metadata": { - "hidden": true - }, + "id": "66ddaa3e", + "metadata": {}, "source": [ "### Q\n", "\n", + "The interaction term is not significant, but most importantly, the increase in log-likelihood is very small; the interaction term does not help to better fit the model to the data.\n", + "\n", "To get a better intuition about the log-likelihood, plot it (with a dot plot) for different models, with one variable, with two variables, with and without interaction.\n", "\n", "Feel free to introduce one or two extra explanatory variables such as `BMI`." @@ -288,10 +294,8 @@ }, { "cell_type": "markdown", - "id": "f7a51e03", - "metadata": { - "hidden": true - }, + "id": "05844c56", + "metadata": {}, "source": [ "### A" ] @@ -299,16 +303,14 @@ { "cell_type": "code", "execution_count": null, - "id": "3a4295ad", - "metadata": { - "hidden": true - }, + "id": "2588d8d6", + "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "2474a218", + "id": "665a7a5c", "metadata": {}, "source": [ "# White test for homoscedasticity" @@ -316,7 +318,7 @@ }, { "cell_type": "markdown", - "id": "1bf04c2f", + "id": "6d0bdd7b", "metadata": {}, "source": [ "To keep things simple, let us use the `'Heart + PhysicalActivity'` or `'Heart + logPhysicalActivity'`.\n", @@ -328,7 +330,7 @@ }, { "cell_type": "markdown", - "id": "77c0d822", + "id": "a6f37b2e", "metadata": {}, "source": [ "## A" @@ -337,14 +339,14 @@ { "cell_type": "code", "execution_count": null, - "id": "4d7f9d1f", + "id": "77e350be", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "20fdd05b", + "id": "789bd3f7", "metadata": { "heading_collapsed": true }, @@ -354,12 +356,12 @@ "We will further inspect the residuals for heteroscedasticity, using the [White test](https://itfeature.com/heteroscedasticity/white-test-for-heteroskedasticity).\n", "\n", "`statsmodels` features an implementation of this test, but the [documentation](https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.het_white.html) is scarce on details.\n", - "Try to apply the `het_white` function, but do not feel ashamed if you fail." + "Try to apply the `het_white` function (if you can 'x))." ] }, { "cell_type": "markdown", - "id": "34e7a050", + "id": "0a822074", "metadata": {}, "source": [ "## A" @@ -368,14 +370,14 @@ { "cell_type": "code", "execution_count": null, - "id": "5de56d54", + "id": "85d73982", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "98ca812e", + "id": "e3ccb464", "metadata": { "heading_collapsed": true }, @@ -393,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "3ebf1176", + "id": "7ce19023", "metadata": {}, "source": [ "## A" @@ -402,15 +404,17 @@ { "cell_type": "code", "execution_count": null, - "id": "46c53e4e", + "id": "7dec1d91", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "46bd2a33", - "metadata": {}, + "id": "b588b5c1", + "metadata": { + "heading_collapsed": true + }, "source": [ "## Q\n", "\n", @@ -434,7 +438,7 @@ }, { "cell_type": "markdown", - "id": "374e25eb", + "id": "5224316d", "metadata": {}, "source": [ "## A" @@ -443,7 +447,7 @@ { "cell_type": "code", "execution_count": null, - "id": "08216a83", + "id": "1bac9cde", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks/statsmodels_TP_solutions.ipynb b/notebooks/statsmodels_TP_solutions.ipynb index 83257005c05c6324f1eac1dd6533be8e5c884aab..1e094a2a7705815459e26fbf5cb01c58f8dc8e14 100644 --- a/notebooks/statsmodels_TP_solutions.ipynb +++ b/notebooks/statsmodels_TP_solutions.ipynb @@ -43,16 +43,20 @@ { "cell_type": "markdown", "id": "965cc75c", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 56, "id": "7eb30cc9", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -192,7 +196,7 @@ "4 0 373450 8.0500 NaN S " ] }, - "execution_count": 2, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -204,9 +208,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 57, "id": "17f37d48", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -214,7 +220,7 @@ "(891, 12)" ] }, - "execution_count": 3, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -225,9 +231,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 58, "id": "31c6e99b", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "df['LogFare'] = np.log(1+df['Fare'])" @@ -235,13 +243,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 59, "id": "e5b46f36", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] @@ -258,9 +268,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 60, "id": "7cf9b21a", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -292,32 +304,38 @@ "\n", "Treat `Pclass` and `Sex` as factors.\n", "\n", - "Print an ANOVA table." + "Print an ANOVA table for different types of sum of squares.." ] }, { "cell_type": "markdown", "id": "3ad89dec", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 63, "id": "39f58924", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ - "model = smf.ols('LogFare ~ Age * C(Pclass) * C(Sex)', df).fit()" + "model = smf.ols('LogFare ~ Age * C(Sex) * C(Pclass)', df).fit()" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "bc136eb5", - "metadata": {}, + "execution_count": 66, + "id": "f09c5fea", + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -340,21 +358,140 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>sum_sq</th>\n", " <th>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", + " <th>C(Sex)</th>\n", + " <td>1.0</td>\n", + " <td>46.721986</td>\n", + " <td>46.721986</td>\n", + " <td>126.001800</td>\n", + " <td>5.241061e-27</td>\n", + " </tr>\n", + " <tr>\n", " <th>C(Pclass)</th>\n", - " <td>318.183365</td>\n", " <td>2.0</td>\n", - " <td>429.045083</td>\n", - " <td>1.856872e-122</td>\n", + " <td>318.408489</td>\n", + " <td>159.204245</td>\n", + " <td>429.348645</td>\n", + " <td>1.619836e-122</td>\n", " </tr>\n", " <tr>\n", + " <th>C(Sex):C(Pclass)</th>\n", + " <td>2.0</td>\n", + " <td>5.990345</td>\n", + " <td>2.995172</td>\n", + " <td>8.077506</td>\n", + " <td>3.402042e-04</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age</th>\n", + " <td>1.0</td>\n", + " <td>12.274132</td>\n", + " <td>12.274132</td>\n", + " <td>33.101391</td>\n", + " <td>1.306440e-08</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Sex)</th>\n", + " <td>1.0</td>\n", + " <td>1.486269</td>\n", + " <td>1.486269</td>\n", + " <td>4.008232</td>\n", + " <td>4.566288e-02</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Pclass)</th>\n", + " <td>2.0</td>\n", + " <td>0.296834</td>\n", + " <td>0.148417</td>\n", + " <td>0.400257</td>\n", + " <td>6.703004e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Sex):C(Pclass)</th>\n", + " <td>2.0</td>\n", + " <td>1.335653</td>\n", + " <td>0.667827</td>\n", + " <td>1.801023</td>\n", + " <td>1.658921e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Residual</th>\n", + " <td>702.0</td>\n", + " <td>260.304489</td>\n", + " <td>0.370804</td>\n", + " <td>NaN</td>\n", + " <td>NaN</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " df sum_sq mean_sq F PR(>F)\n", + "C(Sex) 1.0 46.721986 46.721986 126.001800 5.241061e-27\n", + "C(Pclass) 2.0 318.408489 159.204245 429.348645 1.619836e-122\n", + "C(Sex):C(Pclass) 2.0 5.990345 2.995172 8.077506 3.402042e-04\n", + "Age 1.0 12.274132 12.274132 33.101391 1.306440e-08\n", + "Age:C(Sex) 1.0 1.486269 1.486269 4.008232 4.566288e-02\n", + "Age:C(Pclass) 2.0 0.296834 0.148417 0.400257 6.703004e-01\n", + "Age:C(Sex):C(Pclass) 2.0 1.335653 0.667827 1.801023 1.658921e-01\n", + "Residual 702.0 260.304489 0.370804 NaN NaN" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sm.stats.anova_lm(model, typ=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "cf4e3edc", + "metadata": { + "hidden": true + }, + "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>sum_sq</th>\n", + " <th>df</th>\n", + " <th>F</th>\n", + " <th>PR(>F)</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", " <th>C(Sex)</th>\n", " <td>12.597516</td>\n", " <td>1.0</td>\n", @@ -362,7 +499,14 @@ " <td>8.516312e-09</td>\n", " </tr>\n", " <tr>\n", - " <th>C(Pclass):C(Sex)</th>\n", + " <th>C(Pclass)</th>\n", + " <td>318.183365</td>\n", + " <td>2.0</td>\n", + " <td>429.045083</td>\n", + " <td>1.856872e-122</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Sex):C(Pclass)</th>\n", " <td>3.489752</td>\n", " <td>2.0</td>\n", " <td>4.705654</td>\n", @@ -376,13 +520,6 @@ " <td>1.306440e-08</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Pclass)</th>\n", - " <td>0.296834</td>\n", - " <td>2.0</td>\n", - " <td>0.400257</td>\n", - " <td>6.703004e-01</td>\n", - " </tr>\n", - " <tr>\n", " <th>Age:C(Sex)</th>\n", " <td>1.421046</td>\n", " <td>1.0</td>\n", @@ -390,7 +527,14 @@ " <td>5.066866e-02</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Pclass):C(Sex)</th>\n", + " <th>Age:C(Pclass)</th>\n", + " <td>0.296834</td>\n", + " <td>2.0</td>\n", + " <td>0.400257</td>\n", + " <td>6.703004e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Sex):C(Pclass)</th>\n", " <td>1.335653</td>\n", " <td>2.0</td>\n", " <td>1.801023</td>\n", @@ -409,17 +553,17 @@ ], "text/plain": [ " sum_sq df F PR(>F)\n", - "C(Pclass) 318.183365 2.0 429.045083 1.856872e-122\n", "C(Sex) 12.597516 1.0 33.973508 8.516312e-09\n", - "C(Pclass):C(Sex) 3.489752 2.0 4.705654 9.331214e-03\n", + "C(Pclass) 318.183365 2.0 429.045083 1.856872e-122\n", + "C(Sex):C(Pclass) 3.489752 2.0 4.705654 9.331214e-03\n", "Age 12.274132 1.0 33.101391 1.306440e-08\n", - "Age:C(Pclass) 0.296834 2.0 0.400257 6.703004e-01\n", "Age:C(Sex) 1.421046 1.0 3.832335 5.066866e-02\n", - "Age:C(Pclass):C(Sex) 1.335653 2.0 1.801023 1.658921e-01\n", + "Age:C(Pclass) 0.296834 2.0 0.400257 6.703004e-01\n", + "Age:C(Sex):C(Pclass) 1.335653 2.0 1.801023 1.658921e-01\n", "Residual 260.304489 702.0 NaN NaN" ] }, - "execution_count": 8, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" } @@ -428,10 +572,137 @@ "sm.stats.anova_lm(model, typ=2)" ] }, + { + "cell_type": "code", + "execution_count": 68, + "id": "bc136eb5", + "metadata": { + "hidden": true + }, + "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>sum_sq</th>\n", + " <th>df</th>\n", + " <th>F</th>\n", + " <th>PR(>F)</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>Intercept</th>\n", + " <td>252.996076</td>\n", + " <td>1.0</td>\n", + " <td>682.290368</td>\n", + " <td>1.334116e-105</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Sex)</th>\n", + " <td>0.819888</td>\n", + " <td>1.0</td>\n", + " <td>2.211108</td>\n", + " <td>1.374692e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Pclass)</th>\n", + " <td>31.940629</td>\n", + " <td>2.0</td>\n", + " <td>43.069411</td>\n", + " <td>2.273902e-18</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Sex):C(Pclass)</th>\n", + " <td>1.012273</td>\n", + " <td>2.0</td>\n", + " <td>1.364970</td>\n", + " <td>2.560654e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age</th>\n", + " <td>0.776183</td>\n", + " <td>1.0</td>\n", + " <td>2.093243</td>\n", + " <td>1.483980e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Sex)</th>\n", + " <td>0.179743</td>\n", + " <td>1.0</td>\n", + " <td>0.484739</td>\n", + " <td>4.865140e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Pclass)</th>\n", + " <td>0.437814</td>\n", + " <td>2.0</td>\n", + " <td>0.590357</td>\n", + " <td>5.544041e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age:C(Sex):C(Pclass)</th>\n", + " <td>1.335653</td>\n", + " <td>2.0</td>\n", + " <td>1.801023</td>\n", + " <td>1.658921e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Residual</th>\n", + " <td>260.304489</td>\n", + " <td>702.0</td>\n", + " <td>NaN</td>\n", + " <td>NaN</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " sum_sq df F PR(>F)\n", + "Intercept 252.996076 1.0 682.290368 1.334116e-105\n", + "C(Sex) 0.819888 1.0 2.211108 1.374692e-01\n", + "C(Pclass) 31.940629 2.0 43.069411 2.273902e-18\n", + "C(Sex):C(Pclass) 1.012273 2.0 1.364970 2.560654e-01\n", + "Age 0.776183 1.0 2.093243 1.483980e-01\n", + "Age:C(Sex) 0.179743 1.0 0.484739 4.865140e-01\n", + "Age:C(Pclass) 0.437814 2.0 0.590357 5.544041e-01\n", + "Age:C(Sex):C(Pclass) 1.335653 2.0 1.801023 1.658921e-01\n", + "Residual 260.304489 702.0 NaN NaN" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sm.stats.anova_lm(model, typ=3)" + ] + }, { "cell_type": "markdown", "id": "0e98e30e", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "We can also have a look at the summary tables. This reveals that the residuals are not normally distributed." ] @@ -440,7 +711,9 @@ "cell_type": "code", "execution_count": 9, "id": "8d3ea24c", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -586,67 +859,308 @@ { "cell_type": "markdown", "id": "ecf3bcd9", - "metadata": { - "heading_collapsed": true - }, + "metadata": {}, "source": [ "## Q\n", "\n", - "Let us ignore the not-normal residuals and play with post-hoc tests instead.\n", - "\n", - "Split the ANOVA for levels of `Pclass` and `Sex`, perform all pairwise comparisons if it make sense, and correct for multiple comparisons.\n", + "Because we have a large sample, we will ignore the not-normal residuals and play with post-hoc tests instead.\n", "\n", - "We are not interested in the significance of the slope of `Age` for the different levels of the factors." + "First proceed considering type-3 sums of squares." ] }, { "cell_type": "markdown", - "id": "7a417d76", - "metadata": {}, + "id": "06c5bc0c", + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] }, + { + "cell_type": "markdown", + "id": "f203eea0", + "metadata": { + "hidden": true + }, + "source": [ + "We found a single main effect and no interaction. Therefore a single call to `t_test_pairwise` is enough." + ] + }, { "cell_type": "code", - "execution_count": 10, - "id": "b81407bd", + "execution_count": 69, + "id": "248c081c", + "metadata": { + "hidden": true + }, + "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>2-1</th>\n", + " <td>-1.460550</td>\n", + " <td>0.251403</td>\n", + " <td>-5.809591</td>\n", + " <td>9.496387e-09</td>\n", + " <td>-1.954142</td>\n", + " <td>-0.966958</td>\n", + " <td>1.899277e-08</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3-1</th>\n", + " <td>-2.016639</td>\n", + " <td>0.217384</td>\n", + " <td>-9.276845</td>\n", + " <td>2.121528e-19</td>\n", + " <td>-2.443439</td>\n", + " <td>-1.589838</td>\n", + " <td>0.000000e+00</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3-2</th>\n", + " <td>-0.556089</td>\n", + " <td>0.211313</td>\n", + " <td>-2.631590</td>\n", + " <td>8.685267e-03</td>\n", + " <td>-0.970969</td>\n", + " <td>-0.141208</td>\n", + " <td>8.685267e-03</td>\n", + " <td>True</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " coef std err t P>|t| Conf. Int. Low \\\n", + "2-1 -1.460550 0.251403 -5.809591 9.496387e-09 -1.954142 \n", + "3-1 -2.016639 0.217384 -9.276845 2.121528e-19 -2.443439 \n", + "3-2 -0.556089 0.211313 -2.631590 8.685267e-03 -0.970969 \n", + "\n", + " Conf. Int. Upp. pvalue-hs reject-hs \n", + "2-1 -0.966958 1.899277e-08 True \n", + "3-1 -1.589838 0.000000e+00 True \n", + "3-2 -0.141208 8.685267e-03 True " + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.t_test_pairwise('C(Pclass)').result_frame" + ] + }, + { + "cell_type": "markdown", + "id": "dc0a30ce", "metadata": {}, - "outputs": [], "source": [ - "class1_model = smf.ols(data=df, formula='Fare ~ Age * C(Sex)', subset=df['Pclass']==1).fit()\n", - "class2_model = smf.ols(data=df, formula='Fare ~ Age * C(Sex)', subset=df['Pclass']==2).fit()\n", - "class3_model = smf.ols(data=df, formula='Fare ~ Age * C(Sex)', subset=df['Pclass']==3).fit()\n", - "female_model = smf.ols(data=df, formula='Fare ~ Age * C(Pclass)', subset=df['Sex']=='female').fit()\n", - "male_model = smf.ols(data=df, formula='Fare ~ Age * C(Pclass)', subset=df['Sex']=='male').fit()" + "## Q\n", + "\n", + "Let us suppose we want to use type-1 sums of squares instead.\n", + "\n", + "Proceed again to performing with `Sex` first, `Pclass` second, and `Age` last.\n", + "\n", + "In the post-hoc comparisons, we will disregard the effect of the slop of `Age`." + ] + }, + { + "cell_type": "markdown", + "id": "7a417d76", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "## A" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "cafed8b7", - "metadata": {}, + "execution_count": 78, + "id": "9466f266", + "metadata": { + "hidden": true + }, "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>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", + " <th>F</th>\n", + " <th>PR(>F)</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>C(Sex)</th>\n", + " <td>1.0</td>\n", + " <td>46.721986</td>\n", + " <td>46.721986</td>\n", + " <td>126.001800</td>\n", + " <td>5.241061e-27</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Pclass)</th>\n", + " <td>2.0</td>\n", + " <td>318.408489</td>\n", + " <td>159.204245</td>\n", + " <td>429.348645</td>\n", + " <td>1.619836e-122</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Sex):C(Pclass)</th>\n", + " <td>2.0</td>\n", + " <td>5.990345</td>\n", + " <td>2.995172</td>\n", + " <td>8.077506</td>\n", + " <td>3.402042e-04</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Age</th>\n", + " <td>1.0</td>\n", + " <td>12.274132</td>\n", + " <td>12.274132</td>\n", + " <td>33.101391</td>\n", + " <td>1.306440e-08</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Sex):Age</th>\n", + " <td>1.0</td>\n", + " <td>1.486269</td>\n", + " <td>1.486269</td>\n", + " <td>4.008232</td>\n", + " <td>4.566288e-02</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Pclass):Age</th>\n", + " <td>2.0</td>\n", + " <td>0.296834</td>\n", + " <td>0.148417</td>\n", + " <td>0.400257</td>\n", + " <td>6.703004e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>C(Sex):C(Pclass):Age</th>\n", + " <td>2.0</td>\n", + " <td>1.335653</td>\n", + " <td>0.667827</td>\n", + " <td>1.801023</td>\n", + " <td>1.658921e-01</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Residual</th>\n", + " <td>702.0</td>\n", + " <td>260.304489</td>\n", + " <td>0.370804</td>\n", + " <td>NaN</td>\n", + " <td>NaN</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], "text/plain": [ - "((186, 4), (173, 4), (355, 4))" + " df sum_sq mean_sq F PR(>F)\n", + "C(Sex) 1.0 46.721986 46.721986 126.001800 5.241061e-27\n", + "C(Pclass) 2.0 318.408489 159.204245 429.348645 1.619836e-122\n", + "C(Sex):C(Pclass) 2.0 5.990345 2.995172 8.077506 3.402042e-04\n", + "Age 1.0 12.274132 12.274132 33.101391 1.306440e-08\n", + "C(Sex):Age 1.0 1.486269 1.486269 4.008232 4.566288e-02\n", + "C(Pclass):Age 2.0 0.296834 0.148417 0.400257 6.703004e-01\n", + "C(Sex):C(Pclass):Age 2.0 1.335653 0.667827 1.801023 1.658921e-01\n", + "Residual 702.0 260.304489 0.370804 NaN NaN" ] }, - "execution_count": 11, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "class1_model.model.exog.shape, class2_model.model.exog.shape, class3_model.model.exog.shape" + "sstype = 1\n", + "model = smf.ols('LogFare ~ C(Sex) * C(Pclass) * Age', df).fit()\n", + "sm.stats.anova_lm(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "b81407bd", + "metadata": { + "hidden": true + }, + "outputs": [], + "source": [ + "class1_model = smf.ols(data=df, formula='Fare ~ C(Sex) * Age', subset=df['Pclass']==1).fit()\n", + "class2_model = smf.ols(data=df, formula='Fare ~ C(Sex) * Age', subset=df['Pclass']==2).fit()\n", + "class3_model = smf.ols(data=df, formula='Fare ~ C(Sex) * Age', subset=df['Pclass']==3).fit()\n", + "female_model = smf.ols(data=df, formula='Fare ~ C(Pclass) * Age', subset=df['Sex']=='female').fit()\n", + "male_model = smf.ols(data=df, formula='Fare ~ C(Pclass) * Age', subset=df['Sex']=='male').fit()" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 89, "id": "7a8fb3ff", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -669,8 +1183,9 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>sum_sq</th>\n", " <th>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", @@ -678,29 +1193,33 @@ " <tbody>\n", " <tr>\n", " <th>C(Sex)</th>\n", - " <td>4.043594e+04</td>\n", " <td>1.0</td>\n", - " <td>6.627354</td>\n", - " <td>0.010838</td>\n", + " <td>6.251806e+04</td>\n", + " <td>62518.055251</td>\n", + " <td>10.246561</td>\n", + " <td>0.001616</td>\n", " </tr>\n", " <tr>\n", " <th>Age</th>\n", - " <td>3.572113e+04</td>\n", " <td>1.0</td>\n", + " <td>3.572113e+04</td>\n", + " <td>35721.126820</td>\n", " <td>5.854608</td>\n", " <td>0.016520</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Sex)</th>\n", - " <td>8.202655e+02</td>\n", + " <th>C(Sex):Age</th>\n", " <td>1.0</td>\n", + " <td>8.202655e+02</td>\n", + " <td>820.265529</td>\n", " <td>0.134440</td>\n", " <td>0.714299</td>\n", " </tr>\n", " <tr>\n", " <th>Residual</th>\n", - " <td>1.110449e+06</td>\n", " <td>182.0</td>\n", + " <td>1.110449e+06</td>\n", + " <td>6101.369705</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", @@ -709,27 +1228,29 @@ "</div>" ], "text/plain": [ - " sum_sq df F PR(>F)\n", - "C(Sex) 4.043594e+04 1.0 6.627354 0.010838\n", - "Age 3.572113e+04 1.0 5.854608 0.016520\n", - "Age:C(Sex) 8.202655e+02 1.0 0.134440 0.714299\n", - "Residual 1.110449e+06 182.0 NaN NaN" + " df sum_sq mean_sq F PR(>F)\n", + "C(Sex) 1.0 6.251806e+04 62518.055251 10.246561 0.001616\n", + "Age 1.0 3.572113e+04 35721.126820 5.854608 0.016520\n", + "C(Sex):Age 1.0 8.202655e+02 820.265529 0.134440 0.714299\n", + "Residual 182.0 1.110449e+06 6101.369705 NaN NaN" ] }, - "execution_count": 12, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sm.stats.anova_lm(class1_model, typ=2)" + "sm.stats.anova_lm(class1_model, typ=sstype)" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 90, "id": "c5285b28", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -752,8 +1273,9 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>sum_sq</th>\n", " <th>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", @@ -761,29 +1283,33 @@ " <tbody>\n", " <tr>\n", " <th>C(Sex)</th>\n", - " <td>9.143118</td>\n", " <td>1.0</td>\n", - " <td>0.053774</td>\n", - " <td>0.816901</td>\n", + " <td>29.733469</td>\n", + " <td>29.733469</td>\n", + " <td>0.174875</td>\n", + " <td>0.676346</td>\n", " </tr>\n", " <tr>\n", " <th>Age</th>\n", - " <td>1140.725330</td>\n", " <td>1.0</td>\n", + " <td>1140.725330</td>\n", + " <td>1140.725330</td>\n", " <td>6.709083</td>\n", " <td>0.010430</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Sex)</th>\n", - " <td>7.201063</td>\n", + " <th>C(Sex):Age</th>\n", " <td>1.0</td>\n", + " <td>7.201063</td>\n", + " <td>7.201063</td>\n", " <td>0.042352</td>\n", " <td>0.837197</td>\n", " </tr>\n", " <tr>\n", " <th>Residual</th>\n", - " <td>28734.566043</td>\n", " <td>169.0</td>\n", + " <td>28734.566043</td>\n", + " <td>170.027018</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", @@ -792,27 +1318,29 @@ "</div>" ], "text/plain": [ - " sum_sq df F PR(>F)\n", - "C(Sex) 9.143118 1.0 0.053774 0.816901\n", - "Age 1140.725330 1.0 6.709083 0.010430\n", - "Age:C(Sex) 7.201063 1.0 0.042352 0.837197\n", - "Residual 28734.566043 169.0 NaN NaN" + " df sum_sq mean_sq F PR(>F)\n", + "C(Sex) 1.0 29.733469 29.733469 0.174875 0.676346\n", + "Age 1.0 1140.725330 1140.725330 6.709083 0.010430\n", + "C(Sex):Age 1.0 7.201063 7.201063 0.042352 0.837197\n", + "Residual 169.0 28734.566043 170.027018 NaN NaN" ] }, - "execution_count": 13, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sm.stats.anova_lm(class2_model, typ=2)" + "sm.stats.anova_lm(class2_model, typ=sstype)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 91, "id": "ed33eab1", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -835,8 +1363,9 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>sum_sq</th>\n", " <th>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", @@ -844,29 +1373,33 @@ " <tbody>\n", " <tr>\n", " <th>C(Sex)</th>\n", - " <td>553.194455</td>\n", " <td>1.0</td>\n", - " <td>6.099022</td>\n", - " <td>0.014001</td>\n", + " <td>1001.995627</td>\n", + " <td>1001.995627</td>\n", + " <td>11.047098</td>\n", + " <td>0.000982</td>\n", " </tr>\n", " <tr>\n", " <th>Age</th>\n", - " <td>1970.785958</td>\n", " <td>1.0</td>\n", + " <td>1970.785958</td>\n", + " <td>1970.785958</td>\n", " <td>21.728105</td>\n", " <td>0.000004</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Sex)</th>\n", - " <td>896.982415</td>\n", + " <th>C(Sex):Age</th>\n", " <td>1.0</td>\n", + " <td>896.982415</td>\n", + " <td>896.982415</td>\n", " <td>9.889317</td>\n", " <td>0.001804</td>\n", " </tr>\n", " <tr>\n", " <th>Residual</th>\n", - " <td>31836.456663</td>\n", " <td>351.0</td>\n", + " <td>31836.456663</td>\n", + " <td>90.702156</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", @@ -875,27 +1408,29 @@ "</div>" ], "text/plain": [ - " sum_sq df F PR(>F)\n", - "C(Sex) 553.194455 1.0 6.099022 0.014001\n", - "Age 1970.785958 1.0 21.728105 0.000004\n", - "Age:C(Sex) 896.982415 1.0 9.889317 0.001804\n", - "Residual 31836.456663 351.0 NaN NaN" + " df sum_sq mean_sq F PR(>F)\n", + "C(Sex) 1.0 1001.995627 1001.995627 11.047098 0.000982\n", + "Age 1.0 1970.785958 1970.785958 21.728105 0.000004\n", + "C(Sex):Age 1.0 896.982415 896.982415 9.889317 0.001804\n", + "Residual 351.0 31836.456663 90.702156 NaN NaN" ] }, - "execution_count": 14, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sm.stats.anova_lm(class3_model, typ=2)" + "sm.stats.anova_lm(class3_model, typ=sstype)" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 92, "id": "4652591d", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "# we could also make these additional model to treat the 'Age:Sex' interaction, but we are not interested in 'Age' alone (hence the hint about «pairwise»)\n", @@ -905,9 +1440,11 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 93, "id": "ecfbec15", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -930,8 +1467,9 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>sum_sq</th>\n", " <th>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", @@ -939,29 +1477,33 @@ " <tbody>\n", " <tr>\n", " <th>C(Pclass)</th>\n", - " <td>436677.926114</td>\n", " <td>2.0</td>\n", - " <td>109.672659</td>\n", - " <td>4.283604e-35</td>\n", + " <td>460882.452649</td>\n", + " <td>230441.226324</td>\n", + " <td>115.751681</td>\n", + " <td>1.699917e-36</td>\n", " </tr>\n", " <tr>\n", " <th>Age</th>\n", - " <td>4564.359068</td>\n", " <td>1.0</td>\n", + " <td>4564.359068</td>\n", + " <td>4564.359068</td>\n", " <td>2.292698</td>\n", " <td>1.312222e-01</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Pclass)</th>\n", - " <td>5386.550285</td>\n", + " <th>C(Pclass):Age</th>\n", " <td>2.0</td>\n", + " <td>5386.550285</td>\n", + " <td>2693.275142</td>\n", " <td>1.352844</td>\n", " <td>2.603528e-01</td>\n", " </tr>\n", " <tr>\n", " <th>Residual</th>\n", - " <td>507660.125010</td>\n", " <td>255.0</td>\n", + " <td>507660.125010</td>\n", + " <td>1990.824020</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", @@ -970,27 +1512,29 @@ "</div>" ], "text/plain": [ - " sum_sq df F PR(>F)\n", - "C(Pclass) 436677.926114 2.0 109.672659 4.283604e-35\n", - "Age 4564.359068 1.0 2.292698 1.312222e-01\n", - "Age:C(Pclass) 5386.550285 2.0 1.352844 2.603528e-01\n", - "Residual 507660.125010 255.0 NaN NaN" + " df sum_sq mean_sq F PR(>F)\n", + "C(Pclass) 2.0 460882.452649 230441.226324 115.751681 1.699917e-36\n", + "Age 1.0 4564.359068 4564.359068 2.292698 1.312222e-01\n", + "C(Pclass):Age 2.0 5386.550285 2693.275142 1.352844 2.603528e-01\n", + "Residual 255.0 507660.125010 1990.824020 NaN NaN" ] }, - "execution_count": 16, + "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sm.stats.anova_lm(female_model, typ=2)" + "sm.stats.anova_lm(female_model, typ=sstype)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 94, "id": "27783db9", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1013,8 +1557,9 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>sum_sq</th>\n", " <th>df</th>\n", + " <th>sum_sq</th>\n", + " <th>mean_sq</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", @@ -1022,29 +1567,33 @@ " <tbody>\n", " <tr>\n", " <th>C(Pclass)</th>\n", - " <td>269207.914985</td>\n", " <td>2.0</td>\n", - " <td>90.701809</td>\n", - " <td>8.657391e-34</td>\n", + " <td>255902.065524</td>\n", + " <td>127951.032762</td>\n", + " <td>86.218789</td>\n", + " <td>2.149213e-32</td>\n", " </tr>\n", " <tr>\n", " <th>Age</th>\n", - " <td>18986.128890</td>\n", " <td>1.0</td>\n", + " <td>18986.128890</td>\n", + " <td>18986.128890</td>\n", " <td>12.793652</td>\n", " <td>3.857634e-04</td>\n", " </tr>\n", " <tr>\n", - " <th>Age:C(Pclass)</th>\n", - " <td>11620.048872</td>\n", + " <th>C(Pclass):Age</th>\n", " <td>2.0</td>\n", + " <td>11620.048872</td>\n", + " <td>5810.024436</td>\n", " <td>3.915039</td>\n", " <td>2.062721e-02</td>\n", " </tr>\n", " <tr>\n", " <th>Residual</th>\n", - " <td>663360.184028</td>\n", " <td>447.0</td>\n", + " <td>663360.184028</td>\n", + " <td>1484.027257</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", @@ -1053,35 +1602,39 @@ "</div>" ], "text/plain": [ - " sum_sq df F PR(>F)\n", - "C(Pclass) 269207.914985 2.0 90.701809 8.657391e-34\n", - "Age 18986.128890 1.0 12.793652 3.857634e-04\n", - "Age:C(Pclass) 11620.048872 2.0 3.915039 2.062721e-02\n", - "Residual 663360.184028 447.0 NaN NaN" + " df sum_sq mean_sq F PR(>F)\n", + "C(Pclass) 2.0 255902.065524 127951.032762 86.218789 2.149213e-32\n", + "Age 1.0 18986.128890 18986.128890 12.793652 3.857634e-04\n", + "C(Pclass):Age 2.0 11620.048872 5810.024436 3.915039 2.062721e-02\n", + "Residual 447.0 663360.184028 1484.027257 NaN NaN" ] }, - "execution_count": 17, + "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sm.stats.anova_lm(male_model, typ=2)" + "sm.stats.anova_lm(male_model, typ=sstype)" ] }, { "cell_type": "markdown", "id": "ce321919", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "We won't include this last case, again, as we are not interested in the slope of `Age` for each level of `Pclass`." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 95, "id": "d27e6f05", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1127,17 +1680,6 @@ " <td>False</td>\n", " </tr>\n", " <tr>\n", - " <th>male-female [2nd class]</th>\n", - " <td>0.432770</td>\n", - " <td>4.806509</td>\n", - " <td>0.090038</td>\n", - " <td>9.283634e-01</td>\n", - " <td>-9.055761</td>\n", - " <td>9.921302</td>\n", - " <td>9.283634e-01</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", " <th>2-1 [female]</th>\n", " <td>-108.472618</td>\n", " <td>18.421076</td>\n", @@ -1177,27 +1719,24 @@ "text/plain": [ " coef std err t P>|t| \\\n", "male-female [1st class] -19.279419 32.487685 -0.593438 5.536250e-01 \n", - "male-female [2nd class] 0.432770 4.806509 0.090038 9.283634e-01 \n", "2-1 [female] -108.472618 18.421076 -5.888506 1.224216e-08 \n", "3-1 [female] -119.359262 15.928392 -7.493491 1.102750e-12 \n", "3-2 [female] -10.886644 15.483529 -0.703111 4.826278e-01 \n", "\n", " Conf. Int. Low Conf. Int. Upp. pvalue-hs \\\n", "male-female [1st class] -83.380352 44.821514 5.536250e-01 \n", - "male-female [2nd class] -9.055761 9.921302 9.283634e-01 \n", "2-1 [female] -144.749437 -72.195799 2.448432e-08 \n", "3-1 [female] -150.727213 -87.991312 3.308354e-12 \n", "3-2 [female] -41.378522 19.605233 4.826278e-01 \n", "\n", " reject-hs \n", "male-female [1st class] False \n", - "male-female [2nd class] False \n", "2-1 [female] True \n", "3-1 [female] True \n", "3-2 [female] False " ] }, - "execution_count": 18, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } @@ -1209,7 +1748,6 @@ "\n", "comparisons = pd.concat([\n", " suffix_label(class1_model.t_test_pairwise('C(Sex)').result_frame, ' [1st class]'),\n", - " suffix_label(class2_model.t_test_pairwise('C(Sex)').result_frame, ' [2nd class]'),\n", " suffix_label(female_model.t_test_pairwise('C(Pclass)').result_frame, ' [female]'),\n", "])\n", "comparisons" @@ -1217,19 +1755,20 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 96, "id": "80024bdf", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { "text/plain": [ - "(array([False, False, True, True, False]),\n", - " array([8.61512929e-01, 9.28363378e-01, 4.89686469e-08, 5.51392265e-12,\n", - " 8.61512929e-01]))" + "(array([False, True, True, False]),\n", + " array([7.32326021e-01, 3.67264854e-08, 4.41113812e-12, 7.32326021e-01]))" ] }, - "execution_count": 19, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -1240,6 +1779,17 @@ "corrected_rejections, corrected_pvalues" ] }, + { + "cell_type": "markdown", + "id": "5e3fa114", + "metadata": { + "hidden": true + }, + "source": [ + "Compared with type-3 sums of squares, we lost one effect whose test-wise $p$-value was very close to the significance threshold.\n", + "Of note, this difference comes from the type of sum of squares and not the correction for multiple comparisons." + ] + }, { "cell_type": "markdown", "id": "b7b20012", @@ -1263,7 +1813,9 @@ { "cell_type": "markdown", "id": "35949307", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] @@ -1272,7 +1824,9 @@ "cell_type": "code", "execution_count": 20, "id": "47cf88a3", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "import numpy as np\n", @@ -1286,7 +1840,9 @@ "cell_type": "code", "execution_count": 21, "id": "7a8dacd7", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "mi = pd.read_csv('../data/mi.csv', index_col=0)" @@ -1296,7 +1852,9 @@ "cell_type": "code", "execution_count": 22, "id": "bea3243d", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1513,7 +2071,9 @@ "cell_type": "code", "execution_count": 23, "id": "d55877e4", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1555,7 +2115,9 @@ { "cell_type": "markdown", "id": "21e8879e", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] @@ -1564,7 +2126,9 @@ "cell_type": "code", "execution_count": 45, "id": "0b8cac58", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1586,7 +2150,9 @@ { "cell_type": "markdown", "id": "04a941a5", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "Note that one-liners such as the above expression will almost always be refactored.\n", "We may need the transformed variable again, and therefore should reify it for future reference." @@ -1596,7 +2162,9 @@ "cell_type": "code", "execution_count": 24, "id": "b0cc612e", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "logPA = np.log(1 + mi['PhysicalActivity'])" @@ -1605,7 +2173,9 @@ { "cell_type": "markdown", "id": "adf75983", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "We may also append it to the dataframe, as a column, just like any other variable." ] @@ -1614,7 +2184,9 @@ "cell_type": "code", "execution_count": 25, "id": "d357ea8a", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "extended_mi = mi.copy()\n", @@ -1624,7 +2196,9 @@ { "cell_type": "markdown", "id": "fd32ce56", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "We cannot compare the skewness of both variables with a single test.\n", "\n", @@ -1635,7 +2209,9 @@ "cell_type": "code", "execution_count": 26, "id": "87455d20", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1655,7 +2231,9 @@ { "cell_type": "markdown", "id": "1067660f", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "...although they both happen to be skewed if we perform individual skewness tests." ] @@ -1664,7 +2242,9 @@ "cell_type": "code", "execution_count": 27, "id": "645ef445", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1685,7 +2265,9 @@ "cell_type": "code", "execution_count": 28, "id": "f5984bf0", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1705,7 +2287,9 @@ { "cell_type": "markdown", "id": "478d1262", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "Note we do not need the explanatory variable to be symmetric or normally distributed for a model to be valid.\n", "The point is mainly to make our sample exhibit a good coverage (in a linear sense) of the domain of possible values for our predictors." @@ -1728,7 +2312,9 @@ { "cell_type": "markdown", "id": "c47489e6", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] @@ -1737,7 +2323,9 @@ "cell_type": "code", "execution_count": 29, "id": "bf32c7e6", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1762,7 +2350,9 @@ "cell_type": "code", "execution_count": 30, "id": "ac8ab2cc", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1785,7 +2375,9 @@ { "cell_type": "markdown", "id": "3cd48b4f", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "In the above example, we leveraged the expressiveness of `patsy` for Wilkinson formulae. The `I` «function» is a special symbol just like `C` for tagging a variable as categorical. `I` allows to evaluate a subexpression following the Python syntax instead of the Wilkinson formalism.\n", "\n", @@ -1800,7 +2392,9 @@ "cell_type": "code", "execution_count": 31, "id": "177c2ec7", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "# already done\n", @@ -1815,7 +2409,9 @@ "cell_type": "code", "execution_count": 32, "id": "93e6b4ee", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "import statsmodels.api as sm" @@ -1825,7 +2421,9 @@ "cell_type": "code", "execution_count": 33, "id": "d2ec65f0", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "name": "stderr", @@ -1845,7 +2443,9 @@ { "cell_type": "markdown", "id": "c39bd1c5", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "Anyway, as can be seen in the plots above, we turned an influential observation (number 362 was above $0.5$) into a non-influential one, and similarly decreased the influence of several other points.\n", "\n", @@ -1869,7 +2469,9 @@ { "cell_type": "markdown", "id": "12d7e9a5", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A (with nested Q&A)" ] @@ -1878,7 +2480,9 @@ "cell_type": "code", "execution_count": 34, "id": "82e9f8d6", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -1988,7 +2592,9 @@ "cell_type": "code", "execution_count": 35, "id": "faeab021", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2103,7 +2709,9 @@ { "cell_type": "markdown", "id": "66ddaa3e", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "### Q\n", "\n", @@ -2115,7 +2723,10 @@ { "cell_type": "markdown", "id": "05844c56", - "metadata": {}, + "metadata": { + "heading_collapsed": true, + "hidden": true + }, "source": [ "### A" ] @@ -2124,7 +2735,9 @@ "cell_type": "code", "execution_count": 36, "id": "2588d8d6", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2248,7 +2861,9 @@ { "cell_type": "markdown", "id": "c7f00836", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "In `seaborn`, a dot plot can be drawn with the `stripplot` function." ] @@ -2257,7 +2872,9 @@ "cell_type": "code", "execution_count": 37, "id": "625111f9", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2280,7 +2897,9 @@ { "cell_type": "markdown", "id": "1ba5537f", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ "Should we add a term, `BMI` brings more information alone than `Heart:logPA` for the same number of model parameters. This would be confirmed by AIC and BIC.\n", "\n", @@ -2310,7 +2929,9 @@ { "cell_type": "markdown", "id": "a6f37b2e", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] @@ -2319,7 +2940,9 @@ "cell_type": "code", "execution_count": 38, "id": "77e350be", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "# already done\n", @@ -2334,7 +2957,9 @@ "cell_type": "code", "execution_count": 39, "id": "377783b7", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2358,7 +2983,9 @@ "cell_type": "code", "execution_count": 40, "id": "e07bc434", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2395,7 +3022,9 @@ { "cell_type": "markdown", "id": "0a822074", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] @@ -2404,7 +3033,9 @@ "cell_type": "code", "execution_count": 41, "id": "85d73982", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2444,7 +3075,9 @@ { "cell_type": "markdown", "id": "7ce19023", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## A" ] @@ -2453,7 +3086,9 @@ "cell_type": "code", "execution_count": 42, "id": "7dec1d91", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [ "logPA = np.log(1 + mi['PhysicalActivity'])\n", @@ -2473,7 +3108,9 @@ { "cell_type": "markdown", "id": "b588b5c1", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "## Q\n", "\n", @@ -2495,11 +3132,23 @@ "Compute the statistic $nR^2$ and the resulting $p$-value." ] }, + { + "cell_type": "markdown", + "id": "e4207c4c", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "## A" + ] + }, { "cell_type": "code", "execution_count": 43, "id": "db59adce", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [ { "data": { @@ -2525,7 +3174,9 @@ "cell_type": "code", "execution_count": null, "id": "1bac9cde", - "metadata": {}, + "metadata": { + "hidden": true + }, "outputs": [], "source": [] } diff --git a/notebooks/statsmodels_cours.ipynb b/notebooks/statsmodels_cours.ipynb index 17502d5b7f7010d8514718e893777b16088858fb..1b95f5d5d641ed85e12ba7e8f4d4bda9ff5719e8 100644 --- a/notebooks/statsmodels_cours.ipynb +++ b/notebooks/statsmodels_cours.ipynb @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 151, "id": "d6590258-e1ac-4f62-8adf-3fa014376a22", "metadata": {}, "outputs": [], @@ -55,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 152, "id": "7b4f63c1-9995-4516-aeb5-1fb4fe1db896", "metadata": {}, "outputs": [], @@ -84,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 153, "id": "aec2f6b1-c4fc-465e-9434-b32333770e24", "metadata": {}, "outputs": [], @@ -96,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 154, "id": "bd00bd2f-b7eb-47e4-8af4-187ce9473481", "metadata": {}, "outputs": [ @@ -106,7 +106,7 @@ "F_onewayResult(statistic=2.3575322551335636, pvalue=0.11384795345837218)" ] }, - "execution_count": 100, + "execution_count": 154, "metadata": {}, "output_type": "execute_result" } @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 155, "id": "696ff83f-d827-4513-9801-51488e5a1df0", "metadata": {}, "outputs": [ @@ -140,7 +140,7 @@ " 'C', 'C', 'C', 'C'], dtype='<U1'))" ] }, - "execution_count": 101, + "execution_count": 155, "metadata": {}, "output_type": "execute_result" } @@ -153,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 156, "id": "c324bd0f-e769-4a0d-8e6b-d4d346e76f68", "metadata": {}, "outputs": [ @@ -371,7 +371,7 @@ "29 81 C" ] }, - "execution_count": 102, + "execution_count": 156, "metadata": {}, "output_type": "execute_result" } @@ -402,7 +402,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 157, "id": "4a2a00ec-43c6-4299-82e3-15b807110828", "metadata": {}, "outputs": [], @@ -420,7 +420,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 158, "id": "21bf5c1d-caa3-4072-bc86-ce860b8f33c8", "metadata": {}, "outputs": [ @@ -434,7 +434,7 @@ "Model: OLS Adj. R-squared: 0.086\n", "Method: Least Squares F-statistic: 2.358\n", "Date: Tue, 28 Sep 2021 Prob (F-statistic): 0.114\n", - "Time: 11:16:16 Log-Likelihood: -96.604\n", + "Time: 18:26:09 Log-Likelihood: -96.604\n", "No. Observations: 30 AIC: 199.2\n", "Df Residuals: 27 BIC: 203.4\n", "Df Model: 2 \n", @@ -473,7 +473,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 159, "id": "638bdd6b-6964-4209-b762-2991fd3fb7fc", "metadata": { "tags": [] @@ -485,7 +485,7 @@ "F_onewayResult(statistic=2.3575322551335636, pvalue=0.11384795345837218)" ] }, - "execution_count": 105, + "execution_count": 159, "metadata": {}, "output_type": "execute_result" } @@ -507,7 +507,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 166, "id": "0fe841a0-21b1-4c92-a767-c4ab3abd37f8", "metadata": { "tags": [] @@ -517,9 +517,9 @@ "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" + " sum_sq df F PR(>F)\n", + "Group 192.2 2.0 2.357532 0.113848\n", + "Residual 1100.6 27.0 NaN NaN\n" ] } ], @@ -1736,7 +1736,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 167, "id": "cc06b3ed-a066-4de3-884c-a7c82729c359", "metadata": {}, "outputs": [ @@ -1744,15 +1744,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " sum_sq df F PR(>F)\n", - "water 15.552000 1.0 16.034261 0.000462\n", - "sun 21.424667 2.0 11.044518 0.000337\n", - "Residual 25.218000 26.0 NaN NaN\n" + " sum_sq df F PR(>F)\n", + "Intercept 394.218750 1.0 406.443314 2.139588e-17\n", + "water 15.552000 1.0 16.034261 4.623155e-04\n", + "sun 21.424667 2.0 11.044518 3.373296e-04\n", + "Residual 25.218000 26.0 NaN NaN\n" ] } ], "source": [ - "anova_table = sm.stats.anova_lm(plant_model, typ=2)\n", + "anova_table = sm.stats.anova_lm(plant_model, typ=3) # typ specifies the type of sum of squares\n", "print(anova_table)" ] }, @@ -1886,7 +1887,7 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": 168, "id": "60de13e5-b798-4312-8d06-0ef79f480760", "metadata": {}, "outputs": [ @@ -1894,18 +1895,19 @@ "name": "stdout", "output_type": "stream", "text": [ - " sum_sq df F PR(>F)\n", - "water 15.552000 1.0 19.117394 0.000205\n", - "sun 21.424667 2.0 13.168203 0.000138\n", - "water:sun 5.694000 2.0 3.499693 0.046376\n", - "Residual 19.524000 24.0 NaN NaN\n" + " sum_sq df F PR(>F)\n", + "Intercept 246.402000 1.0 302.891211 4.094979e-15\n", + "water 2.401000 1.0 2.951444 9.867817e-02\n", + "sun 8.041333 2.0 4.942430 1.593920e-02\n", + "water:sun 5.694000 2.0 3.499693 4.637649e-02\n", + "Residual 19.524000 24.0 NaN NaN\n" ] } ], "source": [ "model_with_interaction = ols('height ~ water * sun', data=plant_data).fit()\n", "# remember `water * sun` is equivalent to `water + sun + water:sun`\n", - "print(sm.stats.anova_lm(model_with_interaction, typ=2))" + "print(sm.stats.anova_lm(model_with_interaction, typ=3))" ] }, { @@ -1971,7 +1973,7 @@ "\n", "y_low_daily = w['Intercept'] + w['sun[T.low]']\n", "y_low_weekly = w['Intercept'] + w['sun[T.low]'] + w['water[T.weekly]'] + w['water[T.weekly]:sun[T.low]']\n", - "ax.plot([x[0]-dx, x[0]+dx], [y_low_daily, y_low_weekly], 'k-d', markerfacecolor='w')\n", + "ax.plot([x[0]-dx, x[0]+dx], [y_low_daily, y_low_weekly], 'k-d', markerfacecolor='w')Q\n", "\n", "y_med_daily = w['Intercept'] + w['sun[T.med]']\n", "y_med_weekly = w['Intercept'] + w['sun[T.med]'] + w['water[T.weekly]'] + w['water[T.weekly]:sun[T.med]']\n", @@ -2069,7 +2071,7 @@ "daily_water_model = ols('height ~ sun', data=plant_data[plant_data['water']=='daily']).fit()\n", "weekly_water_model = ols('height ~ sun', data=plant_data[plant_data['water']=='weekly']).fit()\n", "low_sun_model = ols('height ~ water', data=plant_data[plant_data['sun']=='low']).fit()\n", - "med_sun_model = ols('height ~ water', data=plant_data[plant_data['sun']=='med']).fit()\n", + "med_sun_model = ols('height ~ water', data=plant_data[plant_daQta['sun']=='med']).fit()\n", "high_sun_model = ols('height ~ water', data=plant_data[plant_data['sun']=='high']).fit()" ] }, @@ -2091,7 +2093,7 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 169, "id": "93ccdd87", "metadata": {}, "outputs": [ @@ -2101,7 +2103,7 @@ "0.03098093333325329" ] }, - "execution_count": 136, + "execution_count": 169, "metadata": {}, "output_type": "execute_result" } @@ -2112,7 +2114,7 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 170, "id": "d1392464", "metadata": {}, "outputs": [ @@ -2197,7 +2199,7 @@ "med-low 0.254253 False " ] }, - "execution_count": 137, + "execution_count": 170, "metadata": {}, "output_type": "execute_result" } @@ -2409,7 +2411,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 171, "id": "e6c92946", "metadata": {}, "outputs": [ @@ -2434,43 +2436,45 @@ " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", - " <th>df</th>\n", " <th>sum_sq</th>\n", - " <th>mean_sq</th>\n", + " <th>df</th>\n", " <th>F</th>\n", " <th>PR(>F)</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", + " <th>Intercept</th>\n", + " <td>246.402000</td>\n", + " <td>1.0</td>\n", + " <td>302.891211</td>\n", + " <td>4.094979e-15</td>\n", + " </tr>\n", + " <tr>\n", " <th>water</th>\n", + " <td>2.401000</td>\n", " <td>1.0</td>\n", - " <td>15.552000</td>\n", - " <td>15.552000</td>\n", - " <td>19.117394</td>\n", - " <td>0.000205</td>\n", + " <td>2.951444</td>\n", + " <td>9.867817e-02</td>\n", " </tr>\n", " <tr>\n", " <th>sun</th>\n", + " <td>8.041333</td>\n", " <td>2.0</td>\n", - " <td>21.424667</td>\n", - " <td>10.712333</td>\n", - " <td>13.168203</td>\n", - " <td>0.000138</td>\n", + " <td>4.942430</td>\n", + " <td>1.593920e-02</td>\n", " </tr>\n", " <tr>\n", " <th>water:sun</th>\n", - " <td>2.0</td>\n", " <td>5.694000</td>\n", - " <td>2.847000</td>\n", + " <td>2.0</td>\n", " <td>3.499693</td>\n", - " <td>0.046376</td>\n", + " <td>4.637649e-02</td>\n", " </tr>\n", " <tr>\n", " <th>Residual</th>\n", - " <td>24.0</td>\n", " <td>19.524000</td>\n", - " <td>0.813500</td>\n", + " <td>24.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", @@ -2479,20 +2483,21 @@ "</div>" ], "text/plain": [ - " df sum_sq mean_sq F PR(>F)\n", - "water 1.0 15.552000 15.552000 19.117394 0.000205\n", - "sun 2.0 21.424667 10.712333 13.168203 0.000138\n", - "water:sun 2.0 5.694000 2.847000 3.499693 0.046376\n", - "Residual 24.0 19.524000 0.813500 NaN NaN" + " sum_sq df F PR(>F)\n", + "Intercept 246.402000 1.0 302.891211 4.094979e-15\n", + "water 2.401000 1.0 2.951444 9.867817e-02\n", + "sun 8.041333 2.0 4.942430 1.593920e-02\n", + "water:sun 5.694000 2.0 3.499693 4.637649e-02\n", + "Residual 19.524000 24.0 NaN NaN" ] }, - "execution_count": 126, + "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sm.stats.anova_lm(model_with_interaction)" + "sm.stats.anova_lm(model_with_interaction, typ=3)" ] }, {