From cf3d53a30f59d10dca18f02e9bef9e5c112cb7d5 Mon Sep 17 00:00:00 2001 From: twhmitchell Date: Thu, 23 Nov 2017 19:30:36 -0500 Subject: [PATCH 1/3] Add files via upload --- Exercise+12%2C+Part+2.html | 11897 +++++++++++++++++++++++++++++++++++ 1 file changed, 11897 insertions(+) create mode 100644 Exercise+12%2C+Part+2.html diff --git a/Exercise+12%2C+Part+2.html b/Exercise+12%2C+Part+2.html new file mode 100644 index 0000000..c93f69b --- /dev/null +++ b/Exercise+12%2C+Part+2.html @@ -0,0 +1,11897 @@ + + + +Exercise 12, Part 2 + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+

Exercise 12, Part 2:

+

Exercise 12, Part 2 consists of three portions, with each part requiring a regular expression that matches information of a certain type. This file will provide answers to the three prompts, along with explanations for why the regular expression exclusively matches desired strings and excludes others.

+ +
+
+
+
+
+
In [ ]:
+
+
+
# Regular expression 1: Times after noon, but before midnight when reported in military format:
+
+import re
+
+^([1][2-9]|2[0-3]):?([0-5]\d)$
+    
+# Match: 19:15
+
+# Non-match 1: 11:15
+
+# Non-match 2: 24:00
+
+# Non-match 3: 35:65
+
+ +
+
+
+ +
+
+
+
+
+

Explanation for solution to Part One:

+

The ^ character indicates the start of the string, while the ( character indicates where to begin capturing the group. The [1] indicates that the first character must be a 1, followed by any number between 2 and 9. This portion of the regular expression captures times from noon to 7 PM, otherwise known as 12-19:00 hours. The | operates as an or, which allows the first character to alternatively be a 2. [0-3] allows for the second character to be a 0,1,2,3 - this captures the remaining times to be captured, namely 8 PM to 11:59 PM.

+

The :? allows for an optional colon; some times are reported with the colon, whereas others may not use a colon when reporting time. (e.g. 19:00 vs. 1900).

+

The [0-5] portion ensures that times fall between 0 and 59 minutes, along with the \d, which represents any digit. This portion could have alternatively been written as [0-9].

+

The ) character indicates the end of the captured group, and the $ indicates the end of the string.

+ +
+
+
+
+
+
In [ ]:
+
+
+
# Regular expression 2: Genus species names expressed in the format G. species (e.g. H. sapien)
+
+import re 
+
+^([A-Z]\.\s[a-z]{1,21})$
+
+# Match: H. sapiens
+
+# Non-match 1: Homo sapiens
+
+# Non-match 2: m. musculus
+
+ +
+
+
+ +
+
+
+
+
+

Explanation for solution to Part Two:

+

Again, the ^ character indicates the start of the string, while the ( character indicates where to begin capturing the group. The [A-Z] portion of the regular expression will accept input of any capital letter while excluding any input that is in the lowercase (i.e. [a-z]). Since a period must follow the capitalized letter of the genus name, a . is added after the genus name. A space is introduced as indicated as desired by the prompt by adding \s.

+

The longest species name is 21 characters long, so the regular expression should accept the full set of lowercase letters of length 1 to 21. This is accomplished through [a-z]{1,21}. The ) character indicates the end of the captured group, and the $ indicates the end of the string.

+ +
+
+
+
+
+
In [ ]:
+
+
+
# Regular expression 3: Social Security numbers (e.g. 389-05-4771)
+
+import re
+
+^([\d]{3}[-][\d]{2}[-][\d]{4})$
+
+# Match: 022-57-9213
+
+# Non-match 1: 0225-7-92-13
+
+# Non-match 2: A0B-12-3456
+
+ +
+
+
+ +
+
+
+
+
+

Explanation for solution to Part Three:

+

Based upon the example, Social Security numbers obey the format AAA-BB-CCCC. This can be captured rather easily using regular expressions.

+

Like the regular expression for part one and two, the ^ will indicates the start of the string; the ( character indicates where to begin capturing the group. The [\d]{3} will capture any sequence of three digits. The [-] requires a dash separating the first three numbers from the next two numbers, which are denoted as [\d]{2}. The last portion consists of any four digit pattern, which can be written as [\d]{4}. The ) character indicates the end of the captured group, and the $ indicates the end of the string.

+ +
+
+
+
+
+ + + + + + From e54a74be743f4bfa5c2ce147936557572d71b987 Mon Sep 17 00:00:00 2001 From: twhmitchell Date: Thu, 23 Nov 2017 19:34:13 -0500 Subject: [PATCH 2/3] Add files via upload --- Exercise+12%2C+Part+2.ipynb | 137 ++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 Exercise+12%2C+Part+2.ipynb diff --git a/Exercise+12%2C+Part+2.ipynb b/Exercise+12%2C+Part+2.ipynb new file mode 100644 index 0000000..b453c9e --- /dev/null +++ b/Exercise+12%2C+Part+2.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Exercise 12, Part 2:\n", + "\n", + "Exercise 12, Part 2 consists of three portions, with each part requiring a regular expression that matches information of a certain type. This file will provide answers to the three prompts, along with explanations for why the regular expression exclusively matches desired strings and excludes others." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Regular expression 1: Times after noon, but before midnight when reported in military format:\n", + "\n", + "import re\n", + "\n", + "^([1][2-9]|2[0-3]):?([0-5]\\d)$\n", + " \n", + "# Match: 19:15\n", + "\n", + "# Non-match 1: 11:15\n", + "\n", + "# Non-match 2: 24:00\n", + "\n", + "# Non-match 3: 35:65" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Explanation for solution to Part One:\n", + "\n", + "The ^ character indicates the start of the string, while the ( character indicates where to begin capturing the group. The [1] indicates that the first character must be a 1, followed by any number between 2 and 9. This portion of the regular expression captures times from noon to 7 PM, otherwise known as 12-19:00 hours. The | operates as an or, which allows the first character to alternatively be a 2. [0-3] allows for the second character to be a 0,1,2,3 - this captures the remaining times to be captured, namely 8 PM to 11:59 PM.\n", + "\n", + "The :? allows for an optional colon; some times are reported with the colon, whereas others may not use a colon when reporting time. (e.g. 19:00 vs. 1900).\n", + "\n", + "The [0-5] portion ensures that times fall between 0 and 59 minutes, along with the \\d, which represents any digit. This portion could have alternatively been written as [0-9].\n", + "\n", + "The ) character indicates the end of the captured group, and the $ indicates the end of the string. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Regular expression 2: Genus species names expressed in the format G. species (e.g. H. sapien)\n", + "\n", + "import re \n", + "\n", + "^([A-Z]\\.\\s[a-z]{1,21})$\n", + "\n", + "# Match: H. sapiens\n", + "\n", + "# Non-match 1: Homo sapiens\n", + "\n", + "# Non-match 2: m. musculus" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Explanation for solution to Part Two:\n", + " \n", + "Again, the ^ character indicates the start of the string, while the ( character indicates where to begin capturing the group. The [A-Z] portion of the regular expression will accept input of any capital letter while excluding any input that is in the lowercase (i.e. [a-z]). Since a period must follow the capitalized letter of the genus name, a \\. is added after the genus name. A space is introduced as indicated as desired by the prompt by adding \\s.\n", + "\n", + "The longest species name is 21 characters long, so the regular expression should accept the full set of lowercase letters of length 1 to 21. This is accomplished through [a-z]{1,21}. The ) character indicates the end of the captured group, and the $ indicates the end of the string. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Regular expression 3: Social Security numbers (e.g. 389-05-4771)\n", + "\n", + "import re\n", + "\n", + "^([\\d]{3}[-][\\d]{2}[-][\\d]{4})$\n", + "\n", + "# Match: 022-57-9213\n", + "\n", + "# Non-match 1: 0225-7-92-13\n", + "\n", + "# Non-match 2: A0B-12-3456" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Explanation for solution to Part Three: \n", + "\n", + "Based upon the example, Social Security numbers obey the format AAA-BB-CCCC. This can be captured rather easily using regular expressions.\n", + "\n", + "Like the regular expression for part one and two, the ^ will indicates the start of the string; the ( character indicates where to begin capturing the group. The [\\d]{3} will capture any sequence of three digits. The [-] requires a dash separating the first three numbers from the next two numbers, which are denoted as [\\d]{2}. The last portion consists of any four digit pattern, which can be written as [\\d]{4}. The ) character indicates the end of the captured group, and the $ indicates the end of the string. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 0014f63888a0ad652dbc7bacc5ac65b66e7abd5d Mon Sep 17 00:00:00 2001 From: Balaji Sampathkumar Date: Fri, 24 Nov 2017 00:56:21 -0500 Subject: [PATCH 3/3] EX12 Q1 html and python notebook - Balaji --- EX_12_Q1.html | 12568 +++++++++++++++++++++++++++++++++++++++++++++++ EX_12_Q1.ipynb | 324 ++ 2 files changed, 12892 insertions(+) create mode 100644 EX_12_Q1.html create mode 100644 EX_12_Q1.ipynb diff --git a/EX_12_Q1.html b/EX_12_Q1.html new file mode 100644 index 0000000..db66152 --- /dev/null +++ b/EX_12_Q1.html @@ -0,0 +1,12568 @@ + + + +EX_12_Q1 + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+

Performing likelihood ratio test to find out if there is difference in weight when chicken is fed soybean vs. sunflower

+
+
+
+
+
+
+
+
+

The dataset in “chickwts.txt” has columns as chick weights and feed type

+
+
+
+
+
+
In [24]:
+
+
+
import numpy
+import os
+import pandas
+import plotnine
+from plotnine import *
+import scipy
+from scipy.optimize import minimize
+from scipy.stats import norm
+from scipy.stats import chi2
+from plotnine import *
+os.listdir('.')
+os.chdir('/Users/sampathkumarbalaji/EX_12/Intro_Biocom_ND_319_Tutorial12')
+chick_weights = pandas.read_csv("chickwts.txt")
+
+ +
+
+
+ +
+
+
+
+
+
+

And the dataset with columns being weight and feed looks like:

+
+
+
+
+
+
In [4]:
+
+
+
print (chick_weights)
+
+ +
+
+
+ +
+
+ + +
+
+ +
+
    weight       feed
+0      179  horsebean
+1      160  horsebean
+2      136  horsebean
+3      227  horsebean
+4      217  horsebean
+5      168  horsebean
+6      108  horsebean
+7      124  horsebean
+8      143  horsebean
+9      140  horsebean
+10     309    linseed
+11     229    linseed
+12     181    linseed
+13     141    linseed
+14     260    linseed
+15     203    linseed
+16     148    linseed
+17     169    linseed
+18     213    linseed
+19     257    linseed
+20     244    linseed
+21     271    linseed
+22     243    soybean
+23     230    soybean
+24     248    soybean
+25     327    soybean
+26     329    soybean
+27     250    soybean
+28     193    soybean
+29     271    soybean
+..     ...        ...
+41     226  sunflower
+42     320  sunflower
+43     295  sunflower
+44     334  sunflower
+45     322  sunflower
+46     297  sunflower
+47     318  sunflower
+48     325   meatmeal
+49     257   meatmeal
+50     303   meatmeal
+51     315   meatmeal
+52     380   meatmeal
+53     153   meatmeal
+54     263   meatmeal
+55     242   meatmeal
+56     206   meatmeal
+57     344   meatmeal
+58     258   meatmeal
+59     368     casein
+60     390     casein
+61     379     casein
+62     260     casein
+63     404     casein
+64     318     casein
+65     352     casein
+66     359     casein
+67     216     casein
+68     222     casein
+69     283     casein
+70     332     casein
+
+[71 rows x 2 columns]
+
+
+
+ +
+
+ +
+
+
+
+
+
+

The plot looks like:

+
+
+
+
+
+
In [22]:
+
+
+
ggplot(chick_weights,aes(x="weight",y="feed"))+geom_point(aes(x="weight",y="feed"))
+
+ +
+
+
+ +
+
+ + +
+
+ + + +
+ +
+ +
+ +
+
Out[22]:
+ + + +
+
<ggplot: (7539846264)>
+
+ +
+ +
+
+ +
+
+
+
+
+
+

The question is to find if there is difference in weight of the chicken when they are fed soybean vs. sunflower feed. Null Hypothesis: "The weight remains the same (no difference)", Alternate hypothesis: "Yes the weights differ based off the feed type".

+
+
+
+
+
+
In [32]:
+
+
+
Sun_Soy_feed_DS = chick_weights.query('feed == "sunflower" or feed == "soybean"')
+Sun_Soy_feed_DS['x'] = [0 if feedtype == 'sunflower' else 1 for feedtype in Sun_Soy_feed_DS.feed]
+
+ +
+
+
+ +
+
+ + +
+
+ +
+
/Users/sampathkumarbalaji/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
+A value is trying to be set on a copy of a slice from a DataFrame.
+Try using .loc[row_indexer,col_indexer] = value instead
+
+See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
+  
+
+
+
+ +
+
+ +
+
+
+
+
+
+

Defining the null and alternate hypotheses functions

+
+
+
+
+
+
In [25]:
+
+
+
def null_hyp(p,obs):
+    B0=p[0]
+    sigma=p[1]
+    
+    expected=B0
+    nll= -1*norm(expected,sigma).logpdf(obs.weight).sum()
+    return nll
+
+def alt_hyp(p,obs):
+    B0=p[0]
+    B1=p[1]
+    sigma=p[2]
+    
+    expected=B0+B1*obs.x
+    nll=-1*norm(expected,sigma).logpdf(obs.weight).sum()
+    return nll
+
+ +
+
+
+ +
+
+
+
In [27]:
+
+
+
initialGuess_null_hyp=numpy.array([1,1])
+initialGuess_alt_hyp=numpy.array([1,1,1])
+
+ +
+
+
+ +
+
+
+
+
+
+

Minimize functions for null and alt hyp

+
+
+
+
+
+
In [28]:
+
+
+
fitnull=minimize(null_hyp,initialGuess_null_hyp,method="Nelder-Mead",options={'disp': True},args=Sun_Soy_feed_DS)
+fitalt=minimize(alt_hyp,initialGuess_alt_hyp,method="Nelder-Mead",options={'disp': True},args=Sun_Soy_feed_DS)
+
+ +
+
+
+ +
+
+ + +
+
+ +
+
Optimization terminated successfully.
+         Current function value: 145.240592
+         Iterations: 85
+         Function evaluations: 162
+Optimization terminated successfully.
+         Current function value: 138.469162
+         Iterations: 200
+         Function evaluations: 363
+
+
+
+ +
+
+ +
+
+
+
+
+
+

Chi squared calculations and finding the p-value:

+
+
+
+
+
+
In [29]:
+
+
+
1-scipy.stats.chi2.cdf(x=-2*(fitalt.fun-fitnull.fun),df=1)
+
+ +
+
+
+ +
+
+ + +
+
Out[29]:
+ + + +
+
0.00023317672869549444
+
+ +
+ +
+
+ +
+
+
+
+
+
+

Since the p-value is small (< 0.05), it means that the null hypothesis of there is no difference in weight gained based off the feedtype can be rejected.

+ +
+
+
+
+
+ + + + + + diff --git a/EX_12_Q1.ipynb b/EX_12_Q1.ipynb new file mode 100644 index 0000000..fe123fe --- /dev/null +++ b/EX_12_Q1.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Performing likelihood ratio test to find out if there is difference in weight when chicken is fed soybean vs. sunflower" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The dataset in “chickwts.txt” has columns as chick **weights** and **feed** type" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy\n", + "import os\n", + "import pandas\n", + "import plotnine\n", + "from plotnine import *\n", + "import scipy\n", + "from scipy.optimize import minimize\n", + "from scipy.stats import norm\n", + "from scipy.stats import chi2\n", + "from plotnine import *\n", + "os.listdir('.')\n", + "os.chdir('/Users/sampathkumarbalaji/EX_12/Intro_Biocom_ND_319_Tutorial12')\n", + "chick_weights = pandas.read_csv(\"chickwts.txt\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### And the dataset with columns being **weight** and **feed** looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " weight feed\n", + "0 179 horsebean\n", + "1 160 horsebean\n", + "2 136 horsebean\n", + "3 227 horsebean\n", + "4 217 horsebean\n", + "5 168 horsebean\n", + "6 108 horsebean\n", + "7 124 horsebean\n", + "8 143 horsebean\n", + "9 140 horsebean\n", + "10 309 linseed\n", + "11 229 linseed\n", + "12 181 linseed\n", + "13 141 linseed\n", + "14 260 linseed\n", + "15 203 linseed\n", + "16 148 linseed\n", + "17 169 linseed\n", + "18 213 linseed\n", + "19 257 linseed\n", + "20 244 linseed\n", + "21 271 linseed\n", + "22 243 soybean\n", + "23 230 soybean\n", + "24 248 soybean\n", + "25 327 soybean\n", + "26 329 soybean\n", + "27 250 soybean\n", + "28 193 soybean\n", + "29 271 soybean\n", + ".. ... ...\n", + "41 226 sunflower\n", + "42 320 sunflower\n", + "43 295 sunflower\n", + "44 334 sunflower\n", + "45 322 sunflower\n", + "46 297 sunflower\n", + "47 318 sunflower\n", + "48 325 meatmeal\n", + "49 257 meatmeal\n", + "50 303 meatmeal\n", + "51 315 meatmeal\n", + "52 380 meatmeal\n", + "53 153 meatmeal\n", + "54 263 meatmeal\n", + "55 242 meatmeal\n", + "56 206 meatmeal\n", + "57 344 meatmeal\n", + "58 258 meatmeal\n", + "59 368 casein\n", + "60 390 casein\n", + "61 379 casein\n", + "62 260 casein\n", + "63 404 casein\n", + "64 318 casein\n", + "65 352 casein\n", + "66 359 casein\n", + "67 216 casein\n", + "68 222 casein\n", + "69 283 casein\n", + "70 332 casein\n", + "\n", + "[71 rows x 2 columns]\n" + ] + } + ], + "source": [ + "print (chick_weights)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The plot looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nAQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ggplot(chick_weights,aes(x=\"weight\",y=\"feed\"))+geom_point(aes(x=\"weight\",y=\"feed\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The question is to find if there is difference in weight of the chicken when they are fed soybean vs. sunflower feed. Null Hypothesis: *\"The weight remains the same (no difference)\"*, Alternate hypothesis: *\"Yes the weights differ based off the feed type\"*." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/sampathkumarbalaji/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", + " \n" + ] + } + ], + "source": [ + "Sun_Soy_feed_DS = chick_weights.query('feed == \"sunflower\" or feed == \"soybean\"')\n", + "Sun_Soy_feed_DS['x'] = [0 if feedtype == 'sunflower' else 1 for feedtype in Sun_Soy_feed_DS.feed]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining the null and alternate hypotheses functions" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def null_hyp(p,obs):\n", + " B0=p[0]\n", + " sigma=p[1]\n", + " \n", + " expected=B0\n", + " nll= -1*norm(expected,sigma).logpdf(obs.weight).sum()\n", + " return nll\n", + "\n", + "def alt_hyp(p,obs):\n", + " B0=p[0]\n", + " B1=p[1]\n", + " sigma=p[2]\n", + " \n", + " expected=B0+B1*obs.x\n", + " nll=-1*norm(expected,sigma).logpdf(obs.weight).sum()\n", + " return nll\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "initialGuess_null_hyp=numpy.array([1,1])\n", + "initialGuess_alt_hyp=numpy.array([1,1,1])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Minimize functions for null and alt hyp" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 145.240592\n", + " Iterations: 85\n", + " Function evaluations: 162\n", + "Optimization terminated successfully.\n", + " Current function value: 138.469162\n", + " Iterations: 200\n", + " Function evaluations: 363\n" + ] + } + ], + "source": [ + "fitnull=minimize(null_hyp,initialGuess_null_hyp,method=\"Nelder-Mead\",options={'disp': True},args=Sun_Soy_feed_DS)\n", + "fitalt=minimize(alt_hyp,initialGuess_alt_hyp,method=\"Nelder-Mead\",options={'disp': True},args=Sun_Soy_feed_DS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chi squared calculations and finding the p-value:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.00023317672869549444" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1-scipy.stats.chi2.cdf(x=-2*(fitalt.fun-fitnull.fun),df=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the p-value is small (< 0.05), it means that the null hypothesis of there is no difference in weight gained based off the feedtype can be rejected." + ] + } + ], + "metadata": { + "celltoolbar": "Attachments", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}