-
-
Save DustinAlandzes/44c62955f4f51778882f631c40d39007 to your computer and use it in GitHub Desktop.
ANOVA in python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "metadata": { | |
| "name": "", | |
| "signature": "sha256:de781fe4e1e6c8bb4d29cbb4aefd61d7a7f7284c386a82fcb14e25fb7650cccc" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "<h1 id=\"toctitle\">Contents</h1>\n", | |
| "<ul id=\"toc\"/>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 1, | |
| "metadata": {}, | |
| "source": [ | |
| "Analysis of variance in Python" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The examples in this Gist is only for \"practice\", and I under no circumstances claim that anything is correct!\n", | |
| "PLEASE confirm any statements and text I have provided here, in a relevant text book!\n", | |
| "\n", | |
| "The python code is only for practicing, to find out \"how it works\", behind the scene.\n", | |
| "\n", | |
| "Table of contents made by: \n", | |
| "* http://ludovicarnold.altervista.org/javascript-table-contents-ipython-notebook/\n", | |
| "* http://ipython.org/ipython-doc/1/interactive/notebook.html" | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Background" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "ANOVA is analysis of variance between repeated measures of samples.\n", | |
| "\n", | |
| "ANOVA was developed in the 1920\u2019s by R.A. Fisher. F stands for Fischer." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "What is the difference between t-test and F-test ?" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Typically a t-test is used to examine the differences between the means of two groups. For example, in an experiment you may want to compare the overall mean for the group on which the manipulation took place vs a control group.\n", | |
| "\n", | |
| "However, if you have more than two groups, you shouldn't just use multiple t-tests as the error adds up (see familywise error) and thus you increase your chances of finding an effect when there really isn't one (i.e. a type 1 error). Therefore when you have more than two groups to compare e.g. in a drugs trial when you have a high dose, low does and a placebo group (so 3 groups), you use ANOVA to examine whether there any differences between the groups.\n", | |
| "\n", | |
| "To examine whether there are differences between the groups you would use the F-ratio, which essentially measures the improvement due to fitting the model i.e. the group means versus the grand mean of scores for all participant and compares this against the error remaining in the model, which is the difference between the actual scores and the respective means of the groups. Therefore, the F-test is the ratio of systematic variance : unsystematic variance, so higher scores are better.\n", | |
| "\n", | |
| "Going a little beyond, an ANOVA only tells you that there are differences between your groups, not where they lie. Therefore you would use a priori contrasts to test hypothesised differences between the groups or post-hoc tests to examine where the differences lie.\n", | |
| "\n", | |
| "* For one variable case (testing two samples), t^2 = F, the square of t-statistic is equal to value of F-statistic.\n", | |
| "\n", | |
| "Note: If the number of groups is k, the number of comparisons that can be done is: n=(k*(k-1)) / 2. If k=2 (pairwise comparison), n=1. If k=3, n=3. If k=4, n=6 and so forth.\n", | |
| "\n", | |
| "Note: Familywise error = 1 - (0.95)^n, where n is the number of hypothesis tests performed. If doing pairwise test, there is 5% pct chance of false positive. If making three n-tests (3 groups), there is 14.3% chance of finding a false positive.\n", | |
| "\n", | |
| "Think the F-ratio as a \"signal-to-noise\", where the signal is the error/change caused by the hypothesis model, and the noise is the background noise of the data. The stronger(higher) F-ratio, the more we can trust that our hypothesis model, is not due to random noise.\n", | |
| "\n", | |
| "Links\n", | |
| "* https://www.youtube.com/watch?v=SULO2-gjZoY for all lectures, https://www.youtube.com/watch?v=CA1IukUdJRY&list=PL343F1B5F55734D55\n", | |
| "* http://www.biostat.umn.edu/~susant/Fall11ph6414/Section13_Part1.pdf" | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "How to calculate the p-value" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "If k=3, one would perform an ANOVA test between the 3 groups. Let's say that in each of these groups, we have 5 measurements (a balanced design). \n", | |
| "Our null-hypothesis H0, is there is no difference between the 3 groups. \n", | |
| "The other hypothesis is, that there is a difference between the three groups, due to a treatment. \n", | |
| "In most normal cases, we would like to \"disprove/reject\" the \"null-hypothesis\", to say that there is a difference between the three groups, due to a treatment. And that this difference is not due to random error. \n", | |
| "How is it done ? \n", | |
| "One would first determine the F-ratio to determine if there is any difference between the 3 groups (we still don't know/care which group differ). \n", | |
| "Let's say this F value is 5.12. This \"signal-to-noise\" is rather high. From this number we can expect that there is a variation between the 3 groups means, which is not due to random errors.\n", | |
| "\n", | |
| "The between groups of freedom (dof_g) is equal: dof_g = 3 -1 \n", | |
| "The within-group degrees of freedom (dof_w) is: dof_w= (5-1)+(5-1)+(5-1) \n", | |
| "The -1 is because that we for each group find an average, and \"use one degree of freedom on this\".\n", | |
| "\n", | |
| "One can from the F-distribution calculate the probability for observing the F-ratio of 5.12. \n", | |
| "One would report these numbers: \n", | |
| "* F(dof_g, dof_w) = F(2, 12)\n", | |
| "* p = 0.025\n", | |
| "\n", | |
| "To calculate p-value in python do:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from scipy import stats\n", | |
| "p=stats.fprob(2, 12, 5.12)\n", | |
| "print p" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "0.0246762282557\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 2 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We can here state, that there is a significant difference between the groups. The p-value is lower than the \"normal\" 5 pct error. p < 0.05.\n", | |
| "\n", | |
| "If one finds a significant difference, then afterwards one would test which group differ from each. These tests are normally called post-hoc tests.\n", | |
| "\n", | |
| "Note: We can do the inverse of the probability to find the F-value given probability and the degrees of freedom." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from scipy import special\n", | |
| "F = special.fdtri(2, 12, 1-0.025)\n", | |
| "print F\n", | |
| " \n", | |
| "F = special.fdtri(2, 12, 1-0.0246762282557)\n", | |
| "print F" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "5.09586716578\n", | |
| "5.12\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 3 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "What is the meaning of p-value ?" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The P value is a slippery concept, and the following statement is not true, but gives an idea \"how-to-think\". \n", | |
| "The p-value \"can be interpreted\" the probability that you wrongly reject\" the \"null-hypothesis\". Or in another way, the p-value \"can be interpreted\" as the probability that you make a false positive. So, the lower p-value the better. \n", | |
| "To put it different 1 - p-value, \"can be interpreted\" as the probability that you can accept the other hypothesis, that there is difference. Or in another way, the 1 - p-value \"can be interpreted\" as the probability that you make a true positive.\n", | |
| "\n", | |
| "The more correct interpretation is taken from: http://blog.minitab.com/blog/adventures-in-statistics/how-to-correctly-interpret-p-values \n", | |
| "One has to acknowledge/understand, that we in reality are performing tests on samples from a whole population of samples.\n", | |
| "\n", | |
| "* A low p value suggests that your sample provides enough evidence that you can reject the null hypothesis for the entire population.\n", | |
| "\n", | |
| "* A p value is the probability of obtaining an effect at least as extreme as the one in your sample data, assuming the truth of the null hypothesis.\n", | |
| "\n", | |
| "* In another way. Expect the null hypothesis to be true. How often would an observed effect be due to sampling error? And how often would it not be due to sampling error.\n", | |
| "* If p=0.04. If the null hypothesis is true, you would obtain the observed difference or more in 4% of studies due to random sampling error.\n", | |
| "* If p=0.01. If the null hypothesis is true, you would obtain the observed difference or more in 1% of studies due to random sampling error.\n", | |
| "\n", | |
| "Again, the lower p, the better. If we repeat the whole experiment 100 times with same sample size each time, there is 4% (or even only 1%), that the observed difference is due to random sampling error. The \"rest\" of the times, the observed difference is \"not due\" to random sampling error." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Are you frustrated about your p-value ?" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Have a look on this: http://www.sumsar.net/blog/2014/02/a-significantly-improved-test\n", | |
| "\n", | |
| "If you repeat the whole experiment/study, there is high chance of getting another p-value" | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 1, | |
| "metadata": {}, | |
| "source": [ | |
| "Worked examples in python" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Here follows some examples to do the t-statistics in python." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Student's t-test\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "For data, see Student's t-test, Worked examples: https://en.wikipedia.org/wiki/Student%27s_t-test#Worked_examples" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "from scipy import stats\n", | |
| " \n", | |
| "A1 = np.array([30.02, 29.99, 30.11, 29.97, 30.01, 29.99])\n", | |
| "A2 = np.array([29.89, 29.93, 29.72, 29.98, 30.02, 29.98])\n", | |
| " \n", | |
| "X1 = np.mean(A1)\n", | |
| "X2 = np.mean(A2)\n", | |
| " \n", | |
| "nominator = X1 - X2\n", | |
| "print \"X1 - X2 = %1.3f\"%nominator\n", | |
| " \n", | |
| "sd1 = np.std(A1, ddof=1)\n", | |
| "sd2 = np.std(A2, ddof=1)\n", | |
| " \n", | |
| "print \"Sample standard deviations std_1=%1.2f and std_2=%1.2f\"%(sd1, sd2)\n", | |
| " \n", | |
| "# To square the standard deviation, you get the variance.\n", | |
| "s1 = np.square(sd1)\n", | |
| "n1 = len(A1)\n", | |
| " \n", | |
| "s2 = np.square(sd2)\n", | |
| "n2 = len(A2)\n", | |
| " \n", | |
| "denominator = np.sqrt(s1/n1 + s2/n2 )\n", | |
| "print \"Denominator is : %1.4f\"%(denominator)\n", | |
| " \n", | |
| "df = np.square(s1/n1 + s2/n2) / ( np.square(s1/n1)/(n1-1) + np.square(s2/n2)/(n2-1) )\n", | |
| "print \"Degrees of freedom is : %1.2f\"%(df)\n", | |
| " \n", | |
| "t = nominator / denominator\n", | |
| " \n", | |
| "print \"The test statistic is : %1.3f\"%(t)\n", | |
| " \n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t), df)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| " \n", | |
| "print 'The two-tailed test p-value is approximately %1.3f and the one-tailed p-value is approximately %1.3f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| "df = 10\n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t), df)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| "print 'With df=10, the two-tailed test p-value is approximately %1.3f and the one-tailed p-value is approximately %1.3f'%(p_two_tailed, p_one_tailed)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "X1 - X2 = 0.095\n", | |
| "Sample standard deviations std_1=0.05 and std_2=0.11\n", | |
| "Denominator is : 0.0485\n", | |
| "Degrees of freedom is : 7.03\n", | |
| "The test statistic is : 1.959\n", | |
| "The two-tailed test p-value is approximately 0.091 and the one-tailed p-value is approximately 0.045\n", | |
| "With df=10, the two-tailed test p-value is approximately 0.079 and the one-tailed p-value is approximately 0.039\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 8 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Welch's t test" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "For data, see Welch's t test.: https://en.wikipedia.org/wiki/Welch%27s_t_test#Examples" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| "A1 = {}\n", | |
| "A2 = {}\n", | |
| "A1[0] = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4]\n", | |
| "A2[0] = [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2, 21.9, 22.1, 22.9, 20.5, 24.4]\n", | |
| " \n", | |
| "A1[1] = [17.2, 20.9, 22.6, 18.1, 21.7, 21.4, 23.5, 24.2, 14.7, 21.8]\n", | |
| "A2[1] = [21.5, 22.8, 21.0, 23.0, 21.6, 23.6, 22.5, 20.7, 23.4, 21.8, 20.7, 21.7, 21.5, 22.5, 23.6, 21.5, 22.5, 23.5, 21.5, 21.8]\n", | |
| " \n", | |
| "A1[2] = [19.8, 20.4, 19.6, 17.8, 18.5, 18.9, 18.3, 18.9, 19.5, 22.0]\n", | |
| "A2[2] = [28.2, 26.6, 20.1, 23.3, 25.2, 22.1, 17.7, 27.6, 20.6, 13.7, 23.2, 17.5, 20.6, 18.0, 23.9, 21.6, 24.3, 20.4, 24.0, 13.2]\n", | |
| " \n", | |
| "# Create data table\n", | |
| "d = np.zeros((3,), dtype=[\n", | |
| "('N1', int), ('X1', float), ('s1', float), \n", | |
| "('N2', int), ('X2', float), ('s2', float), \n", | |
| "('s_t', float), ('s_v', float), ('s_P', float),\n", | |
| "('w_t', float), ('w_v', float), ('w_P', float)\n", | |
| "])\n", | |
| " \n", | |
| "# Assign data for examples\n", | |
| "for i in range(0,3):\n", | |
| " d['N1'][i] = len(A1[i])\n", | |
| " d['X1'][i] = np.mean(A1[i])\n", | |
| " d['s1'][i] = np.var(A1[i], ddof=1)\n", | |
| " d['N2'][i] = len(A2[i])\n", | |
| " d['X2'][i] = np.mean(A2[i])\n", | |
| " d['s2'][i] = np.var(A2[i], ddof=1)\n", | |
| " d['s_v'][i] = (d['N1'][i] - 1) + (d['N2'][i] - 1)\n", | |
| " d['s_t'][i] = (d['X1'][i] - d['X2'][i])/( np.sqrt( ((d['N1'][i]-1)*d['s1'][i]+(d['N2'][i]-1)*d['s2'][i])/(d['s_v'][i]) )*np.sqrt(1./d['N1'][i] + 1./d['N2'][i]) )\n", | |
| " d['s_P'][i] = stats.distributions.t.sf(np.abs(d['s_t'][i]), d['s_v'][i] )*2\n", | |
| " d['w_v'][i] = np.square(d['s1'][i]/d['N1'][i] + d['s2'][i]/d['N2'][i]) / ( np.square(d['s1'][i])/(np.square(d['N1'][i])*(d['N1'][i]-1)) + np.square(d['s2'][i])/(np.square(d['N2'][i])*(d['N2'][i]-1)) )\n", | |
| " d['w_t'][i] = (d['X1'][i] - d['X2'][i])/np.sqrt(d['s1'][i]/d['N1'][i] + d['s2'][i]/d['N2'][i])\n", | |
| " d['w_P'][i] = stats.distributions.t.sf(np.abs(d['w_t'][i]), d['w_v'][i] )*2\n", | |
| " \n", | |
| "# Use pandas to print pretty\n", | |
| "d_pd = pd.DataFrame(d)\n", | |
| " \n", | |
| "print d_pd\n", | |
| " \n", | |
| "print(\"\\n########### Now try some small analysis with pandas #########\")\n", | |
| "# Now analyse directly with pandas\n", | |
| "# Create data table for example 1\n", | |
| "ex1 = np.array([A1[0], A2[0]])\n", | |
| "ex1 = np.core.records.fromarrays(ex1, names='A1, A2', formats = 'f8, f8')\n", | |
| "ex1_pd = pd.DataFrame(ex1)\n", | |
| " \n", | |
| "print ex1_pd\n", | |
| "print \"\\n\"\n", | |
| "print \"Mean across:\\n\", ex1_pd.mean()\n", | |
| "print \"\\n\"\n", | |
| "print ex1_pd.describe()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| " N1 X1 s1 N2 X2 s2 s_t s_v s_P \\\n", | |
| "0 15 20.82 7.867429 15 22.986667 3.812667 -2.455356 28 0.020545 \n", | |
| "1 10 20.61 9.041000 20 22.135000 0.898184 -2.100050 28 0.044859 \n", | |
| "2 10 19.37 1.449000 20 21.590000 17.115684 -1.649205 28 0.110282 \n", | |
| "\n", | |
| " w_t w_v w_P \n", | |
| "0 -2.455356 24.988529 0.021378 \n", | |
| "1 -1.565434 9.904741 0.148842 \n", | |
| "2 -2.219241 24.496223 0.035972 \n", | |
| "\n", | |
| "[3 rows x 12 columns]\n", | |
| "\n", | |
| "########### Now try some small analysis with pandas #########\n", | |
| " A1 A2\n", | |
| "0 27.5 27.1\n", | |
| "1 21.0 22.0\n", | |
| "2 19.0 20.8\n", | |
| "3 23.6 23.4\n", | |
| "4 17.0 23.4\n", | |
| "5 17.9 23.5\n", | |
| "6 16.9 25.8\n", | |
| "7 20.1 22.0\n", | |
| "8 21.9 24.8\n", | |
| "9 22.6 20.2\n", | |
| "10 23.1 21.9\n", | |
| "11 19.6 22.1\n", | |
| "12 19.0 22.9\n", | |
| "13 21.7 20.5\n", | |
| "14 21.4 24.4\n", | |
| "\n", | |
| "[15 rows x 2 columns]\n", | |
| "\n", | |
| "\n", | |
| "Mean across:\n", | |
| "A1 20.820000\n", | |
| "A2 22.986667\n", | |
| "dtype: float64\n", | |
| "\n", | |
| "\n", | |
| " A1 A2\n", | |
| "count 15.000000 15.000000\n", | |
| "mean 20.820000 22.986667\n", | |
| "std 2.804894 1.952605\n", | |
| "min 16.900000 20.200000\n", | |
| "25% 19.000000 21.950000\n", | |
| "50% 21.000000 22.900000\n", | |
| "75% 22.250000 23.950000\n", | |
| "max 27.500000 27.100000\n", | |
| "\n", | |
| "[8 rows x 2 columns]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 11 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Balanced ANOVA F-test given complete datasets" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "For data, see F-test, One-way_ANOVA_example: https://en.wikipedia.org/wiki/F-test#One-way_ANOVA_example" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "%matplotlib inline\n", | |
| "import numpy as np\n", | |
| "from scipy import stats\n", | |
| "from scipy import special\n", | |
| "import matplotlib.pyplot as plt\n", | |
| " \n", | |
| "a1 = np.array([6, 8, 4, 5, 3, 4])\n", | |
| "a2 = np.array([8, 12, 9, 11, 6, 8])\n", | |
| "a3 = np.array([13, 9, 11, 8, 7, 12])\n", | |
| " \n", | |
| "# Calculate the mean within each group:\n", | |
| "Y1 = np.mean(a1)\n", | |
| "Y2 = np.mean(a2)\n", | |
| "Y3 = np.mean(a3)\n", | |
| " \n", | |
| "print \"The mean within each group: Y1, Y2, Y3 = %1.1f %1.1f %1.1f\"% (Y1, Y2, Y3)\n", | |
| " \n", | |
| "# Calculate the overall mean\n", | |
| "Y = np.mean([Y1, Y2, Y3])\n", | |
| " \n", | |
| "print \"The overall mean: Y = %1.1f\"% (Y)\n", | |
| " \n", | |
| "# Calculate the \"between-group\" sum of squared differences:\n", | |
| "n1 = len(a1)\n", | |
| "n2 = len(a2)\n", | |
| "n3 = len(a3)\n", | |
| "S_B = n1*np.square(Y1-Y) + n2*np.square(Y2-Y) + n3*np.square(Y3-Y)\n", | |
| "print \"The 'between-group' sum of squared differences: S_B = %1.1f\"% (S_B)\n", | |
| " \n", | |
| "# The between-group degrees of freedom is one less than the number of groups\n", | |
| "f_b = 3-1\n", | |
| " \n", | |
| "# The between-group mean square\n", | |
| "MS_B = S_B/f_b\n", | |
| "print \"The 'between-group' mean square: MS_B = %1.1f\"% (MS_B)\n", | |
| " \n", | |
| "# Centering the data in each group\n", | |
| "a1_c = a1 - Y1\n", | |
| "a2_c = a2 - Y2\n", | |
| "a3_c = a3 - Y3\n", | |
| " \n", | |
| "# The within-group sum of squares\n", | |
| "S_W = np.sum( np.square(a1_c) + np.square(a2_c) + np.square(a3_c) )\n", | |
| "print \"The 'within-group' sum of squares: S_W = %1.1f\"% (S_W)\n", | |
| " \n", | |
| "# The within-group degrees of freedom\n", | |
| "f_W = (n1-1)+(n2-1)+(n3-1)\n", | |
| "print \"The 'within-group' degrees of freedom: f_W = %i\"% (f_W)\n", | |
| " \n", | |
| "# The within-group mean square value is\n", | |
| "MS_W = S_W / f_W\n", | |
| "print \"The 'within-group' mean square value is: MS_W = %1.1f\"% (MS_W)\n", | |
| " \n", | |
| "# The F-Ratio\n", | |
| "F = MS_B/MS_W\n", | |
| " \n", | |
| "print \"The 'F-ratio' is: F = %1.1f\"% (F)\n", | |
| " \n", | |
| "# The critical F-value\n", | |
| "alpha = 0.05\n", | |
| "pct = 1.0 - alpha\n", | |
| " \n", | |
| "# fdtr -- Integral from 0 to x of F pdf.\n", | |
| "# fdtrc -- Integral from x to infinity under F pdf.\n", | |
| "# fdtri -- Inverse of fdtrc\n", | |
| " \n", | |
| "Fcrit = special.fdtri(f_b, f_W, pct)\n", | |
| " \n", | |
| "print \"The critical F-value is: Fcrit = %1.1f\"% (Fcrit)\n", | |
| " \n", | |
| "print \"Is F>Fcrit at alpha=%1.2f? = %s\"% (alpha, F>Fcrit)\n", | |
| " \n", | |
| "# The p-value for this tes\n", | |
| "p = stats.fprob(f_b, f_W, F)\n", | |
| "print \"The p-value for this test: p= %1.3f\"% (p)\n", | |
| " \n", | |
| "# Comparison with library function\n", | |
| "F_value, p_value = stats.f_oneway(a1, a2, a3)\n", | |
| " \n", | |
| "print \"scipy.stats.f_oneway library function. F_value=%3.3f, p_value=%3.3f\"%(F_value, p_value)\n", | |
| " \n", | |
| "# Make the plot\n", | |
| "x_arr = np.linspace(0.1, 11, num=50)\n", | |
| "F_dens = []\n", | |
| "for x in x_arr:\n", | |
| " F_dens.append(1-special.fdtr(f_b, f_W, x))\n", | |
| " \n", | |
| "plt.plot(x_arr, F_dens)\n", | |
| "plt.ylabel('F density')\n", | |
| " \n", | |
| "x_point = 3.682\n", | |
| "y_point = 1-special.fdtr(f_b, f_W, x_point)\n", | |
| " \n", | |
| "plt.annotate('x=%3.3f, y=%3.3f'%(x_point, y_point), xy=(x_point, y_point), xytext=(x_point, y_point*5), arrowprops=dict(facecolor='black', shrink=0.05))\n", | |
| "plt.show()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "The mean within each group: Y1, Y2, Y3 = 5.0 9.0 10.0\n", | |
| "The overall mean: Y = 8.0\n", | |
| "The 'between-group' sum of squared differences: S_B = 84.0\n", | |
| "The 'between-group' mean square: MS_B = 42.0\n", | |
| "The 'within-group' sum of squares: S_W = 68.0\n", | |
| "The 'within-group' degrees of freedom: f_W = 15\n", | |
| "The 'within-group' mean square value is: MS_W = 4.5\n", | |
| "The 'F-ratio' is: F = 9.3\n", | |
| "The critical F-value is: Fcrit = 3.7\n", | |
| "Is F>Fcrit at alpha=0.05? = True\n", | |
| "The p-value for this test: p= 0.002\n", | |
| "scipy.stats.f_oneway library function. F_value=9.265, p_value=0.002\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nAhERAQD+H/2qsbWyIDNAAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x51a5e10>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 3 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Balanced ANOVA F-test, computed only given means and variances of samples - Include post-hoc analysis" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "For data, see Powerpoint presentation. http://www.biostat.umn.edu/~susant/Fall11ph6414/Section13_Part1.pdf\n", | |
| "\n", | |
| "Include post-hoc analysis" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "from scipy import stats\n", | |
| "from scipy import special\n", | |
| " \n", | |
| "c = np.array([35, 38, 42, 34, 28, 39])\n", | |
| "t1 = np.array([38, 43, 45, 52, 40, 46])\n", | |
| "t2 = np.array([47, 53, 42, 45, 46, 37])\n", | |
| " \n", | |
| "# The number of datapoints in each group\n", | |
| "n1 = len(c)\n", | |
| "n2 = len(t1)\n", | |
| "n3 = len(t2)\n", | |
| " \n", | |
| "# Calculate the mean within each group:\n", | |
| "X1 = np.mean(c)\n", | |
| "X2 = np.mean(t1)\n", | |
| "X3 = np.mean(t2)\n", | |
| " \n", | |
| "print \"The mean within each group: X1, X2, X3 = %1.1f %1.1f %1.1f\"% (X1, X2, X3)\n", | |
| " \n", | |
| "# Calculate the variance within each group:\n", | |
| "S1 = np.var(c, ddof=1)\n", | |
| "S2 = np.var(t1, ddof=1)\n", | |
| "S3 = np.var(t2, ddof=1)\n", | |
| " \n", | |
| "print \"The STD within each group: X1, X2, X3 = %1.2f %1.2f %1.2f\"% (np.sqrt(S1), np.sqrt(S2), np.sqrt(S3))\n", | |
| "print \"The variance within each group: X1, X2, X3 = %1.1f %1.1f %1.1f\"% (S1, S2, S3)\n", | |
| " \n", | |
| "## Calculate the grand/overall mean\n", | |
| "#X = np.mean([X1, X2, X3])\n", | |
| "weights = np.array([n1, n2, n3]) / float(np.sum([n1, n2, n3]))\n", | |
| "X = np.average([X1, X2, X3], weights=weights)\n", | |
| " \n", | |
| "print \"The overall mean: X = %1.1f\"% (X)\n", | |
| " \n", | |
| "# Calculate the \"among-group\" sum of squared differences of means:\n", | |
| "SS_A = n1*np.square(X1-X) + n2*np.square(X2-X) + n3*np.square(X3-X)\n", | |
| "print \"The 'among-group' sum of squared differences of means: SS_B = %1.1f\"% (SS_A)\n", | |
| " \n", | |
| "# The among-group degrees of freedom is one less than the number of groups\n", | |
| "dof_a = 3-1\n", | |
| " \n", | |
| "print \"The among-group degrees of freedom is: %i\"%dof_a\n", | |
| " \n", | |
| "# The among-group mean square\n", | |
| "MS_A = SS_A/dof_a\n", | |
| "print \"The 'among-group' mean square: MS_A = %1.1f\"% (MS_A)\n", | |
| " \n", | |
| "# Calculate the group sum of squared errors:\n", | |
| "SS_E = (n1-1)*S1+(n2-1)*S2+(n3-1)*S3\n", | |
| "print \"The group sum of squared errors: SS_E = %1.1f\"% (SS_E)\n", | |
| " \n", | |
| "# The within-group degrees of freedom\n", | |
| "dof_W = (n1-1)+(n2-1)+(n3-1)\n", | |
| " \n", | |
| "print \"The within-group degrees of freedom: %i\"%dof_W\n", | |
| " \n", | |
| "# The agroup mean square error\n", | |
| "MS_E = SS_E/dof_W\n", | |
| "print \"The group mean error: MS_E = %1.2f\"% (MS_E)\n", | |
| " \n", | |
| "# The F-Ratio\n", | |
| "F = MS_A/MS_E\n", | |
| " \n", | |
| "print \"The 'F-ratio' is: F = %1.2f\"% (F)\n", | |
| " \n", | |
| "# The p-value for this tes\n", | |
| "p = stats.fprob(dof_a, dof_W, F)\n", | |
| "print \"The p-value for this test: p= %1.10f\"% (p)\n", | |
| "p2 = stats.fprob(dof_a, dof_W, 5.73)\n", | |
| "print \"p (F rounded)= %1.8f\"% (p2)\n", | |
| " \n", | |
| "# The critical F-value\n", | |
| "alpha = 0.05\n", | |
| "pct = 1.0 - alpha\n", | |
| " \n", | |
| "Fcrit = special.fdtri(dof_a, dof_W, pct)\n", | |
| " \n", | |
| "print \"The critical F-value is: Fcrit = %1.2f\"% (Fcrit)\n", | |
| "print \"Is F>Fcrit at alpha=%1.2f? = %s\"% (alpha, F>Fcrit)\n", | |
| " \n", | |
| "# Post hoc\n", | |
| " \n", | |
| "# Conservative adjustment of alpha value by Bonferroni method\n", | |
| "alpha_adj = alpha / 3\n", | |
| "pct_adj = 1.0 - alpha_adj\n", | |
| " \n", | |
| "print \"Adjusted alpha values is = %1.4f\"% (alpha_adj)\n", | |
| " \n", | |
| "# Test control and t1\n", | |
| "nominator = X1 - X2\n", | |
| "denominator = np.sqrt(S1/n1 + S2/n2 )\n", | |
| "#df = np.square(S1/n1 + S2/n2) / ( np.square(S1/n1)/(n1-1) + np.square(S2/n2)/(n2-1) )\n", | |
| "df = (n1-1) + (n2-1)\n", | |
| "t_c_t1 = np.abs(nominator / denominator)\n", | |
| "print \"The test statistic is for control and Treatment 1: %1.3f\"%(t_c_t1)\n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t_c_t1), df)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| "print 'For control and Treatment 1, The two-tailed test p-value is approximately %1.4f and the one-tailed p-value is approximately %1.4f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| "# Test control and t3\n", | |
| "nominator = X1 - X3\n", | |
| "denominator = np.sqrt(S1/n1 + S3/n3 )\n", | |
| "#df = np.square(S1/n1 + S3/n3) / ( np.square(S1/n1)/(n1-1) + np.square(S3/n3)/(n3-1) )\n", | |
| "df = (n1-1) + (n3-1)\n", | |
| "t_c_t2 = np.abs(nominator / denominator)\n", | |
| "print \"The test statistic is for control and Treatment 2: %1.3f\"%(t_c_t2)\n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t_c_t2), df)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| "print 'For control and Treatment 2, the two-tailed test p-value is approximately %1.4f and the one-tailed p-value is approximately %1.4f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| "# Test t2 and t3\n", | |
| "nominator = X2 - X3\n", | |
| "denominator = np.sqrt(S2/n2 + S3/n3 )\n", | |
| "#df = np.square(S2/n2 + S3/n3) / ( np.square(S2/n2)/(n2-1) + np.square(S3/n3)/(n3-1) )\n", | |
| "df = (n2-1) + (n3-1)\n", | |
| "t_t2_t3 = np.abs(nominator / denominator)\n", | |
| "print \"The test statistic is for Treatment 1 and Treatment 2: %1.3f\"%(t_t2_t3)\n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t_t2_t3), df)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| "print 'For Treatment 1 and Treatment 2, The two-tailed test p-value is approximately %1.4f and the one-tailed p-value is approximately %1.4f'%(p_two_tailed, p_one_tailed)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "The mean within each group: X1, X2, X3 = 36.0 44.0 45.0\n", | |
| "The STD within each group: X1, X2, X3 = 4.86 4.94 5.33\n", | |
| "The variance within each group: X1, X2, X3 = 23.6 24.4 28.4\n", | |
| "The overall mean: X = 41.7\n", | |
| "The 'among-group' sum of squared differences of means: SS_B = 292.0\n", | |
| "The among-group degrees of freedom is: 2\n", | |
| "The 'among-group' mean square: MS_A = 146.0\n", | |
| "The group sum of squared errors: SS_E = 382.0\n", | |
| "The within-group degrees of freedom: 15\n", | |
| "The group mean error: MS_E = 25.47\n", | |
| "The 'F-ratio' is: F = 5.73\n", | |
| "The p-value for this test: p= 0.0141424938\n", | |
| "p (F rounded)= 0.01416644\n", | |
| "The critical F-value is: Fcrit = 3.68\n", | |
| "Is F>Fcrit at alpha=0.05? = True\n", | |
| "Adjusted alpha values is = 0.0167\n", | |
| "The test statistic is for control and Treatment 1: 2.828\n", | |
| "For control and Treatment 1, The two-tailed test p-value is approximately 0.0179 and the one-tailed p-value is approximately 0.0090\n", | |
| "The test statistic is for control and Treatment 2: 3.057\n", | |
| "For control and Treatment 2, the two-tailed test p-value is approximately 0.0121 and the one-tailed p-value is approximately 0.0061\n", | |
| "The test statistic is for Treatment 1 and Treatment 2: 0.337\n", | |
| "For Treatment 1 and Treatment 2, The two-tailed test p-value is approximately 0.7430 and the one-tailed p-value is approximately 0.3715\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 4 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Calculating a Factorial ANOVA from Means and Standard Deviations" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Source: www.psych.nyu.edu/cohen/Calc_ANOVA.pdf\n", | |
| "\n", | |
| "Barry H. Cohen, Understanding Statistics, I(3), 191-203\n", | |
| "\n", | |
| "Contains formulas for\n", | |
| "\n", | |
| "* Calculating the one-way anova from means and standard deviations\n", | |
| "* Calculating a Balanced Two-way ANOVA\n", | |
| "* Calculating an un-balanced Two-way ANOVA\n", | |
| "* Calculating a three-way ANOVA" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "from scipy import stats\n", | |
| "from scipy import special\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| "# Create data table\n", | |
| "# Low is 0, and High is 1\n", | |
| "Connectedness = [0, 0, 1, 1]\n", | |
| "Cohesion = [0, 1, 0, 1]\n", | |
| "Mean = [37.13, 39.22, 39.31, 32.71]\n", | |
| "STD = [13.82, 9.43, 9.42, 9.62]\n", | |
| "N = [9, 8, 13, 14]\n", | |
| " \n", | |
| "data = np.array([Connectedness, Cohesion, Mean, STD, N])\n", | |
| "data = np.core.records.fromarrays(data, names='Connectedness, Cohesion, Mean, STD, N', formats = 'i8, i8, f8, f8, f8')\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| " \n", | |
| "# The average \n", | |
| "r_ms_low = data_pd[data_pd[\"Connectedness\"] == 0][\"Mean\"].mean()\n", | |
| "r_ms_high = data_pd[data_pd[\"Connectedness\"] == 1][\"Mean\"].mean()\n", | |
| "c_ms_low = data_pd[data_pd[\"Cohesion\"] == 0][\"Mean\"].mean()\n", | |
| "c_ms_high = data_pd[data_pd[\"Cohesion\"] == 1][\"Mean\"].mean()\n", | |
| " \n", | |
| "r_ms = np.mean([r_ms_low, r_ms_high])\n", | |
| "c_ms = np.mean([c_ms_low, c_ms_high])\n", | |
| " \n", | |
| "test = r_ms == c_ms\n", | |
| "print(\"Is row mean of means equal column mean of means= = %s, %2.4f \"%(test, c_ms) )\n", | |
| " \n", | |
| "##### TEST - Not to be used #######\n", | |
| "# Test for an weighted average\n", | |
| "r_w_low = data_pd[data_pd[\"Connectedness\"] == 0][\"N\"].values / data_pd[data_pd[\"Connectedness\"] == 0][\"N\"].sum()\n", | |
| "r_ms_low_w = np.average(data_pd[data_pd[\"Connectedness\"] == 0][\"Mean\"], weights=r_w_low)\n", | |
| "r_w_high = data_pd[data_pd[\"Connectedness\"] == 1][\"N\"].values / data_pd[data_pd[\"Connectedness\"] == 1][\"N\"].sum()\n", | |
| "r_ms_high_w = np.average(data_pd[data_pd[\"Connectedness\"] == 1][\"Mean\"], weights=r_w_high)\n", | |
| "c_w_low = data_pd[data_pd[\"Cohesion\"] == 0][\"N\"].values / data_pd[data_pd[\"Cohesion\"] == 0][\"N\"].sum()\n", | |
| "c_ms_low_w = np.average(data_pd[data_pd[\"Cohesion\"] == 0][\"Mean\"], weights=c_w_low)\n", | |
| "c_w_high = data_pd[data_pd[\"Cohesion\"] == 1][\"N\"].values / data_pd[data_pd[\"Cohesion\"] == 1][\"N\"].sum()\n", | |
| "c_ms_high_w = np.average(data_pd[data_pd[\"Cohesion\"] == 1][\"Mean\"], weights=c_w_high)\n", | |
| " \n", | |
| "r_w = np.array([data_pd[data_pd[\"Connectedness\"] == 0][\"N\"].sum() , data_pd[data_pd[\"Connectedness\"] == 1][\"N\"].sum()]) / np.sum(data_pd[data_pd[\"Connectedness\"] == 0][\"N\"].values + data_pd[data_pd[\"Connectedness\"] == 1][\"N\"].values)\n", | |
| "r_ms_w = np.average([r_ms_low_w, r_ms_high_w], weights=r_w)\n", | |
| "c_w = np.array([data_pd[data_pd[\"Cohesion\"] == 0][\"N\"].sum() , data_pd[data_pd[\"Cohesion\"] == 1][\"N\"].sum()]) / np.sum(data_pd[data_pd[\"Cohesion\"] == 0][\"N\"].values + data_pd[data_pd[\"Cohesion\"] == 1][\"N\"].values)\n", | |
| "c_ms_w = np.average([c_ms_low_w, c_ms_high_w], weights=c_w)\n", | |
| "test2 = r_ms_w == c_ms_w\n", | |
| "print(\"Is weighted row mean of means equal weighted column mean of means= = %s, %2.4f \"%(test2, c_ms_w) )\n", | |
| "##############################\n", | |
| " \n", | |
| "# Calculate harmonic mean\n", | |
| "# c is number of cells \n", | |
| "c = 4\n", | |
| "N_h = c**2 / np.sum(1./data_pd[\"N\"].values)\n", | |
| " \n", | |
| "# Calculate the weighted average of within-group variances\n", | |
| " \n", | |
| "S_W = np.sum( (data_pd[\"N\"].values - 1)*np.square(data_pd[\"STD\"].values) )\n", | |
| "# The within-group degrees of freedom\n", | |
| "df_W = np.sum(data_pd[\"N\"].values - 1)\n", | |
| "# The within-group mean value is\n", | |
| "MS_W = np.sum(S_W) / df_W\n", | |
| " \n", | |
| "SS_between_cells = N_h*np.var(data_pd[\"Mean\"].values, ddof=0)\n", | |
| "SS_rows = N_h*np.var([r_ms_low, r_ms_high], ddof=0)\n", | |
| "SS_columns = N_h*np.var([c_ms_low, c_ms_high], ddof=0)\n", | |
| " \n", | |
| "SS_inter = SS_between_cells - SS_rows - SS_columns\n", | |
| " \n", | |
| "F_connectedness = SS_rows / MS_W\n", | |
| "F_cohesion = SS_columns / MS_W\n", | |
| "F_interaction = SS_inter / MS_W\n", | |
| " \n", | |
| "print \"F_connectedness\", F_connectedness\n", | |
| "print \"F_cohesion\", F_cohesion\n", | |
| "print \"F_interaction\", F_interaction\n", | |
| " \n", | |
| "# The critical F-value\n", | |
| "alpha = 0.05\n", | |
| "pct = 1.0 - alpha\n", | |
| " \n", | |
| "# The between-group degrees of freedom is one less than the number of groups\n", | |
| "# Is this 4-1 or 2-1 for a 2x2 system?\n", | |
| "f_b = 4-1\n", | |
| " \n", | |
| "# fdtr: Integral from 0 to x of F pdf, fdtrc: Integral from x to infinity under F pdf, fdtri: Inverse of fdtrc\n", | |
| "F_crit = special.fdtri(f_b, df_W, pct)\n", | |
| "print \"F_crit\", F_crit\n", | |
| " \n", | |
| "# The p-value for this test\n", | |
| "p_connectedness = stats.fprob(f_b, df_W, F_connectedness)\n", | |
| "p_cohesion = stats.fprob(f_b, df_W, F_cohesion)\n", | |
| "p_interaction = stats.fprob(f_b, df_W, F_interaction)\n", | |
| "p_crit = stats.fprob(f_b, df_W, F_crit)\n", | |
| " \n", | |
| "print \"p_connectedness\", p_connectedness\n", | |
| "print \"p_cohesion\", p_cohesion\n", | |
| "print \"p_interaction\", p_interaction\n", | |
| "print \"p_crit\", p_crit" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Is row mean of means equal column mean of means= = True, 37.0925 \n", | |
| "Is weighted row mean of means equal weighted column mean of means= = True, 36.7477 \n", | |
| "F_connectedness 0.441492775558\n", | |
| "F_cohesion 0.478961816646\n", | |
| "F_interaction 1.77822766073\n", | |
| "F_crit 2.83874539802\n", | |
| "p_connectedness 0.724602984875\n", | |
| "p_cohesion 0.698729820821\n", | |
| "p_interaction 0.166812623135\n", | |
| "p_crit 0.05\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 5 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 1, | |
| "metadata": {}, | |
| "source": [ | |
| "Multiple comparison of means and variances" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "See\n", | |
| "\n", | |
| "* http://en.wikipedia.org/wiki/Multiple_comparisons_problem\n", | |
| "* https://en.wikipedia.org/wiki/Familywise_error_rate#Controlling_procedures\n", | |
| "* http://www.graphpad.com/guides/prism/6/statistics/index.htm?stat_how_to_multiple_t_tests.htm\n", | |
| "* http://www.graphpad.com/guides/prism/6/statistics/index.htm?stat_approach_3_false_discovery_rat.htm\n", | |
| "* http://www.graphpad.com/guides/prism/6/statistics/index.htm?stat_holms_multiple_comparison_test.htm\n", | |
| "* http://www.jstor.org/stable/2346101\n", | |
| "* http://www.jstor.org/stable/3587136\n", | |
| "* http://math.unm.edu/~schrader/biostat/bio2/Spr06/lec5.pdf\n", | |
| "\n", | |
| "We need to control the familywise error rate (FWER). To control the expected proportion of falsely rejected hypotheses - the false discovery rate." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Data for: Multiple t Tests: Some Practical Considerations" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Ref: http://www.jstor.org/stable/3587136\n", | |
| "\n", | |
| "Table 1." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions\n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| "c_m = 69.9\n", | |
| "c_sd = 3.56\n", | |
| "c_n = 15\n", | |
| " \n", | |
| "groups = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']\n", | |
| "means = [81.2, 82.3, 70.6, 83.9, 71.2, 80.9, 80.7, 82.3, 83.2, 82.1, 80.7]\n", | |
| "SDs = [2.60, 3.35, 3.70, 3.86, 3.14, 2.05, 2.87, 4.03, 3.47, 2.31, 2.99]\n", | |
| "ns = len(groups)*[15]\n", | |
| " \n", | |
| "data = np.array([groups, means, SDs, ns])\n", | |
| "data = np.core.records.fromarrays(data, names='group, mean, SD, n', formats = 'S1, f8, f8, i8')\n", | |
| " \n", | |
| "# Try a t calculation with Student's t-test, Equal sample sizes, equal variance\n", | |
| "# https://en.wikipedia.org/wiki/Student%27s_t-test#Equal_sample_sizes.2C_equal_variance\n", | |
| "t_es_ev = np.abs( (c_m - data['mean'])/( np.sqrt( (c_sd**2+data['SD']**2) )*np.sqrt(1./c_n) ) )\n", | |
| "data = np.lib.recfunctions.append_fields(data, 't_es_ev', t_es_ev, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Try a t calculation with Student's t-test, Equal or unequal sample sizes, equal variance\n", | |
| "# https://en.wikipedia.org/wiki/Student%27s_t-test#Equal_or_unequal_sample_sizes.2C_equal_variance\n", | |
| "t_us_ev = np.abs( (c_m - data['mean'])/( np.sqrt( ((c_n-1)*c_sd**2+(data['n']-1)*data['SD']**2)/(c_n+data['n']-2) )*np.sqrt(1./c_n + 1./data['n']) ) )\n", | |
| "data = np.lib.recfunctions.append_fields(data, 't_us_ev', t_us_ev, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Try a t calculation with Welch's t test, Equal or unequal sample sizes, unequal variances\n", | |
| "# https://en.wikipedia.org/wiki/Welch%27s_t_test#Calculations\n", | |
| "t_w = np.abs( (c_m - data['mean'])/np.sqrt(c_sd**2/c_n + data['SD']**2/data['n']) )\n", | |
| "data = np.lib.recfunctions.append_fields(data, 't_w', t_w, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# The within-group degrees of freedom with students t-test\n", | |
| "df_st = (c_n - 1) + (data['n'] - 1)\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'df_st', df_st, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# The p-value for this students t-test.\n", | |
| "# The multiplication by 2, is the meaning of a two-tailed test\n", | |
| "p_st = stats.distributions.t.sf(np.abs(data['t_es_ev']), df_st )*2\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'p_st', p_st, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Test if above 0.05\n", | |
| "ab_5p_st = p_st > 0.05\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'ab_5p_st', ab_5p_st, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Try using the library function for probablity using F distribution\n", | |
| "# The between-group degrees of freedom is one less than the number of groups\n", | |
| "df_b = 2-1\n", | |
| " \n", | |
| "# For one variable case: t^2 = F\n", | |
| "F = data['t_es_ev']**2\n", | |
| "p_sf = stats.fprob(df_b, df_st, F)\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'p_sf', p_sf, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# The within-group degrees of freedom with Welch t-test\n", | |
| "df_wt = np.square(c_sd**2/c_n + data['SD']**2/data['n']) / ( np.square(c_sd**2)/(np.square(c_n)*(c_n-1)) + np.square(data['SD']**2)/(np.square(data['n'])*(data['n']-1)) )\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'df_wt', df_wt, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# The p-value for this Welch t-test\n", | |
| "# The multiplication by 2, is the meaning of a two-tailed test\n", | |
| "p_wt = stats.distributions.t.sf(np.abs(data['t_w']), df_wt )*2\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'p_wt', p_wt, dtypes=data['mean'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "## Use pandas to print pretty\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| " \n", | |
| "pd.options.display.float_format = '{:5,.3f}'.format\n", | |
| "print data_pd\n", | |
| " \n", | |
| "# Now sort the data according to the p-values\n", | |
| "data_pd_s = data_pd.sort(['p_st'])\n", | |
| " \n", | |
| "print \"\\nSorting according to Student tests p-value column.\"\n", | |
| "print data_pd_s" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| " group mean SD n t_es_ev t_us_ev t_w df_st p_st ab_5p_st \\\n", | |
| "0 A 81.200 2.600 15 9.928 9.928 9.928 28.000 0.000 0.000 \n", | |
| "1 B 82.300 3.350 15 9.824 9.824 9.824 28.000 0.000 0.000 \n", | |
| "2 C 70.600 3.700 15 0.528 0.528 0.528 28.000 0.602 1.000 \n", | |
| "3 D 83.900 3.860 15 10.326 10.326 10.326 28.000 0.000 0.000 \n", | |
| "4 E 71.200 3.140 15 1.061 1.061 1.061 28.000 0.298 1.000 \n", | |
| "5 F 80.900 2.050 15 10.371 10.371 10.371 28.000 0.000 0.000 \n", | |
| "6 G 80.700 2.870 15 9.147 9.147 9.147 28.000 0.000 0.000 \n", | |
| "7 H 82.300 4.030 15 8.931 8.931 8.931 28.000 0.000 0.000 \n", | |
| "8 I 83.200 3.470 15 10.361 10.361 10.361 28.000 0.000 0.000 \n", | |
| "9 J 82.100 2.310 15 11.134 11.134 11.134 28.000 0.000 0.000 \n", | |
| "10 K 80.700 2.990 15 8.997 8.997 8.997 28.000 0.000 0.000 \n", | |
| "\n", | |
| " p_sf df_wt p_wt \n", | |
| "0 0.000 25.627 0.000 \n", | |
| "1 0.000 27.897 0.000 \n", | |
| "2 0.602 27.958 0.602 \n", | |
| "3 0.000 27.819 0.000 \n", | |
| "4 0.298 27.570 0.298 \n", | |
| "5 0.000 22.365 0.000 \n", | |
| "6 0.000 26.794 0.000 \n", | |
| "7 0.000 27.580 0.000 \n", | |
| "8 0.000 27.982 0.000 \n", | |
| "9 0.000 24.014 0.000 \n", | |
| "10 0.000 27.189 0.000 \n", | |
| "\n", | |
| "[11 rows x 13 columns]\n", | |
| "\n", | |
| "Sorting according to Student tests p-value column.\n", | |
| " group mean SD n t_es_ev t_us_ev t_w df_st p_st ab_5p_st \\\n", | |
| "9 J 82.100 2.310 15 11.134 11.134 11.134 28.000 0.000 0.000 \n", | |
| "5 F 80.900 2.050 15 10.371 10.371 10.371 28.000 0.000 0.000 \n", | |
| "8 I 83.200 3.470 15 10.361 10.361 10.361 28.000 0.000 0.000 \n", | |
| "3 D 83.900 3.860 15 10.326 10.326 10.326 28.000 0.000 0.000 \n", | |
| "0 A 81.200 2.600 15 9.928 9.928 9.928 28.000 0.000 0.000 \n", | |
| "1 B 82.300 3.350 15 9.824 9.824 9.824 28.000 0.000 0.000 \n", | |
| "6 G 80.700 2.870 15 9.147 9.147 9.147 28.000 0.000 0.000 \n", | |
| "10 K 80.700 2.990 15 8.997 8.997 8.997 28.000 0.000 0.000 \n", | |
| "7 H 82.300 4.030 15 8.931 8.931 8.931 28.000 0.000 0.000 \n", | |
| "4 E 71.200 3.140 15 1.061 1.061 1.061 28.000 0.298 1.000 \n", | |
| "2 C 70.600 3.700 15 0.528 0.528 0.528 28.000 0.602 1.000 \n", | |
| "\n", | |
| " p_sf df_wt p_wt \n", | |
| "9 0.000 24.014 0.000 \n", | |
| "5 0.000 22.365 0.000 \n", | |
| "8 0.000 27.982 0.000 \n", | |
| "3 0.000 27.819 0.000 \n", | |
| "0 0.000 25.627 0.000 \n", | |
| "1 0.000 27.897 0.000 \n", | |
| "6 0.000 26.794 0.000 \n", | |
| "10 0.000 27.189 0.000 \n", | |
| "7 0.000 27.580 0.000 \n", | |
| "4 0.298 27.570 0.298 \n", | |
| "2 0.602 27.958 0.602 \n", | |
| "\n", | |
| "[11 rows x 13 columns]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 6 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Difference Between Paired Means" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "This is taken from: http://stattrek.com/hypothesis-test/paired-means.aspx?Tutorial=AP\n", | |
| "\n", | |
| "This is the situation, where you measure the same sample before and after treatment. \n", | |
| "Note, you do use the variance/uncertainty in this analysis.\n", | |
| "\n", | |
| "Note:\n", | |
| "\n", | |
| "The sampling distribution of the mean difference between data pairs (d) is approximately normally distributed.\n", | |
| "Here's a simple rule to determine if the paired t must not be used - if a given data point in group one could be paired with any data point in group two, you cannot use a paired t test\n", | |
| "See also:\n", | |
| "\n", | |
| "* http://stattrek.com/estimation/mean-difference-pairs.aspx\n", | |
| "* http://www.ruf.rice.edu/~bioslabs/tools/stats/ttest.html\n", | |
| "* http://www.tufts.edu/~gdallal/paired.htm" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "# Python imports\n", | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions\n", | |
| "import pandas as pd\n", | |
| "from scipy import stats\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import matplotlib.mlab as mlab\n", | |
| "#from matplotlib import style\n", | |
| "#style.use('ggplot')\n", | |
| " \n", | |
| "before = [95, 89, 76, 92, 91, 53, 67, 88, 75, 85, 90, 85, 87, 85, 85, 68, 81, 84, 71, 46, 75, 80]\n", | |
| "after = [90, 85, 73, 90, 90, 53, 68, 90, 78, 89, 95, 83, 83, 83, 82, 65, 79, 83, 60, 47, 77, 83]\n", | |
| " \n", | |
| "# Create data array\n", | |
| "data = np.array([before, after])\n", | |
| "data = np.core.records.fromarrays(data, names='Training\t, No_Training', formats = 'f8, f8')\n", | |
| " \n", | |
| "# Calculate difference\n", | |
| "d = data['Training'] - data['No_Training']\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'd', d, dtypes=data['Training'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Calculate the average of the differences\n", | |
| "d_avg = np.average(data['d'])\n", | |
| "# This is equal the difference between the mean of each group\n", | |
| "X1_minus_X2 = np.average(data['Training']) - np.average(data['No_Training'])\n", | |
| " \n", | |
| "print \"Is the mean of differences equal ?\", d_avg == X1_minus_X2, d_avg\n", | |
| " \n", | |
| "# Calculate the standard deviation of the differences\n", | |
| "SD_d = np.std(data['d'], ddof=1)\n", | |
| "n = len(d)\n", | |
| "print \"The summed variance of differences are\", SD_d**2*(n-1)\n", | |
| "print \"The standard deviation of the differences are\", SD_d\n", | |
| " \n", | |
| "# Test that: The population distribution of paired differences (i.e., the variable d) is normal.\n", | |
| "nbins, bins, patches = plt.hist(data['d'], normed=True, histtype='stepfilled')\n", | |
| "plt.setp(patches, 'facecolor', 'g', 'alpha', 0.75)\n", | |
| "# add a line showing the expected distribution\n", | |
| "y = mlab.normpdf( bins, d_avg, SD_d)\n", | |
| "plt.plot(bins, y, 'k--', linewidth=1.5)\n", | |
| " \n", | |
| "# Compute the standard error (SE) of the sampling distribution of d.\n", | |
| "SE = SD_d / np.sqrt(n)\n", | |
| "print \"The standard error (SE) of the sampling distribution of d.\", SE \n", | |
| " \n", | |
| "# Degrees of freedom. The degrees of freedom (DF) is: DF = n - 1 .\n", | |
| "dof = n - 1\n", | |
| "print \"The degree of fredom is:\", dof \n", | |
| " \n", | |
| "# Test statistic. The test statistic is a t-score (t) defined by the following equation.\n", | |
| "# D is the hypothesized difference between population means, and SE is the standard error.\n", | |
| "D = 0\n", | |
| "t = (d_avg - D) / SE\n", | |
| "print \"The tests statistics are t=\", t \n", | |
| " \n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t), dof)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| " \n", | |
| "print 'The two-tailed test p-value is approximately %1.3f and the one-tailed p-value is approximately %1.3f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| "alpha = 0.05\n", | |
| "test = p_two_tailed > alpha\n", | |
| "if test:\n", | |
| " print \"Since the P-value (%1.3f) is greater than the significance level (%1.3f), we cannot reject the null hypothesis.\"%(p_two_tailed, alpha)\n", | |
| " \n", | |
| "# Print by pandas\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "#pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print data_pd\n", | |
| " \n", | |
| "# Make a correlation plot\n", | |
| "plt.figure()\n", | |
| "plt.plot(data['Training'], data['No_Training'], linestyle='', marker='o', fillstyle='full')\n", | |
| "# Ref line\n", | |
| "x = np.linspace(data['Training'].min(), data['Training'].max(), num=50)\n", | |
| "plt.plot(x, x, linestyle='-', marker='')\n", | |
| " \n", | |
| "# Make confidence interval\n", | |
| "confidence = 0.90\n", | |
| "two_tailed_alpha = 1.00 - confidence\n", | |
| "one_tailed_alpha = two_tailed_alpha/2\n", | |
| "t_crit = stats.distributions.t.isf(one_tailed_alpha, dof)\n", | |
| "print 'The critical t value for confidence=%1.2f is equal:%1.3f'%(confidence, t_crit)\n", | |
| "d_avg_min = d_avg + t_crit * SE\n", | |
| "d_avg_max = d_avg - t_crit * SE\n", | |
| "print \"The %1.2f confidence interval of the average deviation %3.2f to %3.2f\" %(confidence, d_avg_min, d_avg_max) \n", | |
| " \n", | |
| "# Make a deviation plot\n", | |
| "plt.figure()\n", | |
| "plt.plot(range(n), data['d'], linestyle='', marker='o', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg, linestyle='-', marker='', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg_min, linestyle='--', marker='', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg_max, linestyle='--', marker='', fillstyle='full')\n", | |
| "plt.title(\"Sample index of differences\")" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Is the mean of differences equal ? True 1.0\n", | |
| "The summed variance of differences are 270.0\n", | |
| "The standard deviation of the differences are 3.585685828\n", | |
| "The standard error (SE) of the sampling distribution of d. 0.764470787156\n", | |
| "The degree of fredom is: 21\n", | |
| "The tests statistics are t= 1.30809445802\n", | |
| "The two-tailed test p-value is approximately 0.205 and the one-tailed p-value is approximately 0.102\n", | |
| "Since the P-value (0.205) is greater than the significance level (0.050), we cannot reject the null hypothesis.\n", | |
| " Training No_Training d\n", | |
| "0 95.000 90.000 5.000\n", | |
| "1 89.000 85.000 4.000\n", | |
| "2 76.000 73.000 3.000\n", | |
| "3 92.000 90.000 2.000\n", | |
| "4 91.000 90.000 1.000\n", | |
| "5 53.000 53.000 0.000\n", | |
| "6 67.000 68.000 -1.000\n", | |
| "7 88.000 90.000 -2.000\n", | |
| "8 75.000 78.000 -3.000\n", | |
| "9 85.000 89.000 -4.000\n", | |
| "10 90.000 95.000 -5.000\n", | |
| "11 85.000 83.000 2.000\n", | |
| "12 87.000 83.000 4.000\n", | |
| "13 85.000 83.000 2.000\n", | |
| "14 85.000 82.000 3.000\n", | |
| "15 68.000 65.000 3.000\n", | |
| "16 81.000 79.000 2.000\n", | |
| "17 84.000 83.000 1.000\n", | |
| "18 71.000 60.000 11.000\n", | |
| "19 46.000 47.000 -1.000\n", | |
| "20 75.000 77.000 -2.000\n", | |
| "21 80.000 83.000 -3.000\n", | |
| "\n", | |
| "[22 rows x 3 columns]\n", | |
| "The critical t value for confidence=0.90 is equal:1.721" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "The 0.90 confidence interval of the average deviation 2.32 to -0.32\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 8, | |
| "text": [ | |
| "<matplotlib.text.Text at 0x5cc9d10>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5d847d0>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nrkJggg==\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5e008d0>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nAABJRU5ErkJggg==\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5e0e210>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 8 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Difference between means of paired samples (paired t test)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Taken from: http://www.bmj.com/about-bmj/resources-readers/publications/statistics-square-one/7-t-tests" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "# Python imports\n", | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions\n", | |
| "import pandas as pd\n", | |
| "from scipy import stats\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import matplotlib.mlab as mlab\n", | |
| "#from matplotlib import style\n", | |
| "#style.use('ggplot')\n", | |
| " \n", | |
| "before = [63, 54, 79, 68, 87, 84, 92, 57, 66, 53, 76, 63]\n", | |
| "after = [55, 62, 108, 77, 83, 78, 79, 94, 69, 66, 72, 77]\n", | |
| " \n", | |
| "# Create data array\n", | |
| "data = np.array([before, after])\n", | |
| "data = np.core.records.fromarrays(data, names='Treat_A\t, Treat_B', formats = 'f8, f8')\n", | |
| " \n", | |
| "# Calculate difference\n", | |
| "d = data['Treat_A'] - data['Treat_B']\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'd', d, dtypes=data['Treat_A'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Calculate the average of the differences\n", | |
| "d_avg = np.average(data['d'])\n", | |
| "# This is equal the difference between the mean of each group\n", | |
| "X1_minus_X2 = np.average(data['Treat_A']) - np.average(data['Treat_B'])\n", | |
| " \n", | |
| "print \"Is the mean of differences equal ?\", d_avg == X1_minus_X2, d_avg\n", | |
| " \n", | |
| "# Calculate the standard deviation of the differences\n", | |
| "SD_d = np.std(data['d'], ddof=1)\n", | |
| "n = len(d)\n", | |
| "print \"The summed variance of differences are\", SD_d**2*(n-1)\n", | |
| "print \"The standard deviation of the differences are\", SD_d\n", | |
| " \n", | |
| "# Test that: The population distribution of paired differences (i.e., the variable d) is normal.\n", | |
| "nbins, bins, patches = plt.hist(data['d'], normed=True, histtype='stepfilled')\n", | |
| "plt.setp(patches, 'facecolor', 'g', 'alpha', 0.75)\n", | |
| "# add a line showing the expected distribution\n", | |
| "y = mlab.normpdf( bins, d_avg, SD_d)\n", | |
| "plt.plot(bins, y, 'k--', linewidth=1.5)\n", | |
| "plt.title(\"Histogram of differences\")\n", | |
| " \n", | |
| "# Compute the standard error (SE) of the sampling distribution of d.\n", | |
| "SE = SD_d / np.sqrt(n)\n", | |
| "print \"The standard error (SE) of the sampling distribution of d.\", SE \n", | |
| " \n", | |
| "# Degrees of freedom. The degrees of freedom (DF) is: DF = n - 1 .\n", | |
| "dof = n - 1\n", | |
| "print \"The degree of fredom is:\", dof \n", | |
| " \n", | |
| "# Test statistic. The test statistic is a t-score (t) defined by the following equation.\n", | |
| "# D is the hypothesized difference between population means, and SE is the standard error.\n", | |
| "D = 0\n", | |
| "t = (d_avg - D) / SE\n", | |
| "print \"The tests statistics are t=\", t \n", | |
| " \n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t), dof)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| " \n", | |
| "print 'The two-tailed test p-value is approximately %1.3f and the one-tailed p-value is approximately %1.3f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| "alpha = 0.05\n", | |
| "test = p_two_tailed > alpha\n", | |
| "if test:\n", | |
| " print \"Since the P-value (%1.3f) is greater than the significance level (%1.3f), we cannot reject the null hypothesis.\"%(p_two_tailed, alpha)\n", | |
| " \n", | |
| "# Print by pandas\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "#pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print data_pd\n", | |
| " \n", | |
| "# Make a correlation plot\n", | |
| "plt.figure()\n", | |
| "plt.plot(data['Treat_A'], data['Treat_B'], linestyle='', marker='o', fillstyle='full')\n", | |
| "# Ref line\n", | |
| "x = np.linspace(data['Treat_A'].min(), data['Treat_A'].max(), num=50)\n", | |
| "plt.plot(x, x, linestyle='-', marker='')\n", | |
| "plt.title(\"Correlation plot\")\n", | |
| " \n", | |
| "# Make confidence interval\n", | |
| "confidence = 0.95\n", | |
| "two_tailed_aplha = 1.00 - confidence\n", | |
| "one_tailed_aplha = two_tailed_aplha/2\n", | |
| "t_crit = stats.distributions.t.isf(one_tailed_aplha, dof)\n", | |
| "print 'The critical t value for confidence=%1.2f is equal:%1.3f'%(confidence, t_crit)\n", | |
| "d_avg_min = d_avg + t_crit * SE\n", | |
| "d_avg_max = d_avg - t_crit * SE\n", | |
| "print \"The %1.2f confidence interval of the average deviation %3.2f to %3.2f\" %(confidence, d_avg_min, d_avg_max) \n", | |
| " \n", | |
| "# Make a deviation plot\n", | |
| "plt.figure()\n", | |
| "plt.plot(range(n), data['d'], linestyle='', marker='o', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg, linestyle='-', marker='', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg_min, linestyle='--', marker='', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg_max, linestyle='--', marker='', fillstyle='full')\n", | |
| "plt.title(\"Sample index of differences\")\n", | |
| " \n", | |
| "#plt.show()\n", | |
| "for i in plt.get_fignums():\n", | |
| " plt.figure(i)\n", | |
| " plt.savefig('figure%d.png' % i)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Is the mean of differences equal ? True -6.5\n", | |
| "The summed variance of differences are 2523.0\n", | |
| "The standard deviation of the differences are 15.1447560681\n", | |
| "The standard error (SE) of the sampling distribution of d. 4.37191449638\n", | |
| "The degree of fredom is: 11\n", | |
| "The tests statistics are t= -1.48676283706\n", | |
| "The two-tailed test p-value is approximately 0.165 and the one-tailed p-value is approximately 0.083\n", | |
| "Since the P-value (0.165) is greater than the significance level (0.050), we cannot reject the null hypothesis.\n", | |
| " Treat_A Treat_B d\n", | |
| "0 63.000 55.000 8.000\n", | |
| "1 54.000 62.000 -8.000\n", | |
| "2 79.000 108.000 -29.000\n", | |
| "3 68.000 77.000 -9.000\n", | |
| "4 87.000 83.000 4.000\n", | |
| "5 84.000 78.000 6.000\n", | |
| "6 92.000 79.000 13.000\n", | |
| "7 57.000 94.000 -37.000\n", | |
| "8 66.000 69.000 -3.000\n", | |
| "9 53.000 66.000 -13.000\n", | |
| "10 76.000 72.000 4.000\n", | |
| "11 63.000 77.000 -14.000\n", | |
| "\n", | |
| "[12 rows x 3 columns]\n", | |
| "The critical t value for confidence=0.95 is equal:2.201" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "The 0.95 confidence interval of the average deviation 3.12 to -16.12\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEKCAYAAADzQPVvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVOW+P/DPDAqIIjBy07gJEhcRUW5aqOjeiu1zvGR0\nobaWWlEnwzJs/7xtwJOXtBOm2Y4sK0Ntd/F3dPsrETJEbTvDLd0iSiCINwoUAeXOPL8/Os5xBLko\nsJhZn/frNa8Xa61nzfo+DHxYPPOsNQohhAARERk1pdQFEBFRz2PYExHJAMOeiEgGGPZERDLAsCci\nkgGGPRGRDDDsqV1+fn7IyMiQugxJHTp0CBMnToSlpSVOnDjRYfvw8HB88sknAICdO3ciIiJCty03\nNxePPPIIrKyssG/fPly/fh3PPfcc7OzssHTp0h7rAxHDXsbc3Nzwww8/6K377LPPMGHCBN3yqVOn\nMHHixHafp6SkBEqlElqttkfqlNratWuxYMEC1NTUYPTo0R22VygUUCgUAIBnnnkGKSkpum1bt27F\nuHHjUFVVhZkzZ2L//v24cuUKLl26hI0bN/ZYH4gY9jJ2eyh1h566Pq+lpaVHnrczhBA4duwYHn74\n4W55vmPHjuGhhx7SLR89ehRBQUEwNTXt8nM1Nzd3S00kDwx70nNn+Lu5ueHQoUMAgNOnT2POnDmw\nt7eHo6MjYmNjAUB35m9tbQ1LS0uo1WoAwL59+zB16lSMGjUKH374IWpra3XP+89//hPTpk2Dq6sr\nNm/erHec+Ph4REVF4eWXX8bQoUPx+eefIzMzE+PHj4eNjQ3Gjx+P999/Xy/slEolvvjiCwQEBOCB\nBx5AYmIiysrKEBERAScnJ8TFxbUbjm3V2tDQAEtLSzQ0NGDMmDHw9PRsc9+8vDw88cQTGDZsGFas\nWKG37fb/lDw8PFBQUIBZs2bB0tISTz/9NLZv34533nkHlpaWuv5///33mDlzJry8vJCYmIgbN24A\n+N//oL7++mv4+flh6tSpAH7/g/HMM89g+PDhSEhIQEVFhd73ZefOnQgICMCIESOQmJioV9+PP/6I\nP//5z1CpVBg5ciRyc3MBAJWVldi0aRNGjhyJRx55BAcPHtTtc+fPwRtvvHHX7yv1IYJky83NTaSl\npemt+/TTT0VYWJhemx9++EEIIURkZKTYvHmzaGxsFDdv3hTHjx8XQghRUlIiFAqFaGlp0e136NAh\n4eLiIlJTU0VBQYH4wx/+IOLi4oQQQlRWVgoLCwuRnJwsLl++LObNmyf69++vO05cXJzo37+/2Lx5\ns6irqxN1dXUiOztbqNVq0dzcLI4dOyZcXV1Famqq7ngKhUJMnTpV/PLLL+LQoUPCxMRETJkyRRw+\nfFgUFRWJ4cOHi4yMjDa/D+3Veuu5i4qK2txXq9UKe3t78c4774jy8nKxZMkSYWpqKj755JMOv59C\nCPHcc8+JVatW6Zb37t0r/P39xT//+U9x+fJl8cQTT4jly5cLIYQoLi4WCoVCzJ49WxQVFYn6+npx\n4sQJ4eTkJFJTU8W1a9fEq6++Kp5++mm92qdMmSLy8/NFdna2sLS0FIWFhUIIIXJycoS9vb3YtWuX\naGxsFIWFheL8+fNCCCEeffRRERMTI8rKykRGRoYYNmyYbr+7/RxQ38awlzFXV1cxaNAgYW1trXtY\nWFiICRMm6NrcHk5z5swRsbGxoqysTO95boXQ7WEfExMjli1bpltOTU0V/v7+Qggh/v73v+sdo6io\nSCgUCr2wd3d3b7f2FStWiEWLFumWFQqF2LNnj27Z09NTLFmyRLf8wgsv6AX47dqr9dZz3y3s1Wq1\ncHZ21i3X1tYKMzOzLoX9ypUrdctPP/202Llzp245NzdX+Pr6CiH+9/t8+x+t5cuXizVr1uiWKyoq\nhK2trWhubtbV/u233+q2R0REiL/97W9CCCHefPNNsXjx4lZ9qq6uFkOHDhW1tbW6dYsXLxYbNmwQ\nQtz954D6Ng7jyJhCocDevXtRWVmpe3zwwQd3HXtPTExEbW0t/Pz8MH36dBw+fPiuz/3TTz8hMDBQ\ntxwYGIh//etfqK6uhlqtRkBAgG6bu7s7rKys9PYPDQ3VW7506RJeeukl+Pv7Y/DgwUhMTMTJkyf1\n2tz+5qmDg0Or5UuXLnWp1pqamrv27xa1Wq13nAEDBsDb27vD/e4mLS0NL7/8MmxsbGBjY4PJkyej\npKQEv/32m67N7d+btLQ0rFu3Ttd+xIgRqK2tRU5Ojq7N7d/roUOH4vLlywCA9PT0Nt+LOHr0KMrL\nyzFs2DDd827fvh1Hjx4F0LWfA+o7GPak525BDwAuLi7YunUrysrK8MQTTyAqKgparRYmJiat9n34\n4YeRlZWlW87KytIFdWhoKH7++WfdtnPnzqGqqkrvWLee85a33noLTU1N+O6771BVVYXXX3+922b/\ntFXrqFGjYGlp2eG+oaGhetMx6+rqcObMmXuuZcqUKdi2bZveH+CbN2/C3t5e16Zfv3567VeuXNmq\nfXBwcIfHmjx5si7Abzd+/HjY2dnh119/1T1ndXU19u7dC+DuPwfUtzHsqdOSk5NRXl4OIQQGDhyI\nQYMGAQCcnJxgb2+vF5izZs3C7t27cejQIRQWFmLjxo2YPXs2AGDatGnIycnB7t27ceXKFaxevVov\nwNpy+fJlqFQqDBkyBOnp6dixY0eH9d7+x6e9P2Jt1froo492+PwAEBQUhIaGBiQmJqK8vByrVq3q\n0qykO9vOnTsXGzZswNGjR9HS0oLy8nLs27fvrvvPnTsXSUlJOHjwIBobG1FVVYWvv/663ePdOuZT\nTz2Fr776Cl999RUaGxtRWFiI0tJSWFtbIywsDMuXL8f58+fR0tKCU6dO6V7fu/0cUN/GsCc97U3H\nTElJgZ+fHxwcHJCcnIyPPvoISqUSCoUCq1atwsKFC2FjYwONRoPw8HAkJiZi7dq1mD17NmbNmqW7\naMja2hoHDhzAJ598gnHjxmHs2LGwtrbWDeW0VUN8fDx+/vlnODk5YePGjVi0aJFem7ZqvnP73frV\nXq13e+5blEol0tLScOzYMYwePRpmZmZ6QyMdTW+9c/sjjzyC1atX4/3334ednR3Gjx8PjUZz11p8\nfX3x+eef46uvvoKTkxNGjRqlN6//zva3Hy8gIAA7d+7Enj17YG9vjzlz5qCyshIA8OGHH8LV1RWR\nkZGws7PDiy++iOrqagB3/zmgvk0hOjgNycjIQHR0NJqbmxETE4NXX321VZtly5bh73//O2xsbLBz\n507dmKWbmxsGDx4MExMT9O/fX++HluiWvLw8hIWF4dq1a90675+I/leHf44XL16MpKQkpKWlYevW\nrXpzeAFAo9HgyJEjyMrKQmxsrG7uNfD7WUR6ejpyc3MZ9KTnH//4B2pra1FQUIC4uDj84Q9/YNAT\n9aB2w/7Wm2YTJ06Eq6srpk2bprtg5ha1Wo3IyEioVCpERUUhPz9fb3tXxi9JPvbt24cHHngA06ZN\ng5+fHzZv3ix1SURGrd2wz8zM1JtG5uvri+PHj+u10Wg08PX11S3b2dnh3LlzAH4/s58yZQpmz57d\n7ptMJD+3ZpyUlJQgPj4ew4YNk7okIqPW/hSITrj93f07HTt2DEOHDkV+fj5mzJiBkJAQODo63u8h\niYioq9q74ur69esiICBAt7xo0SKxf/9+vTabN28W7777rm75blc+vv766+Kjjz5qtd7Dw0MA4IMP\nPvjgowsPDw+Pdq+YvVO7Z/a3psJlZGTAxcUFqampiIuL02sTGhqKJUuWYN68eUhJSYGPjw8AoLa2\nFi0tLbC0tER5eTlSUlLw+uuvtzpGUVGRUY/rx8fHIz4+Xuoyegz7Z9jup38///wzFiQsgNVsq44b\nd4PK05WY2n8qNr7VuVtBG/tr19UJDR0O42zatAnR0dFoampCTEwMbG1tkZSUBACIjo5GSEgIwsLC\nEBQUBJVKheTkZABAWVkZ5syZAwAYMmQI3njjDTg7O3e1P0RE1A06DPtJkya1mmETHR2tt7x+/Xqs\nX79eb527u7veJfFERCQdXvbWw8LDw6UuoUexf4bNmPtnzH27Fwz7HmbsP3Dsn2Ez5v4Zc9/uBcOe\niEgGGPZERDLAsCcikgGGPRGRDDDsiYhkgGFPRCQDDHsiIhlg2BMRyQDDnohIBhj2REQywLAnIpIB\nhj0RkQww7ImIZIBhT0QkAwx7IiIZYNgTEckAw56ISAYY9kREMsCwJyKSAYY9EZEMMOyJiGSAYU9E\nJAMMeyIiGWDYExHJAMOeiEgGGPZERDLAsCcikgGGPRGRDDDsiYhkgGFPRCQDDHsiIhlg2BMRyQDD\nnohIBhj2REQy0GHYZ2RkwMfHB56entiyZUubbZYtWwZ3d3cEBgbizJkzettaWlowZswYzJgxo3sq\nJiKiLusw7BcvXoykpCSkpaVh69atqKio0Nuu0Whw5MgRZGVlITY2FrGxsXrb33vvPfj6+kKhUHRv\n5URE1Gnthn1VVRUAYOLEiXB1dcW0adOgVqv12qjVakRGRkKlUiEqKgr5+fm6bRcvXsR3332H559/\nHkKIHiifiIg6o92wz8zMhLe3t27Z19cXx48f12uj0Wjg6+urW7azs8O5c+cAAK+//jo2btwIpZJv\nDRARSanf/T6BEKLNs/b9+/fD3t4eY8aMQXp6ervPER8fr/s6PDwc4eHh91sWEZFRSU9P7zBL29Nu\n2AcHB2Pp0qW65by8PEyfPl2vTWhoKE6fPo2IiAgAQHl5Odzd3fHxxx9j3759+O6771BfX4/q6mrM\nmzcPO3bsaHWc28OeiIhau/NEOCEhoUv7tzu+YmVlBeD3GTklJSVITU1FaGioXpvQ0FB8++23uHr1\nKnbt2gUfHx8AwNq1a3HhwgUUFxfjyy+/xJQpU9oMeiIi6nkdDuNs2rQJ0dHRaGpqQkxMDGxtbZGU\nlAQAiI6ORkhICMLCwhAUFASVSoXk5OQ2n4ezcYiIpKMQEk+TUSgUnKlDZIB+/vlnLEhYAKvZVr1y\nvMrTlZjafyo2vrWxV47X13U1OzlNhohIBhj2REQywLAnIpIBhj0RkQww7ImIZIBhT0QkAwx7IiIZ\nYNgTEckAw56ISAYY9kREMsCwJyKSAYY9EZEMMOyJiGSAYU9EJAMMeyIiGWDYExHJAMOeiEgGGPZE\nRDLAsCcikgGGPRGRDDDsiYhkgGFPRCQDDHsiIhlg2BMRyUA/qQsgeUtLS8PFixelLqPHDBkyBDNm\nzJC6DKNRWlKKzz77rNeON378eHh5efXa8XoSw54k9fbWt1EysAQm5iZSl9LtRIuARZEFw76bDHQa\niJPXTuLE0RO9crzaS7V448YbDHui7mI71hbmQ8ylLqPbtTS0oKaoRuoyjIbpYFM4hjn22vF+0/zW\na8fqDRyzJyKSAYY9EZEMMOyJiGSAYU9EJAMMeyIiGWDYExHJAMOeiEgGGPZERDLQYdhnZGTAx8cH\nnp6e2LJlS5ttli1bBnd3dwQGBuLMmTMAgPr6eoSGhiIgIADjxo1DYmJi91ZORESd1uEVtIsXL0ZS\nUhJcXV0RERGBqKgo2Nra6rZrNBocOXIEWVlZSElJQWxsLPbv3w9zc3P8+OOPsLCwQENDAwIDAzFj\nxgyMGDGiRztERESttXtmX1VVBQCYOHEiXF1dMW3aNKjVar02arUakZGRUKlUiIqKQn5+vm6bhYUF\nAODGjRtobm6GmZlZd9dPRESd0G7YZ2ZmwtvbW7fs6+uL48eP67XRaDTw9fXVLdvZ2aGoqAgA0NLS\ngtGjR8PBwQGLFi2Cs7Nzd9ZORESddN9v0AohIITQW6dQKAAAJiYmOHHiBAoLC/HBBx8gNzf3fg9H\nRET3oN0x++DgYCxdulS3nJeXh+nTp+u1CQ0NxenTpxEREQEAKC8vh7u7u14bNzc3/OlPf4JarcaY\nMWNaHSc+Pl73dXh4OMLDw7vaDyIio5aeno709PR73r/dsLeysgLw+4wcFxcXpKamIi4uTq9NaGgo\nlixZgnnz5iElJQU+Pj4AgIqKCvTr1w/W1ta4evUqDh48iDfeeKPN49we9kRE1NqdJ8IJCQld2r/D\n2TibNm1CdHQ0mpqaEBMTA1tbWyQlJQEAoqOjERISgrCwMAQFBUGlUiE5ORkAcOXKFTz77LNoaWmB\no6MjYmNjMXTo0C4VR0RE3aPDsJ80aZLeDBvg95C/3fr167F+/Xq9daNGjUJOTk43lEhERPeLV9AS\nEckAw56ISAYY9kREMsCwJyKSAYY9EZEMMOyJiGSAYU9EJAMMeyIiGWDYExHJAMOeiEgGGPZERDLQ\n4b1xiKjrtE1aXD97HaJRdNyYqBcw7Im6gdAK3LhwA5WnK1GZV4mqgipoG7Vw9mz709kOHz4MU1NT\n+Pn5wdLSsperJTli2BN1g+I9xSjdXwoAsBhmgaGThsLK0womuSZtto+NjUVWVhYAwN3dHf7+/vD3\n98dLL73EW4FTj2DYE3VS080mNFY1YuCwga222QXbwWKoBWx8bWBmYwYAaGloQc2/atp8rm+++QYn\nT57Ue+zbtw/z589vs31OTg7c3NygUqm6r0MkKwx7orvQNmlRVViFyrxKVJ6uRE1xDQZ7DMbYlWNb\ntbV0tYSla+eHY1xdXeHq6ooZM2bo1tXV1cHc3Lx1HVotJkyYgNraWjg5Oen+C/D390dkZCT69+9/\nbx0kWWHYE7WhvqIemuUaaBu1gBIY7D4YrjNdofLruTPrAQMGtLleq9Viz549OHnyJE6cOIGTJ0/i\n4MGDMDc3x5NPPtlj9ZBxYdiTrNVfrYeZygwKhUJvvdkQMzzwxwdg5WkFa29r9Bsg3a9Kv379EBER\ngYiICN26xsZGlJaWQqlsPXv61mc+P/XUU636RfLFefYkK003m1CeVY6CHQVQ/0WN428cR11ZXat2\nCoUCHk94wHaMraRBfzempqYYMWJEm9s++ugjPP3003jooYegVqt7uTLqqxj2JBvn95/HTzE/Ie/9\nPJQdK8MAxwEY8fQI9BvY98L8frz55pvYvn07SkpKMG7cOPz5z3/GhQsXpC6LJGZcP+VE7TAxN4F9\niD2GTh6Kwe6DoexnnOc6JiYmmD9/PiIjI7Fu3Tq8++67+O///m+cO3cO9vb2UpdHEmHYk2w88IcH\noPijfMawLS0tsXbtWrz44os4cOAAg17mjPPUhmRNCAEhWt+mQK5vVrq5ueGll16SugySGMOejErd\nb3U4+c5JlB0tk7oUg/DJJ59wPF8mGPZkFLTNWpT+v1JkrsxEdVG11OUYhPLycsTExMDLywvx8fG4\nefOm1CVRD2LYk8GrPleN7IRsnPv6HFR+KgSvDcbQCby/TEfs7Oxw+vRpzJw5EwkJCfDy8kJycjK0\nWq3UpVEPYNiTQRNCoODzAjTVNGHkqyPhF+MHc1XrWw5Q21xdXfHll1/iyJEjcHR0xNy5c7Fhwwap\ny6IewNk4ZNAUCgV8/8MXpoNN++TFT4YiLCwMGo0GX3zxBf70pz9JXQ71AP52kMGzcLCQugSjoFQq\n8eyzz0pdBvUQDuOQQRBagcvpl9F0s0nqUmRJo9Fgx44dHM83YAx76vNuXLyB3LW5KPisAGUZnFIp\nhY8//hjPPvssxo0bh59++knqcugeMOypz2ppbMG5b84hOy4btWW18H7BG07TnaQuS5Y+/PBD7Nix\nA5cuXcLDDz+MqKgoXL58WeqyqAs4Zk99UktDC7LislBXVgeHhx3g8ZQHTC1NpS5LtpRKJebOnYs5\nc+Zgw4YN2LBhA9LT0+EY4ih1adRJPLOnPsnEzAQO4x3gv9QfPi/4MOj7iIEDByIhIQFnz55FXFwc\nFEp53oLCEDHsqc9ym+UG1Uh+5mpf5OLignHjxkldBnUBw54k11zbLHUJREavU2GfkZEBHx8feHp6\nYsuWLW22WbZsGdzd3REYGIgzZ84AAC5cuIDJkydj5MiRCA8Px65du7qvcjJ4Wq0WJb+UIOc/c3g/\nGyNx4fsL+GXnL9A2c4pmX9OpsF+8eDGSkpKQlpaGrVu3oqKiQm+7RqPBkSNHkJWVhdjYWMTGxgIA\n+vfvj8TEROTl5eGbb77BypUrUVNT0/29IINTXV2N2bNnozCvEFYPWsFMZSZ1SdQNGqsacSn1Ek5s\nPIHG6kapy6HbdBj2VVVVAICJEyfC1dUV06ZNa/W5lmq1GpGRkVCpVIiKikJ+fj4AwNHREQEBAQAA\nW1tbjBw5EllZWd3dBzIwhYWFGD9+PL777jt4+XvhwecehJkNw94YeDzlAZ8XfVBzrgbZ8dmoPsf/\n2PqKDsM+MzMT3t7eumVfX18cP35cr41Go4Gvr69u2c7ODkVFRXptCgsLkZeXh5CQkPutmQxYc3Mz\nHnnkEZSVleHgwYNwdneW7YeKGCuHhxwwZuUYQAHkrs1FRU5FxztRj+uWN2jb+mSg23+Ba2pq8OST\nTyIxMREDBw7sjkOSgerXrx8+/fRTZGZmYsqUKVKXQz3E0tUSgfGBsB1ri0Eug6Quh9CJi6qCg4Ox\ndOlS3XJeXh6mT5+u1yY0NBSnT59GREQEgN8/FMHd3R0A0NTUhMceewxz587FrFmz2jxGfHy87uvw\n8HCEh4d3tR9kQMLCwqQugXqBqaUpRv7HSKnLMBrp6elIT0+/5/07DHsrKysAv8/IcXFxQWpqKuLi\n4vTahIaGYsmSJZg3bx5SUlLg4+MD4Pcz/oULF8LPzw+vvfbaXY9xe9gTEVFrd54IJyQkdGn/Tt0u\nYdOmTYiOjkZTUxNiYmJga2uLpKQkAEB0dDRCQkIQFhaGoKAgqFQqJCcnAwCOHTuG5ORk+Pv7Y8yY\nMQCAdevWtfrPgIxTdnY2srKyEB0dLXUp1IcIrcC1U9cwxH+I1KXISqfCftKkSboZNrfc+Qu8fv16\nrF+/Xm9dWFgYb4kqU19++SXmz5+v+/QjCwvec55+99vx35D/UT6Ghg+F5zOeUPbntZ29gd9l6lZa\nrRbLly9HVFQUgoKCoFarGfSkx36cPVz+3QVX0q/g5/U/o6GyQeqSZIFhT92muroas2bNwrp16/DC\nCy/ghx9+gL29vdRlUR+jUCrgHukO31d8cePiDWTHZ6PqlyqpyzJ6DHvqNlVVVcjNzcX777+PpKQk\nmJryTpV0d/bB9hi7aiyUZkqc++Zcq+nb1L14P3vqNs7OzigoKOCwDXXaIKdBCIwLhLZJy4vrehjD\nnroVg566qv/A/lKXIAscxqF70tDQwJlW1KM4rNO9GPbUZWVlZZg8eXKXL+og6iyhFTi1+RQupl5k\n6HcThj11SXZ2NoKDg3HixAn4+flJXQ4ZKW2TFhBA4c5CnPn4DFoaW6QuyeAx7KnTdu/ejbCwMCiV\nShw7dgyPP/641CWRkTIxM4FfjB/cZrvh12O/IndNLuqv1ktdlkEz+DdotVotrl27JnUZPUahUECl\nUkk+U2Hbtm148cUXMWHCBHzzzTecP99ZAq0+7KcnWVhYGM2b5AqlAm6z3TDIdRDyP8pHdnw2ApYF\nYOAw3jn3Xhh82O/btw/L316OfuYG35U2aeu1+NuGv2HChAmS1jFjxgz85S9/werVqzl/vpMUJgrU\n9q/FlMd751bOQivg5eyFb5K/6ZXj9RbbMbYI/GsgLnx/AQPsB0hdjsEy+IRsbGyEwluBIeHGeVOl\nygOVaGyU/uPdHB0dW937iNqn7KfEsGeH9drx6q/Wo+qIcV6JajHUAl4LvKQuw6BxzJ6ISAYY9qRH\nCIE9e/agpYWzH6jva7rRhJuXbkpdhkFg2JNOQ0MDnn/+eTz22GO6zyQg6st++eIX5PxnDipy+Tm3\nHWHYEwDg8uXLCA8Px/bt2/HXv/4Vc+fOlbokog65P+mOAY4DcGrzKZT+v1JegNUOg3+Dlu6fWq3G\no48+iurqanz77beYM2eO1CURdYq5yhxjlo3BmU/O4NzX53Dz4k08OP9BmJiaSF1an8OwJyQkJMDc\n3BwpKSkYNWqU1OUQdYmJmQl8X/ZFqVMpivcUw9LdEk5TnaQuq89h2BO++OILAMCQIcY5fZWMn0Kh\ngOtMV1h5WcHK00rqcvokhj0x5MloWHtZS11Cn8U3aGWGb2ARyRPDXka+/vprzJgxA01NTVKXQtRr\nGq43oODzAjTXN0tdiqQY9jKg1WqxcuVKPPHEE7h69Sqqq6ulLomo11QVVOFy+uXf75xZId87ZzLs\njVxVVRVmzZqFNWvWYOHChUhPT+cYPcmKfYg9/Jf4o76iHtkJ2bhecF3qkiTBsDdiv/76K8aNG4cD\nBw7g/fffx7Zt22BmZiZ1WUS9TjVKhcC/BqKfRT+cePsErhy+InVJvY5hb8RsbW0REhKCtLQ0vPLK\nK5LfE59IShZDLTD2r2Nh7W2N+mvyG87h1EsjZmJigs8//1zqMoj6jP4D+2PUklGyPPFh2BORrChN\n5DmgIc9eG6Hz58/jyhX5jUMSdRdjn5rJsDcChw8fRlBQEObPny91KUQGqf5qPTT/R4OLBy8a7YWH\nDHsDJoTABx98gD/+8Y8YMmQI3nvvPalLIjJI/Qb2g+VwSxTuKsTZT89C26yVuqRuxzF7A9XY2IhF\nixZh27Zt+Ld/+zfs3LkTVla8ARTRvehn3g9+r/qh+P8Wo/Qfpagrq4PDQw5Sl9WteGZvoJKTk7Ft\n2zYsX74ce/fuZdAT3SeFUgH3x9zh85IPaoprULynGI2NjVKX1W14Zm+gnnvuOXh6emLChAlSl0Jk\nVBzGOWCAwwBc/vEyTE1NpS6n2zDsDZRSqWTQE/WQwcMHo77cuC684jAOEZEMdBj2GRkZ8PHxgaen\nJ7Zs2dJmm2XLlsHd3R2BgYE4c+aMbv2CBQvg4ODAj7q7D80NzVizZg1KS0ulLoWIDFiHYb948WIk\nJSUhLS0NW7duRUVFhd52jUaDI0eOICsrC7GxsYiNjdVtmz9/Pg4cOND9VctEZX4lfjn4C44ePYqc\nnBypyyEiA9Zu2FdVVQEAJk6cCFdXV0ybNg1qtVqvjVqtRmRkJFQqFaKiopCfn6/bNmHCBNjY2PRA\n2catua5eAr40AAALBUlEQVQZBTsKcOLtE4ASePfddzF79mypyyIiA9Zu2GdmZsLb21u37Ovri+PH\nj+u10Wg08PX11S3b2dmhqKiom8uUD22zFtkJ2bj842U4RTjBK8ILPj4+UpdFRAbuvmfjCCFaXV7c\n1TvKxcfH674ODw9HeHj4/ZZlsJT9lHCe7oyBDwyElacVKg9USl0SEfUB6enpSE9Pv+f92w374OBg\nLF26VLecl5eH6dOn67UJDQ3F6dOnERERAQAoLy+Hu7t7l4q4PewJGBY+TOoSiKiPufNEOCEhoUv7\ntzuMc+uqzIyMDJSUlCA1NRWhoaF6bUJDQ/Htt9/i6tWr2LVrF4ccuqClsUXqEohIJjocxtm0aROi\no6PR1NSEmJgY2NraIikpCQAQHR2NkJAQhIWFISgoCCqVCsnJybp9o6KicPjwYVy9ehXOzs5YvXo1\n78z4P66duoaz289ixDMjYBdoJ3U5RGTkOgz7SZMm6c2wAX4P+dutX78e69evb7Xv7t2777M849Nc\n14yiL4tw5fAVDHAcADNrfiYsEfU83i6hF1371zWc/fQsGiob4PwnZ7jNdoOJqYnUZRGRDDDse4m2\nWYuCLwpgYmaCsSvHYrDHYKlLIiIZYdj3EmU/JfyX+MNMZcazeSLqdQz7XmThaCF1CUQkU7zrZQ+4\nlncNLQ2cVklEfQfDvhs13WzCmU/O4OTGk7iYelHqcoiIdDiM002unriKs5+eRWN1I1z+3QXOEc5S\nl0REpMOwv0/aZi0KPitA2dEyDHQaCL/Ffhg8nDNtiKhvYdjfJ2U/JbQtWrjOcIXrTFco+3NkjIj6\nHoZ9N/B50afLd/okIupNPA3tgjtv5XwLg56I+jqGfSdom7W4knEFmSsycePCDanLISLqMg7jtKO5\nrhlX0q/gwsELaKxsxEDngWip5/x5IjI8DPu7uHbqGk5/cBrNtc2w9rGG9wJv2PjZcMiGiAwSw/4u\nBjkPgo2fDZynO2OwO6dSEpFhY9jfhamVKUb+x0ipyyAi6hayfYNWCIHK/EqceOcEKk/zQ72JyLjJ\n7sxeaAUqcipQ+l0pas7VoP/g/miqaZK6LCKiHiWrsL956SZObTmFurI6mNuZw3OeJxzDHHl/eSIy\nerIKe3Nbc5ipzDD80eGwDbKF0kS2o1hEJDOyCnsTMxMEvBkgdRlERL3O6E5t636rQ8GOAvym+U3q\nUoiI+gyjObOvOV+DC99dwG+a36AwUcBMZSZ1SUREfYbBh31VVRXOHzyPm5dvwsTcBM7TneE0zQlm\nNgx7IqJbDD7sBw0aBG2zFsMjh2PY5GHoP7C/1CUREfU5Bh/2JiYmcHvEDQ6THaQuhYiozzKKN2h5\nczIiovYZRdgTEVH7GPZERDLAsCcikgGGPRGRDDDsiYhkgGFPRCQDDHsiIhlg2BMRyUCHYZ+RkQEf\nHx94enpiy5YtbbZZtmwZ3N3dERgYiDNnznRpXyIi6nkdhv3ixYuRlJSEtLQ0bN26FRUVFXrbNRoN\njhw5gqysLMTGxiI2NrbT+8pBZb5xf75tenq61CX0KL5+hsvYX7uuajfsq6qqAAATJ06Eq6srpk2b\nBrVarddGrVYjMjISKpUKUVFRyM/P7/S+cnD9zHWpS+hRxhwWAF8/Q2bsr11XtRv2mZmZ8Pb21i37\n+vri+PHjem00Gg18fX11y3Z2digqKurUvkRE1Dvu+66XQggIIfTW9eaNyRQKBZqLm3H9Rt/8K15f\nUI/r+++9tuuF1/HWW2/hrbfe6saquk9xcTEOHz58z/tXN1SjZn8NBg4Z2I1VdZ/7ff16082rN9FY\n34jJkyd3ep/7fv2qqiH2i44bSuB+X7vma81Q+hrRHBbRjuvXr4uAgADd8qJFi8T+/fv12mzevFm8\n++67umV3d3chhBCVlZUd7iuEEB4eHgIAH3zwwQcfXXh4eHi0F9+ttHtmb2VlBeD3WTUuLi5ITU1F\nXFycXpvQ0FAsWbIE8+bNQ0pKCnx8fAAA1tbWHe4LAIWFhe2VQERE3aDDYZxNmzYhOjoaTU1NiImJ\nga2tLZKSkgAA0dHRCAkJQVhYGIKCgqBSqZCcnNzuvkRE1PsU4s4BdyIiMjqSv/vwX//1X1Aqlbh2\n7Zpu3ebNm+Hp6QlfX18cPXpUwuruzapVqzB69GgEBARg7ty5uHr1qm6bofcNAJYuXQofHx+MHTsW\nr732Gurq6nTbjKF/X3/9NUaOHAkTExPk5OTobTOG/gHGd8HjggUL4ODggFGjRunW1dTUYNasWXBx\nccHs2bNx48YNCSu8dxcuXMDkyZMxcuRIhIeHY9euXQDuoX9dGuHvZqWlpSIiIkK4ubmJq1evCiGE\n+PXXX4WXl5c4f/68SE9PF2PGjJGyxHtSXV2t+zohIUGsWrVKCGEcfRNCiIMHD4qWlhbR0tIinn/+\nefHxxx8LIYynf/n5+eLs2bMiPDxcZGdn69YbS/+EECIgIEAcPnxYlJSUCC8vL1FeXi51SfclIyND\n5OTkCD8/P926t99+WyxatEjU19eLV155RWzcuFHCCu/dlStXRG5urhBCiPLycjF8+HBRXV3d5f5J\nema/ZMkSbNiwQW+dWq3G9OnT4eLigkmTJkEIgZqaGokqvDeWlpYAgObmZty8eRPm5uYAjKNvADB1\n6lQolUoolUpERETopu4ZS/+8vb3x4IMPtlpvLP0zxgseJ0yYABsbG711Go0GCxcuhJmZGRYsWGCw\nfXR0dERAQAAAwNbWFiNHjkRmZmaX+ydZ2O/duxdOTk7w9/fXW6/RaHQzegDAy8sLGo2mt8u7bytW\nrICjoyOOHj2KpUuXAjCevt1u27ZtmDFjBgDj7N/tjKV/crng8fZ+ent7G+RrdafCwkLk5eUhJCSk\ny/2774uq2jN16lSUlZW1Wr9mzRqsW7cOBw8e1K0T//M+sWjj/eLevEirs+7Wt7Vr12LGjBlYs2YN\nVqxYgRUrVuDNN99EYmKiwfQN6Lh/ALB69WpYWlri8ccfB2A4rx3Quf7dyZD6R22/XoaspqYGTz75\nJBITEzFo0KAu969Hwz41NbXN9adOnUJxcTFGjx4NALh48SICAwOhVqsRGhqKtLQ0XdszZ84gODi4\nJ8u8J3fr2+0sLCywYMECvPDCCwBgMH0DOu7fZ599hpSUFPzwww+6dcbUv7YYUv/aExwcrPtvEwDy\n8vIwffp0CSvqGcHBwcjPz8eYMWOQn59vkK/VLU1NTXjssccwd+5czJo1C0DX+yfJMI6fnx9+/fVX\nFBcXo7i4GE5OTsjJyYGDgwNCQkKQkpKC0tJSpKenQ6lU6sbADcUvv/wC4Pcx+927d2POnDkAYBR9\nA4ADBw5g48aN2Ldvn+79CMB4+ne728+ejKV/t18sWVJSgtTUVISGhkpcVfcLDQ3F9u3bUVdXh+3b\nt2PcuHFSl3RPhBBYuHAh/Pz88Nprr+nWd7l/PfQGcpcMHz5cNxtHCCE2bdokPDw8hI+Pj8jIyJCw\nsnvz2GOPCT8/PxEcHCyWLl0qrl27pttm6H0TQogRI0YIFxcXERAQIAICAsTLL7+s22YM/duzZ49w\ncnIS5ubmwsHBQUyfPl23zRj6J4QQ6enpwtvbW3h4eIj33ntP6nLu21NPPSWGDh0qTE1NhZOTk9i+\nfbuorq4WM2fOFM7OzmLWrFmipqZG6jLvyZEjR4RCoRCjR4/W/c59//33Xe4fL6oiIpIByS+qIiKi\nnsewJyKSAYY9EZEMMOyJiGSAYU9EJAMMeyIiGWDYExHJAMOeiEgG/j++3uD8lSqgRAAAAABJRU5E\nrkJggg==\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5e12d50>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nxZoMBoO88sorbq2jvczMTMnOzpbGxka5ePGi/PTTT4q3k72alG6n9lpaWmTgwIFSXV2teFvZq0nJ\ntvrxxx8lPDxc6urqpKWlRe666y7Ztm2bou3UWU1KttNPP/0kQ4YMkTNnzojFYpHo6GiP+LfXWV09\nbSu3zEUjHnhB1OU1dbbMXcrKyrBo0SIEBATA398fV199teLtZK8mQNl2aq+srAyDBg1CaGio4m1l\nryYRUayt+vXrBxHBuXPn0NjYiIaGBlxzzTWKtlNnNQHKfaZ2794NvV6P4OBgBAYGYuLEidizZ4/i\nn6fO6gJ61lYuD3hPvCDKXk0AsGLFCsTGxmLp0qWwWCxuq+frr79GU1MTUlNTERMTg6VLl6KxsVHR\ndrJXU1NTEwDl2ulyb731FmbOnAlA+c+UvZo0Go1ibdWvXz8UFBQgPDwcAwcOxLhx4xATE6NoO3VW\nE6DcZ2rChAkwmUw4efIkTp06ha1bt2L37t2Kf546qwvoYVs5/bvFZb799lsRETl06JBERETIqVOn\nJDQ0VBobG0VEpL6+XsLCwlxdxhVr+v7776W1tVV++ukneeKJJ9z6lezYsWOi0Whk8+bN0tDQIHPm\nzJF169Yp2k72anrjjTcUbaf2mpub5Ze//KXU1taKiCj+mbJXk5JtVVtbKzfffLMcO3ZMTp8+LRMn\nTpQPPvhA0XayV9OWLVsU/0xt3rxZ7rrrLhk7dqzMnDlTXnzxRY/4PF1e10svvSS1tbU9aiuXB3x7\nPbkgyt01tbd//34ZO3asW+vQ6XTWn7du3SrJycmKt5O9mtpTop3avP/++zJ16lTrc6Xbyl5N7bm7\nrbZs2SIzZsywPl+5cqUsXLhQ0XbqrKb2lPxMiYjMmDFD9u7d6xGfp8vr2rdvn82y7rSVS4doGhoa\nrF8h2i6ImjZtGmJiYlBYWIjGxsZOL4hyd02nTp0CAFy6dAlvvvkm7r77brfVBACDBw9GeXk5Wltb\nUVJSgkmTJinaTp3V9N133wFQrp3abNiwwToUAkDxtrJXk5KfqfHjx2Pv3r04c+YMmpubUVpaiilT\npijaTp3VpPRnqra2FsDPx08OHjwIvV7vEZ+n9nUdOHAAer2+558pV/6vc+LECRk9erSMHj1aEhIS\nZO3atSIicv78ebn33nslNDRUEhMTxWKxuLKMbtU0Z84cGTlypERFRcn8+fM7nGXjakeOHJGYmBgZ\nPXq0ZGZmSl1dnaLtZK8mi8WieDuJiNTV1cm1114r58+fty5Tuq3s1aR0WxUVFcmECRPk9ttvl+zs\nbGlpaVFWSisIAAAAWElEQVS8nezVpHQ7jR8/XoYOHSq33367lJeXi4jyn6fO6uppW/FCJyIileIt\n+4iIVIoBT0SkUgx4IiKVYsATEakUA56ISKUY8EREKsWAJyJSKQY8EZFK/X+9V6p/FHk97AAAAABJ\nRU5ErkJggg==\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5cef550>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nSMH+P8RCm5j9H6IfAAAAAElFTkSuQmCC\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x62e2c10>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 10 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Repeated Measures ANOVA" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Taken from:\n", | |
| "\n", | |
| "* https://statistics.laerd.com/statistical-guides/repeated-measures-anova-statistical-guide.php\n", | |
| "* http://ww2.coastal.edu/kingw/statistics/R-tutorials/repeated.html\n", | |
| "* http://www.stata.com/support/faqs/statistics/repeated-measures-anova/\n", | |
| "* http://www.statisticshell.com/docs/repeatedmeasures.pdf\n", | |
| "* http://documentation.statsoft.com/STATISTICAHelp.aspx?path=Gxx/Glm/Examples/Example6RepeatedMeasuresANOVADesign\n", | |
| "\n", | |
| "A repeated measures ANOVA is also referred to as a within-subjects ANOVA or ANOVA for correlated samples.\n", | |
| "\n", | |
| "Data from: https://statistics.laerd.com/statistical-guides/repeated-measures-anova-statistical-guide.php" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions \n", | |
| "from scipy import special\n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| " \n", | |
| "pre = [45, 42, 36, 39, 51, 44]\n", | |
| "three = [50, 42, 41, 35, 55, 49]\n", | |
| "six =[55, 45, 43, 40, 59, 56]\n", | |
| " \n", | |
| "# Create data table\n", | |
| "data = np.array([pre, three, six])\n", | |
| "data = np.core.records.fromarrays(data, names='pre, three, six', formats = 'f8, f8, f8')\n", | |
| "data_v = data.view((data.dtype[0], len(data.dtype.names)))\n", | |
| " \n", | |
| "# Calculate the average across colums\n", | |
| "col_means = np.average(data_v, axis=1)\n", | |
| " \n", | |
| "# Calculate the average down trough rows.\n", | |
| "row_means = np.average(data_v, axis=0)\n", | |
| " \n", | |
| "# Grand mean\n", | |
| "G_Mean = np.average(row_means)\n", | |
| "print \"Grand mean is:\", G_Mean\n", | |
| " \n", | |
| "# \n", | |
| "ni = len(data_v)\n", | |
| "SStime = ni * np.sum( np.square( row_means - G_Mean ) )\n", | |
| "print \"SStime is :\", SStime\n", | |
| " \n", | |
| "SSw = 0.0\n", | |
| "for i, name in enumerate(data.dtype.names):\n", | |
| " col_sum = np.sum( np.square( data[name] - row_means[i] ) )\n", | |
| " SSw += col_sum\n", | |
| "print \"SSw is :\", SSw\n", | |
| " \n", | |
| "k = len(data.dtype.names)\n", | |
| "SSsubjects = k * np.sum( np.square(col_means - G_Mean) )\n", | |
| "print \"SSsubjects is :\", SSsubjects\n", | |
| " \n", | |
| "SSerror = SSw - SSsubjects\n", | |
| "print \"SSerror is :\", SSerror\n", | |
| " \n", | |
| "MStime = SStime/(k - 1)\n", | |
| "print \"MStime is :\", MStime\n", | |
| " \n", | |
| "MSerror = SSerror/( (ni - 1) * (k - 1) )\n", | |
| "print \"MSerror is :\", MSerror\n", | |
| " \n", | |
| "F = MStime / MSerror\n", | |
| "print \"F is :\", F\n", | |
| " \n", | |
| "# The critical F-value\n", | |
| "# The between-group degrees of freedom is one less than the number of groups\n", | |
| "f_b = k-1\n", | |
| "# The within-group degrees of freedom\n", | |
| "f_W = f_b*(ni-1)\n", | |
| " \n", | |
| "alpha = 0.05\n", | |
| "pct = 1.0 - alpha\n", | |
| " \n", | |
| "Fcrit = special.fdtri(k - 1, ni - 1, pct)\n", | |
| "print \"Fcrit (%i, %i) at alpha=%3.2f is :%3.3f\"%(f_b, f_W, alpha, Fcrit)\n", | |
| " \n", | |
| "# The p-value for this tes\n", | |
| "p = stats.fprob(f_b, f_W, F)\n", | |
| "print \"The p-value for this test: p= %1.3f\"% (p)\n", | |
| " \n", | |
| "# Print by pandas\n", | |
| "# First add to table\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'means', col_means, dtypes=data['pre'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Add 0.0 in the end of the array.\n", | |
| "row_means_row = np.append(row_means, [0.0])\n", | |
| "# Resize and add to bottom\n", | |
| "data = np.resize(data, (data.shape[0]+1) )\n", | |
| "data[-1] = row_means_row\n", | |
| " \n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "#pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print data_pd" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Grand mean is: 45.9444444444\n", | |
| "SStime is : 143.444444444\n", | |
| "SSw is : 715.5\n", | |
| "SSsubjects is : 658.277777778\n", | |
| "SSerror is : 57.2222222222\n", | |
| "MStime is : 71.7222222222\n", | |
| "MSerror is : 5.72222222222\n", | |
| "F is : 12.5339805825\n", | |
| "Fcrit (2, 10) at alpha=0.05 is :5.786\n", | |
| "The p-value for this test: p= 0.002\n", | |
| " pre three six means\n", | |
| "0 45.000 50.000 55.000 50.000\n", | |
| "1 42.000 42.000 45.000 43.000\n", | |
| "2 36.000 41.000 43.000 40.000\n", | |
| "3 39.000 35.000 40.000 38.000\n", | |
| "4 51.000 55.000 59.000 55.000\n", | |
| "5 44.000 49.000 56.000 49.667\n", | |
| "6 42.833 45.333 49.667 0.000\n", | |
| "\n", | |
| "[7 rows x 4 columns]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 11 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Repeated Measures ANOVA - Groceries example" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Taken from:\n", | |
| "\n", | |
| "Data from: http://ww2.coastal.edu/kingw/statistics/R-tutorials/repeated.html" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions \n", | |
| "from scipy import special\n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| "subject = ['lettuce', 'potatoes', 'milk', 'eggs', 'bread', 'cereal', 'ground.beef', 'tomato.soup', 'laundry.detergent', 'aspirin']\n", | |
| "storeA = [1.17, 1.77, 1.49, 0.65, 1.58, 3.13, 2.09, 0.62, 5.89, 4.46]\n", | |
| "storeB = [1.78, 1.98, 1.69, 0.99, 1.7, 3.15, 1.88, 0.65, 5.99, 4.84]\n", | |
| "storeC = [1.29, 1.99, 1.79, 0.69, 1.89, 2.99, 2.09, 0.65, 5.99, 4.99] \n", | |
| "storeD = [1.29, 1.99, 1.59, 1.09, 1.89, 3.09, 2.49, 0.69, 6.99, 5.15] \n", | |
| " \n", | |
| "# Create data table\n", | |
| "data = np.array([storeA, storeB, storeC, storeD])\n", | |
| "data = np.core.records.fromarrays(data, names='storeA, storeB, storeC, storeD', formats = 'f8, f8, f8, f8')\n", | |
| "data_v = data.view((data.dtype[0], len(data.dtype.names)))\n", | |
| " \n", | |
| "# Calculate the average across colums\n", | |
| "col_means = np.average(data_v, axis=1)\n", | |
| " \n", | |
| "# Calculate the average down trough rows.\n", | |
| "row_means = np.average(data_v, axis=0)\n", | |
| " \n", | |
| "# Grand mean\n", | |
| "G_Mean = np.average(row_means)\n", | |
| "print \"Grand mean is:\", G_Mean\n", | |
| " \n", | |
| "# \n", | |
| "ni = len(data_v)\n", | |
| "SStime = ni * np.sum( np.square( row_means - G_Mean ) )\n", | |
| "print \"SStime is :\", SStime\n", | |
| " \n", | |
| "SSw = 0.0\n", | |
| "for i, name in enumerate(data.dtype.names):\n", | |
| " col_sum = np.sum( np.square( data[name] - row_means[i] ) )\n", | |
| " SSw += col_sum\n", | |
| "print \"SSw is :\", SSw\n", | |
| " \n", | |
| "k = len(data.dtype.names)\n", | |
| "SSsubjects = k * np.sum( np.square(col_means - G_Mean) )\n", | |
| "print \"SSsubjects is :\", SSsubjects\n", | |
| " \n", | |
| "SSerror = SSw - SSsubjects\n", | |
| "print \"SSerror is :\", SSerror\n", | |
| " \n", | |
| "MStime = SStime/(k - 1)\n", | |
| "print \"MStime is :\", MStime\n", | |
| " \n", | |
| "MSerror = SSerror/( (ni - 1) * (k - 1) )\n", | |
| "print \"MSerror is :\", MSerror\n", | |
| " \n", | |
| "F = MStime / MSerror\n", | |
| "print \"F is :\", F\n", | |
| " \n", | |
| "# The critical F-value\n", | |
| "# The between-group degrees of freedom is one less than the number of groups\n", | |
| "f_b = k-1\n", | |
| "# The within-group degrees of freedom\n", | |
| "f_W = f_b*(ni-1)\n", | |
| " \n", | |
| "alpha = 0.05\n", | |
| "pct = 1.0 - alpha\n", | |
| " \n", | |
| "Fcrit = special.fdtri(k - 1, ni - 1, pct)\n", | |
| "print \"Fcrit (%i, %i) at alpha=%3.2f is :%3.3f\"%(f_b, f_W, alpha, Fcrit)\n", | |
| " \n", | |
| "# The p-value for this tes\n", | |
| "p = stats.fprob(f_b, f_W, F)\n", | |
| "print \"The p-value for this test: p= %1.5f\"% (p)\n", | |
| " \n", | |
| "# Print by pandas\n", | |
| "# First add to table\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'means', col_means, dtypes=float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Add 0.0 in the end of the array.\n", | |
| "row_means_row = np.append(row_means, [0.0])\n", | |
| "# Resize and add to bottom\n", | |
| "data = np.resize(data, (data.shape[0]+1) )\n", | |
| "data[-1] = row_means_row\n", | |
| " \n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "#pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print data_pd" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Grand mean is: 2.453\n", | |
| "SStime is : 0.58586\n", | |
| "SSw is : 116.40658\n", | |
| "SSsubjects is : 115.19284\n", | |
| "SSerror is : 1.21374\n", | |
| "MStime is : 0.195286666667\n", | |
| "MSerror is : 0.0449533333333\n", | |
| "F is : 4.34420880914\n", | |
| "Fcrit (3, 27) at alpha=0.05 is :3.863\n", | |
| "The p-value for this test: p= 0.01273\n", | |
| " storeA storeB storeC storeD means\n", | |
| "0 1.170 1.780 1.290 1.290 1.383\n", | |
| "1 1.770 1.980 1.990 1.990 1.933\n", | |
| "2 1.490 1.690 1.790 1.590 1.640\n", | |
| "3 0.650 0.990 0.690 1.090 0.855\n", | |
| "4 1.580 1.700 1.890 1.890 1.765\n", | |
| "5 3.130 3.150 2.990 3.090 3.090\n", | |
| "6 2.090 1.880 2.090 2.490 2.138\n", | |
| "7 0.620 0.650 0.650 0.690 0.652\n", | |
| "8 5.890 5.990 5.990 6.990 6.215\n", | |
| "9 4.460 4.840 4.990 5.150 4.860\n", | |
| "10 2.285 2.465 2.436 2.626 0.000\n", | |
| "\n", | |
| "[11 rows x 5 columns]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 12 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Wilcoxon signed-rank test for matched pairs" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "See\n", | |
| "\n", | |
| "* https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test\n", | |
| "For dependent samples when the population cannot be assumed to be normally distributed\n", | |
| "\n", | |
| "Try this: http://vassarstats.net/wilcoxon.html \n", | |
| "n=10" | |
| ] | |
| }, | |
| { | |
| "cell_type": "raw", | |
| "metadata": {}, | |
| "source": [ | |
| "125\t110\n", | |
| "115\t122\n", | |
| "130\t125\n", | |
| "140\t120\n", | |
| "140\t140\n", | |
| "115\t124\n", | |
| "140\t123\n", | |
| "125\t137\n", | |
| "140\t135\n", | |
| "135\t145" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from scipy import stats\n", | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| "x1 = [125, 115, 130, 140, 140, 115, 140, 125, 140, 135]\n", | |
| "x2 = [110, 122, 125, 120, 140, 124, 123, 137, 135, 145] \n", | |
| " \n", | |
| "# T and p value, two-sided\n", | |
| "#p-value : The two-sided p-value for the test.\n", | |
| "# T : The sum of the ranks of the differences above or below zero, whichever is smaller.\n", | |
| " \n", | |
| "T, p = stats.wilcoxon(x1, x2)\n", | |
| "print \"Standard. T and p: \", T, p\n", | |
| " \n", | |
| "# apply continuity correction by adjusting the Wilcoxon rank statistic by 0.5 towards the mean value when computing the z-statistic.\n", | |
| "T, p = stats.wilcoxon(x1, x2, correction=True)\n", | |
| "print \"Correction. T and p: \", T, p\n", | |
| " \n", | |
| "# Calculate the difference\n", | |
| "diff = np.asarray(x1) - np.asarray(x2)\n", | |
| " \n", | |
| "# Select only those who passes the different from zero test\n", | |
| "diff_c = np.compress(np.not_equal(diff , 0), diff )\n", | |
| "x1_c = np.compress(np.not_equal(diff , 0), x1 )\n", | |
| "x2_c = np.compress(np.not_equal(diff , 0), x2 )\n", | |
| " \n", | |
| "## Do it manually\n", | |
| "data = np.array([x1_c, x2_c])\n", | |
| "data = np.core.records.fromarrays(data, names='x1, x2', formats = 'f8, f8')\n", | |
| " \n", | |
| "data = np.lib.recfunctions.append_fields(data, 'sgn', np.sign(diff_c), float, usemask=False, asrecarray=True)\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'abs', np.abs(diff_c), float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "## Order by absolute difference\n", | |
| "data.sort(order='abs')\n", | |
| " \n", | |
| "## Rank the data\n", | |
| "rank = stats.rankdata(data['abs'])\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'Ri', rank, float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "sgn_ri = data['sgn'] * data['Ri']\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'sgn_Ri', sgn_ri, float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Number of ranks\n", | |
| "Nr = len(rank)\n", | |
| "print \"Nr is:\", Nr\n", | |
| " \n", | |
| "W = np.sum(sgn_ri)\n", | |
| "print \"W is:\", W\n", | |
| " \n", | |
| "STD_w = np.sqrt( (Nr*(Nr+1)*(2*Nr+1))/(6) )\n", | |
| "print \"STD_w is:\", STD_w\n", | |
| " \n", | |
| "z = (W - 0.5)/STD_w\n", | |
| "print \"z is:\", z\n", | |
| " \n", | |
| "# Confidence\n", | |
| "confidence = 0.95\n", | |
| "two_tailed_alpha = 1.00 - confidence\n", | |
| "one_tailed_alpha = two_tailed_alpha/2\n", | |
| " \n", | |
| "z_crit = stats.distributions.norm.isf(one_tailed_alpha )\n", | |
| "print \"z_crit=%1.3f for one-tailed alpha=%1.3f\"%(z_crit, one_tailed_alpha)\n", | |
| " \n", | |
| "# Probability\n", | |
| "p_one_tailed = stats.distributions.norm.sf(z)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| "print 'The two-tailed test p-value is approximately %1.3f and the one-tailed p-value is approximately %1.3f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| " \n", | |
| "## Print by pandas\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| "print data_pd" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Standard. T and p: 18.0 0.593630591443\n", | |
| "Correction. T and p: 18.0 0.635289318835\n", | |
| "Nr is: 9\n", | |
| "W is: 9.0\n", | |
| "STD_w is: 16.8819430161\n", | |
| "z is: 0.503496546095\n", | |
| "z_crit=1.960 for one-tailed alpha=0.025\n", | |
| "The two-tailed test p-value is approximately 0.615 and the one-tailed p-value is approximately 0.307\n", | |
| " x1 x2 sgn abs Ri sgn_Ri\n", | |
| "0 130.0000 125.0000 1.0000 5.0000 1.5000 1.5000\n", | |
| "1 140.0000 135.0000 1.0000 5.0000 1.5000 1.5000\n", | |
| "2 115.0000 122.0000 -1.0000 7.0000 3.0000 -3.0000\n", | |
| "3 115.0000 124.0000 -1.0000 9.0000 4.0000 -4.0000\n", | |
| "4 135.0000 145.0000 -1.0000 10.0000 5.0000 -5.0000\n", | |
| "5 125.0000 137.0000 -1.0000 12.0000 6.0000 -6.0000\n", | |
| "6 125.0000 110.0000 1.0000 15.0000 7.0000 7.0000\n", | |
| "7 140.0000 123.0000 1.0000 17.0000 8.0000 8.0000\n", | |
| "8 140.0000 120.0000 1.0000 20.0000 9.0000 9.0000\n", | |
| "\n", | |
| "[9 rows x 6 columns]\n" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stderr", | |
| "text": [ | |
| "/sbinlab2/software/python-enthought-dis/canopy-1.4.0-full-rh5-64/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/morestats.py:1410: UserWarning: Warning: sample size too small for normal approximation.\n", | |
| " warnings.warn(\"Warning: sample size too small for normal approximation.\")\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 13 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 1, | |
| "metadata": {}, | |
| "source": [ | |
| "Annoying data to compare" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The problem with this dataset, is that we know that there is an individual error on each datapoint. \n", | |
| "We want to take this into consideration when doing the statistics." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Multiple t-test with familywise error correction" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In this example we will make multiple t-tests, and correct for Familywise error by the Holm-\u0160\u00edd\u00e1k method. \n", | |
| "The null-hypothesis is that there is no difference between all the tests. " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions \n", | |
| "import copy\n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "#from matplotlib import style\n", | |
| "#style.use('ggplot')\n", | |
| " \n", | |
| "# Define data\n", | |
| "res_num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, \n", | |
| " 29, 30, 31, 32, 34, 35, 36, 37, 39, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58,\n", | |
| " 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 80, 81, 82, 83, 84, 85, 86]\n", | |
| " \n", | |
| "res_name = ['A', 'E', 'F', 'D', 'K', 'A', 'A', 'E', 'E', 'V', 'K', 'H', 'L', 'K', 'T', 'K', 'A', 'D',\n", | |
| " 'E', 'E', 'M', 'L', 'F', 'I', 'Y', 'S', 'H', 'Y', 'K', 'A', 'T', 'V', 'G', 'I', 'T', 'E',\n", | |
| " 'R', 'G', 'M', 'L', 'D', 'F', 'K', 'G', 'K', 'A', 'K', 'D', 'A', 'W', 'N', 'E', 'L', 'K',\n", | |
| " 'G', 'T', 'K', 'E', 'D', 'A', 'K', 'A', 'Y', 'I', 'D', 'K', 'E', 'L', 'K', 'K', 'K', 'Y',\n", | |
| " 'G', 'I']\n", | |
| " \n", | |
| "ref_val = [ 0.91024373, 3.60925171, 3.17784106, 3.99700115, 3.60711608,\n", | |
| " 0.31163906, 5.67501257, 2.30855341, 2.03726973, 5.77701703,\n", | |
| " 6.48923706, 5.71021757, 5.55290274, 1.85762676, 5.61780451,\n", | |
| " 2.09607925, 2.07852273, 3.04713421, 4.11137, 0.84296045,\n", | |
| " 2.07985013, 4.56743506, 3.20100931, 2.82223807, 0.58422802,\n", | |
| " 4.36838362, 4.05477225, 2.00800295, 6.33255709, 11.22422505,\n", | |
| " 11.78607978, 2.05001627, 3.74822605, 2.51791866, 6.21697472,\n", | |
| " 0.27736641, 4.61611892, 4.2013546, 3.87794532, 5.62661815,\n", | |
| " 0.3843826, 2.02021317, 3.34757423, 0.35509272, 2.60472753,\n", | |
| " 6.58254311, 3.42312234, 4.16294909, 1.93473179, 2.07526696,\n", | |
| " 6.5253814, 5.37803185, 8.67561747, 2.91750516, 9.54018383,\n", | |
| " 9.01911166, 0.46962397, 6.24824717, 0.86491637, 0.32630132,\n", | |
| " 3.30981738, 4.11945011, 1.96333298, 2.08634951, 5.66074641,\n", | |
| " 0.44726196, 5.33913566, 2.00701002, 0.33701417, 3.60688253,\n", | |
| " 3.57234264, 5.37404428, 3.30321923, 3.64269822]\n", | |
| " \n", | |
| "ni_val = [ 0.89309963, 3.61292809, 3.11542615, 3.98025178, 3.43994938,\n", | |
| " 0.27353119, 5.67418377, 2.25346994, 2.00767747, 5.76508857,\n", | |
| " 6.45277677, 5.67762211, 5.39834515, 1.86617222, 5.62091689,\n", | |
| " 2.10224377, 2.06772649, 3.27917723, 4.10094926, 0.83313694,\n", | |
| " 2.06588161, 4.53439958, 3.13949212, 2.91191774, 0.63773427,\n", | |
| " 4.19227403, 4.03850763, 2.01848384, 6.30377425, 11.22499578,\n", | |
| " 11.41615569, 2.12654154, 3.78688735, 2.45883007, 6.13661007,\n", | |
| " 0.3065527, 4.60294933, 4.2943232, 3.86548123, 5.52992443,\n", | |
| " 0.3736384, 1.9989515, 3.29443061, 0.48030984, 2.53667385,\n", | |
| " 6.59356022, 2.41508129, 4.11177612, 1.93137301, 2.07391903,\n", | |
| " 6.34913991, 5.40979641, 8.60283467, 2.87022147, 9.60225012,\n", | |
| " 9.07401983, 0.45323177, 6.21707616, 0.85976072, 0.3369907,\n", | |
| " 3.30338844, 4.12188801, 1.90165284, 2.2506127, 5.69555752,\n", | |
| " 0.40358004, 5.3478761, 1.98983745, 0.3311139, 3.61704454,\n", | |
| " 3.57329857, 5.35982765, 3.32741775, 3.66454006]\n", | |
| " \n", | |
| "ref_err = [ 0.10737387, 0.2988302, 0.36111907, 0.30777037, 0.30855783, 0.07778596,\n", | |
| " 0.45465738, 0.25918179, 0.17240042, 0.44896877, 0.48420278, 0.51684491,\n", | |
| " 0.49710594, 0.24309939, 0.51536974, 0.16272787, 0.22181091, 0.34287047,\n", | |
| " 0.36452403, 0.14781816, 0.19613379, 0.31360589, 0.37957875, 0.44111112,\n", | |
| " 0.10928475, 0.53023624, 0.22665547, 0.23738887, 0.59174888, 0.82198636,\n", | |
| " 1.01251054, 0.25656179, 0.34466063, 0.39659081, 0.55917821, 0.08228563,\n", | |
| " 0.39582688, 0.36574805, 0.24701975, 0.33248413, 0.08657965, 0.16115005,\n", | |
| " 0.32634004, 0.08984606, 0.30706413, 0.41415345, 0.31182309, 0.41883343,\n", | |
| " 0.10377392, 0.20621387, 0.66285639, 0.46451524, 0.67587898, 0.29799412,\n", | |
| " 1.15608672, 0.63892129, 0.09995497, 0.45812039, 0.07532633, 0.08880949,\n", | |
| " 0.29970947, 0.3325626, 0.19016293, 0.39020801, 0.43845404, 0.09150572,\n", | |
| " 0.45843908, 0.24604857, 0.09652762, 0.29571491, 0.28102906, 0.53560677,\n", | |
| " 0.32288339, 0.29264218]\n", | |
| " \n", | |
| "ni_err = [ 0.10512885, 0.27868399, 0.33824695, 0.31595396, 0.31098062, 0.07816262,\n", | |
| " 0.43676873, 0.23828771, 0.18446522, 0.44976116, 0.49110456, 0.56778965,\n", | |
| " 0.48140169, 0.21687251, 0.48332244, 0.14455428, 0.1968443, 0.33376286,\n", | |
| " 0.33065818, 0.13022267, 0.20605896, 0.30399551, 0.39353, 0.4514909,\n", | |
| " 0.11339814, 0.47358066, 0.23017618, 0.26396182, 0.61548713, 0.84315396,\n", | |
| " 0.93507, 0.25991585, 0.3717674, 0.42482049, 0.54690669, 0.08482096,\n", | |
| " 0.37239827, 0.36506568, 0.22995557, 0.30400334, 0.08491799, 0.15307524,\n", | |
| " 0.31036164, 0.09076805, 0.31280226, 0.41421353, 0.26672792, 0.4172986,\n", | |
| " 0.10581189, 0.18639669, 0.64489927, 0.47043783, 0.65775911, 0.31303265,\n", | |
| " 1.13146954, 0.7106016, 0.10390343, 0.47243515, 0.07512938, 0.09360014,\n", | |
| " 0.27862192, 0.33378593, 0.19940531, 0.40018419, 0.44858074, 0.08526919,\n", | |
| " 0.46592748, 0.22397215, 0.09109549, 0.29582885, 0.25223517, 0.5244558,\n", | |
| " 0.32844266, 0.33914167]\n", | |
| " \n", | |
| "# Create data table\n", | |
| "data = np.array([res_num, res_name, ref_val, ni_val, ref_err, ni_err])\n", | |
| "data = np.core.records.fromarrays(data, names='res_num, res_name, ref_val, ni_val, ref_err, ni_err', formats = 'i8, S1, f8, f8, f8, f8')\n", | |
| " \n", | |
| "# The number of data points in each\n", | |
| "ref_n = 500\n", | |
| "ni_n = 500\n", | |
| " \n", | |
| "# Try a t calculation with Welch's t test, Equal or unequal sample sizes, unequal variances\n", | |
| "# https://en.wikipedia.org/wiki/Welch%27s_t_test#Calculations\n", | |
| "t_w = np.abs( (data['ref_val'] - data['ni_val'])/np.sqrt(data['ref_err']**2/ref_n + data['ni_err']**2/ni_n) )\n", | |
| "data = np.lib.recfunctions.append_fields(data, 't_w', t_w, dtypes=data['ni_val'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# The within-group degrees of freedom with Welch t-test\n", | |
| "df_wt = np.square(data['ref_err']**2/ref_n + data['ni_err']**2/ni_n) / ( np.square(data['ref_err']**2)/(np.square(ref_n)*(ref_n-1)) + np.square(data['ni_err']**2)/(np.square(ni_n)*(ni_n-1)) )\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'df_wt', df_wt, dtypes=data['ref_val'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# The p-value for the Welch t-test\n", | |
| "# The multiplication by 2, is the meaning of a two-tailed test\n", | |
| "p_wt = stats.distributions.t.sf(np.abs(data['t_w']), df_wt )*2\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'p_wt', p_wt, dtypes=data['ni_val'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "## Use pandas to handle data\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| " \n", | |
| "# Now sort the data according to the p-values\n", | |
| "print \"Sorting according to Student tests p-value column.\\n\"\n", | |
| "ds = data_pd.sort(['p_wt'])\n", | |
| " \n", | |
| "# Number of groups\n", | |
| "k = ds.shape[0] \n", | |
| " \n", | |
| "# Now add the i column to the data\n", | |
| "i = np.array(range(k, 0, -1))\n", | |
| "ds['i'] = i\n", | |
| " \n", | |
| "# Make a selection of those whose p value is under 0.05\n", | |
| "alpha = 0.05\n", | |
| "print \"alpha=%1.2f\"%(alpha)\n", | |
| "p_sel = ds['p_wt'] < alpha \n", | |
| "print \"Number of test which p_value is below alpha=%1.2f is equal: %i, out of k groups: %i\\n\"%(alpha, np.sum(p_sel), k)\n", | |
| " \n", | |
| "# Now calculate the adjusted alpha value fom Holm-sidak\n", | |
| "a_adj = alpha / i\n", | |
| "ds['a_adj'] = a_adj\n", | |
| " \n", | |
| "print \"Sum of alpha_adj is:%1.4f\"%(a_adj.sum())\n", | |
| " \n", | |
| "# Now test if each p-value is less than its corresponding adjusted alpha value\n", | |
| "p_pass = ds['p_wt'] < a_adj\n", | |
| "r = np.sum(p_pass)\n", | |
| "ds['p_pass'] = p_pass\n", | |
| " \n", | |
| "# Now print \n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print ds\n", | |
| "print \"Number of test which p_value is below its adjusted alpha value is equal: %i, out of k groups: %i\\n\"%(r, k)\n", | |
| " \n", | |
| "# Plot\n", | |
| "#ds.plot(x='ref_val', y='ni_val', style='+', xlim=[0, 14], ylim=[0, 14])\n", | |
| "plt.plot(ds['ref_val'][p_pass], ds['ni_val'][p_pass], linestyle='', marker='o', fillstyle='full')\n", | |
| "#x = ds['ref_val'][p_pass]; xerr=ds['ref_err'][p_pass]; y = ds['ni_val'][p_pass]; yerr=ds['ni_err'][p_pass]\n", | |
| "x = ds['ref_val']; xerr=ds['ref_err']; y = ds['ni_val']; yerr=ds['ni_err']\n", | |
| "plt.errorbar(x, y, xerr=xerr, yerr=yerr, fmt='.')\n", | |
| " \n", | |
| "plt.plot([ds['ref_val'].min(), ds['ref_val'].max()], [ds['ref_val'].min(), ds['ref_val'].max()], linestyle='-', marker='')\n", | |
| "plt.show()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Sorting according to Student tests p-value column.\n", | |
| "\n", | |
| "alpha=0.05\n", | |
| "Number of test which p_value is below alpha=0.05 is equal: 31, out of k groups: 74\n", | |
| "\n", | |
| "Sum of alpha_adj is:0.2444\n", | |
| " res_num res_name ref_val ni_val ref_err ni_err t_w df_wt p_wt i a_adj p_pass\n", | |
| "46 54 K 3.4231 2.4151 0.3118 0.2667 54.9315 974.6007 0.0000 74 0.0007 True\n", | |
| "43 51 G 0.3551 0.4803 0.0898 0.0908 21.9233 997.8960 0.0000 73 0.0007 True\n", | |
| "17 21 D 3.0471 3.2792 0.3429 0.3338 10.8437 997.2775 0.0000 72 0.0007 True\n", | |
| "4 7 K 3.6071 3.4399 0.3086 0.3110 8.5325 997.9390 0.0000 71 0.0007 True\n", | |
| "65 76 K 0.4473 0.4036 0.0915 0.0853 7.8093 993.0682 0.0000 70 0.0007 True\n", | |
| "5 8 A 0.3116 0.2735 0.0778 0.0782 7.7274 997.9767 0.0000 69 0.0007 True\n", | |
| "24 28 Y 0.5842 0.6377 0.1093 0.1134 7.5970 996.6407 0.0000 68 0.0007 True\n", | |
| "63 74 I 2.0863 2.2506 0.3902 0.4002 6.5715 997.3646 0.0000 67 0.0007 True\n", | |
| "30 35 T 11.7861 11.4162 1.0125 0.9351 6.0017 991.7478 0.0000 66 0.0008 True\n", | |
| "25 29 S 4.3684 4.1923 0.5302 0.4736 5.5391 985.5221 0.0000 65 0.0008 True\n", | |
| "35 42 E 0.2774 0.3066 0.0823 0.0848 5.5225 997.0824 0.0000 64 0.0008 True\n", | |
| "62 73 Y 1.9633 1.9017 0.1902 0.1994 5.0054 995.7606 0.0000 63 0.0008 True\n", | |
| "12 15 L 5.5529 5.3983 0.4971 0.4814 4.9942 996.9733 0.0000 62 0.0008 True\n", | |
| "39 47 L 5.6266 5.5299 0.3325 0.3040 4.7993 990.1018 0.0000 61 0.0008 True\n", | |
| "31 36 V 2.0500 2.1265 0.2566 0.2599 4.6854 997.8317 0.0000 60 0.0008 True\n", | |
| "50 59 N 6.5254 6.3491 0.6629 0.6449 4.2613 997.2482 0.0000 59 0.0008 True\n", | |
| "37 45 G 4.2014 4.2943 0.3657 0.3651 4.0228 997.9965 0.0001 58 0.0009 True\n", | |
| "7 10 E 2.3086 2.2535 0.2592 0.2383 3.4984 991.0316 0.0005 57 0.0009 True\n", | |
| "44 52 K 2.6047 2.5367 0.3071 0.3128 3.4716 997.6581 0.0005 56 0.0009 True\n", | |
| "23 27 I 2.8222 2.9119 0.4411 0.4515 3.1769 997.4606 0.0015 55 0.0009 False\n", | |
| "2 5 F 3.1778 3.1154 0.3611 0.3382 2.8207 993.7576 0.0049 54 0.0009 False\n", | |
| "42 50 K 3.3476 3.2944 0.3263 0.3104 2.6386 995.4954 0.0085 53 0.0009 False\n", | |
| "8 11 E 2.0373 2.0077 0.1724 0.1845 2.6207 993.4684 0.0089 52 0.0010 False\n", | |
| "0 3 A 0.9102 0.8931 0.1074 0.1051 2.5511 997.5547 0.0109 51 0.0010 False\n", | |
| "56 66 K 0.4696 0.4532 0.1000 0.1039 2.5423 996.5058 0.0112 50 0.0010 False\n", | |
| "22 26 F 3.2010 3.1395 0.3796 0.3935 2.5159 996.7026 0.0120 49 0.0010 False\n", | |
| "53 62 K 2.9175 2.8702 0.2980 0.3130 2.4464 995.5906 0.0146 48 0.0010 False\n", | |
| "34 41 T 6.2170 6.1366 0.5592 0.5469 2.2975 997.5090 0.0218 47 0.0011 False\n", | |
| "33 39 I 2.5179 2.4588 0.3966 0.4248 2.2735 993.3182 0.0232 46 0.0011 False\n", | |
| "41 49 F 2.0202 1.9990 0.1612 0.1531 2.1390 995.3742 0.0327 45 0.0011 False\n", | |
| "40 48 D 0.3844 0.3736 0.0866 0.0849 1.9811 997.6254 0.0479 44 0.0011 False\n", | |
| "47 56 D 4.1629 4.1118 0.4188 0.4173 1.9354 997.9865 0.0532 43 0.0012 False\n", | |
| "59 69 A 0.3263 0.3370 0.0888 0.0936 1.8525 995.2579 0.0643 42 0.0012 False\n", | |
| "52 61 L 8.6756 8.6028 0.6759 0.6578 1.7256 997.2639 0.0847 41 0.0012 False\n", | |
| "32 37 G 3.7482 3.7869 0.3447 0.3718 1.7053 992.3339 0.0885 40 0.0013 False\n", | |
| "21 25 L 4.5674 4.5344 0.3136 0.3040 1.6913 997.0348 0.0911 39 0.0013 False\n", | |
| "55 64 T 9.0191 9.0740 0.6389 0.7106 1.2848 986.9252 0.1992 38 0.0013 False\n", | |
| "64 75 D 5.6607 5.6956 0.4385 0.4486 1.2409 997.4801 0.2149 37 0.0014 False\n", | |
| "10 13 K 6.4892 6.4528 0.4842 0.4911 1.1821 997.8002 0.2374 36 0.0014 False\n", | |
| "72 85 G 3.3032 3.3274 0.3229 0.3284 1.1748 997.7093 0.2403 35 0.0014 False\n", | |
| "67 80 L 2.0070 1.9898 0.2460 0.2240 1.1541 989.3084 0.2487 34 0.0015 False\n", | |
| "26 30 H 4.0548 4.0385 0.2267 0.2302 1.1258 997.7630 0.2605 33 0.0015 False\n", | |
| "19 23 E 0.8430 0.8331 0.1478 0.1302 1.1150 982.3881 0.2651 32 0.0016 False\n", | |
| "20 24 M 2.0799 2.0659 0.1961 0.2061 1.0980 995.5778 0.2725 31 0.0016 False\n", | |
| "73 86 I 3.6427 3.6645 0.2926 0.3391 1.0903 977.0566 0.2758 30 0.0017 False\n", | |
| "58 68 D 0.8649 0.8598 0.0753 0.0751 1.0836 997.9932 0.2788 29 0.0017 False\n", | |
| "51 60 E 5.3780 5.4098 0.4645 0.4704 1.0743 997.8398 0.2829 28 0.0018 False\n", | |
| "57 67 E 6.2482 6.2171 0.4581 0.4724 1.0591 997.0567 0.2898 27 0.0019 False\n", | |
| "68 81 K 0.3370 0.3311 0.0965 0.0911 0.9940 994.6705 0.3204 26 0.0019 False\n", | |
| "11 14 H 5.7102 5.6776 0.5168 0.5678 0.9493 989.3082 0.3427 25 0.0020 False\n", | |
| "54 63 G 9.5402 9.6023 1.1561 1.1315 0.8579 997.5380 0.3911 24 0.0021 False\n", | |
| "3 6 D 3.9970 3.9803 0.3078 0.3160 0.8491 997.3135 0.3960 23 0.0022 False\n", | |
| "38 46 M 3.8779 3.8655 0.2470 0.2300 0.8258 992.9296 0.4091 22 0.0023 False\n", | |
| "16 20 A 2.0785 2.0677 0.2218 0.1968 0.8140 984.0998 0.4158 21 0.0024 False\n", | |
| "28 32 K 6.3326 6.3038 0.5917 0.6155 0.7538 996.4601 0.4511 20 0.0025 False\n", | |
| "27 31 Y 2.0080 2.0185 0.2374 0.2640 0.6602 986.9713 0.5093 19 0.0026 False\n", | |
| "15 18 K 2.0961 2.1022 0.1627 0.1446 0.6333 984.3236 0.5267 18 0.0028 False\n", | |
| "13 16 K 1.8576 1.8662 0.2431 0.2169 0.5865 985.2701 0.5576 17 0.0029 False\n", | |
| "69 82 K 3.6069 3.6170 0.2957 0.2958 0.5432 997.9999 0.5871 16 0.0031 False\n", | |
| "36 43 R 4.6161 4.6029 0.3958 0.3724 0.5419 994.3078 0.5880 15 0.0033 False\n", | |
| " ... ... ... ... ... ... ... ... ... ... ... ...\n", | |
| "\n", | |
| "[74 rows x 12 columns]\n", | |
| "Number of test which p_value is below its adjusted alpha value is equal: 19, out of k groups: 74\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5cf1b50>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 15 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "t-test - Difference Between Matched Pairs" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions \n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import matplotlib.mlab as mlab\n", | |
| "#from matplotlib import style\n", | |
| "#style.use('ggplot')\n", | |
| " \n", | |
| "# Define data\n", | |
| "res_num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, \n", | |
| " 29, 30, 31, 32, 34, 35, 36, 37, 39, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58,\n", | |
| " 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 80, 81, 82, 83, 84, 85, 86]\n", | |
| " \n", | |
| "res_name = ['A', 'E', 'F', 'D', 'K', 'A', 'A', 'E', 'E', 'V', 'K', 'H', 'L', 'K', 'T', 'K', 'A', 'D',\n", | |
| " 'E', 'E', 'M', 'L', 'F', 'I', 'Y', 'S', 'H', 'Y', 'K', 'A', 'T', 'V', 'G', 'I', 'T', 'E',\n", | |
| " 'R', 'G', 'M', 'L', 'D', 'F', 'K', 'G', 'K', 'A', 'K', 'D', 'A', 'W', 'N', 'E', 'L', 'K',\n", | |
| " 'G', 'T', 'K', 'E', 'D', 'A', 'K', 'A', 'Y', 'I', 'D', 'K', 'E', 'L', 'K', 'K', 'K', 'Y',\n", | |
| " 'G', 'I']\n", | |
| " \n", | |
| "ref_val = [ 0.91024373, 3.60925171, 3.17784106, 3.99700115, 3.60711608,\n", | |
| " 0.31163906, 5.67501257, 2.30855341, 2.03726973, 5.77701703,\n", | |
| " 6.48923706, 5.71021757, 5.55290274, 1.85762676, 5.61780451,\n", | |
| " 2.09607925, 2.07852273, 3.04713421, 4.11137, 0.84296045,\n", | |
| " 2.07985013, 4.56743506, 3.20100931, 2.82223807, 0.58422802,\n", | |
| " 4.36838362, 4.05477225, 2.00800295, 6.33255709, 11.22422505,\n", | |
| " 11.78607978, 2.05001627, 3.74822605, 2.51791866, 6.21697472,\n", | |
| " 0.27736641, 4.61611892, 4.2013546, 3.87794532, 5.62661815,\n", | |
| " 0.3843826, 2.02021317, 3.34757423, 0.35509272, 2.60472753,\n", | |
| " 6.58254311, 3.42312234, 4.16294909, 1.93473179, 2.07526696,\n", | |
| " 6.5253814, 5.37803185, 8.67561747, 2.91750516, 9.54018383,\n", | |
| " 9.01911166, 0.46962397, 6.24824717, 0.86491637, 0.32630132,\n", | |
| " 3.30981738, 4.11945011, 1.96333298, 2.08634951, 5.66074641,\n", | |
| " 0.44726196, 5.33913566, 2.00701002, 0.33701417, 3.60688253,\n", | |
| " 3.57234264, 5.37404428, 3.30321923, 3.64269822]\n", | |
| " \n", | |
| "ni_val = [ 0.89309963, 3.61292809, 3.11542615, 3.98025178, 3.43994938,\n", | |
| " 0.27353119, 5.67418377, 2.25346994, 2.00767747, 5.76508857,\n", | |
| " 6.45277677, 5.67762211, 5.39834515, 1.86617222, 5.62091689,\n", | |
| " 2.10224377, 2.06772649, 3.27917723, 4.10094926, 0.83313694,\n", | |
| " 2.06588161, 4.53439958, 3.13949212, 2.91191774, 0.63773427,\n", | |
| " 4.19227403, 4.03850763, 2.01848384, 6.30377425, 11.22499578,\n", | |
| " 11.41615569, 2.12654154, 3.78688735, 2.45883007, 6.13661007,\n", | |
| " 0.3065527, 4.60294933, 4.2943232, 3.86548123, 5.52992443,\n", | |
| " 0.3736384, 1.9989515, 3.29443061, 0.48030984, 2.53667385,\n", | |
| " 6.59356022, 2.41508129, 4.11177612, 1.93137301, 2.07391903,\n", | |
| " 6.34913991, 5.40979641, 8.60283467, 2.87022147, 9.60225012,\n", | |
| " 9.07401983, 0.45323177, 6.21707616, 0.85976072, 0.3369907,\n", | |
| " 3.30338844, 4.12188801, 1.90165284, 2.2506127, 5.69555752,\n", | |
| " 0.40358004, 5.3478761, 1.98983745, 0.3311139, 3.61704454,\n", | |
| " 3.57329857, 5.35982765, 3.32741775, 3.66454006]\n", | |
| " \n", | |
| "ref_err = [ 0.10737387, 0.2988302, 0.36111907, 0.30777037, 0.30855783, 0.07778596,\n", | |
| " 0.45465738, 0.25918179, 0.17240042, 0.44896877, 0.48420278, 0.51684491,\n", | |
| " 0.49710594, 0.24309939, 0.51536974, 0.16272787, 0.22181091, 0.34287047,\n", | |
| " 0.36452403, 0.14781816, 0.19613379, 0.31360589, 0.37957875, 0.44111112,\n", | |
| " 0.10928475, 0.53023624, 0.22665547, 0.23738887, 0.59174888, 0.82198636,\n", | |
| " 1.01251054, 0.25656179, 0.34466063, 0.39659081, 0.55917821, 0.08228563,\n", | |
| " 0.39582688, 0.36574805, 0.24701975, 0.33248413, 0.08657965, 0.16115005,\n", | |
| " 0.32634004, 0.08984606, 0.30706413, 0.41415345, 0.31182309, 0.41883343,\n", | |
| " 0.10377392, 0.20621387, 0.66285639, 0.46451524, 0.67587898, 0.29799412,\n", | |
| " 1.15608672, 0.63892129, 0.09995497, 0.45812039, 0.07532633, 0.08880949,\n", | |
| " 0.29970947, 0.3325626, 0.19016293, 0.39020801, 0.43845404, 0.09150572,\n", | |
| " 0.45843908, 0.24604857, 0.09652762, 0.29571491, 0.28102906, 0.53560677,\n", | |
| " 0.32288339, 0.29264218]\n", | |
| " \n", | |
| "ni_err = [ 0.10512885, 0.27868399, 0.33824695, 0.31595396, 0.31098062, 0.07816262,\n", | |
| " 0.43676873, 0.23828771, 0.18446522, 0.44976116, 0.49110456, 0.56778965,\n", | |
| " 0.48140169, 0.21687251, 0.48332244, 0.14455428, 0.1968443, 0.33376286,\n", | |
| " 0.33065818, 0.13022267, 0.20605896, 0.30399551, 0.39353, 0.4514909,\n", | |
| " 0.11339814, 0.47358066, 0.23017618, 0.26396182, 0.61548713, 0.84315396,\n", | |
| " 0.93507, 0.25991585, 0.3717674, 0.42482049, 0.54690669, 0.08482096,\n", | |
| " 0.37239827, 0.36506568, 0.22995557, 0.30400334, 0.08491799, 0.15307524,\n", | |
| " 0.31036164, 0.09076805, 0.31280226, 0.41421353, 0.26672792, 0.4172986,\n", | |
| " 0.10581189, 0.18639669, 0.64489927, 0.47043783, 0.65775911, 0.31303265,\n", | |
| " 1.13146954, 0.7106016, 0.10390343, 0.47243515, 0.07512938, 0.09360014,\n", | |
| " 0.27862192, 0.33378593, 0.19940531, 0.40018419, 0.44858074, 0.08526919,\n", | |
| " 0.46592748, 0.22397215, 0.09109549, 0.29582885, 0.25223517, 0.5244558,\n", | |
| " 0.32844266, 0.33914167]\n", | |
| " \n", | |
| "# Create data table\n", | |
| "data = np.array([res_num, res_name, ref_val, ni_val, ref_err, ni_err])\n", | |
| "data = np.core.records.fromarrays(data, names='res_num, res_name, ref_val, ni_val, ref_err, ni_err', formats = 'i8, S1, f8, f8, f8, f8')\n", | |
| " \n", | |
| "# Calculate difference\n", | |
| "d = data['ref_val'] - data['ni_val']\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'd', d, dtypes=data['ref_val'].dtype, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Calculate the average of the differences\n", | |
| "d_avg = np.average(data['d'])\n", | |
| "# This is equal the difference between the mean of each group\n", | |
| "X1_minus_X2 = np.average(data['ref_val']) - np.average(data['ni_val'])\n", | |
| " \n", | |
| "print \"Is the mean of differences equal ?\", np.allclose(d_avg, X1_minus_X2), d_avg\n", | |
| " \n", | |
| "SD_d = np.std(data['d'], ddof=1)\n", | |
| "n = len(d)\n", | |
| "print \"The summed variance of differences are\", SD_d**2*(n-1)\n", | |
| "print \"The standard deviation of the differences are\", SD_d\n", | |
| " \n", | |
| "# Test that: The population distribution of paired differences (i.e., the variable d) is normal.\n", | |
| "nbins, bins, patches = plt.hist(data['d'], normed=True, histtype='stepfilled')\n", | |
| "plt.setp(patches, 'facecolor', 'g', 'alpha', 0.75)\n", | |
| "# add a line showing the expected distribution\n", | |
| "y = mlab.normpdf( bins, d_avg, SD_d)\n", | |
| "plt.plot(bins, y, 'k--', linewidth=1.5)\n", | |
| "plt.title(\"Histogram of differences\")\n", | |
| " \n", | |
| "# Compute the standard error (SE) of the sampling distribution of d.\n", | |
| "SE = SD_d / np.sqrt(n)\n", | |
| "print \"The standard error (SE) of the sampling distribution of d.\", SE \n", | |
| " \n", | |
| "# Degrees of freedom. The degrees of freedom (DF) is: DF = n - 1 .\n", | |
| "dof = n - 1\n", | |
| "print \"The degree of fredom is:\", dof \n", | |
| " \n", | |
| "# Test statistic. The test statistic is a t-score (t) defined by the following equation.\n", | |
| "# D is the hypothesized difference between population means, and SE is the standard error.\n", | |
| "D = 0\n", | |
| "t = (d_avg - D) / SE\n", | |
| "print \"The tests statistics are t=\", t \n", | |
| " \n", | |
| "p_one_tailed = stats.distributions.t.sf(np.abs(t), dof)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| " \n", | |
| "print 'The two-tailed test p-value is approximately %1.3f and the one-tailed p-value is approximately %1.3f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| "# Confidence\n", | |
| "confidence = 0.95\n", | |
| "two_tailed_aplha = 1.00 - confidence\n", | |
| "one_tailed_aplha = two_tailed_aplha/2\n", | |
| "test = p_two_tailed > two_tailed_aplha\n", | |
| "if test:\n", | |
| " print \"Since the P-value (%1.3f) is greater than the significance level (%1.3f), we cannot reject the null hypothesis.\"%(p_two_tailed, two_tailed_aplha)\n", | |
| "t_crit = stats.distributions.t.isf(one_tailed_aplha, dof)\n", | |
| "print 'The critical t value for confidence=%1.2f is equal:%1.3f'%(confidence, t_crit)\n", | |
| " \n", | |
| "d_avg_min = d_avg + t_crit * SE\n", | |
| "d_avg_max = d_avg - t_crit * SE\n", | |
| "print \"The %1.2f confidence interval of the average deviation=%3.3f is between %3.3f to %3.3f\" %(confidence, d_avg, d_avg_min, d_avg_max) \n", | |
| " \n", | |
| "# Make consistency test. Check that the absolute difference is less than the sum of errors\n", | |
| "sum_errors = data['ref_err'] + data['ni_err']\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'sum_err', sum_errors, dtypes=data['ref_val'].dtype, usemask=False, asrecarray=True)\n", | |
| "consistency = np.abs(d) < sum_errors\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'consistency', consistency, dtypes=data['ref_val'].dtype, usemask=False, asrecarray=True)\n", | |
| "print \"The number of consistent points is %i out of %i points\"%(np.sum(consistency), n)\n", | |
| " \n", | |
| "# Make a deviation plot\n", | |
| "plt.figure()\n", | |
| "plt.plot(range(n), data['d'], linestyle='', marker='o', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg, linestyle='-', marker='', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg_min, linestyle='--', marker='', fillstyle='full')\n", | |
| "plt.plot(range(n), np.ones(n)*d_avg_max, linestyle='--', marker='', fillstyle='full')\n", | |
| "plt.title(\"Sample index of differences\")\n", | |
| " \n", | |
| "# Make a correlation plot\n", | |
| "plt.figure()\n", | |
| "plt.plot(data['ref_val'], data['ni_val'], linestyle='', marker='o', fillstyle='full')\n", | |
| "# Ref line\n", | |
| "x = np.linspace(data['ref_val'].min(), data['ref_val'].max(), num=50)\n", | |
| "plt.plot(x, x, linestyle='-', marker='')\n", | |
| "plt.title(\"Correlation plot\")\n", | |
| " \n", | |
| "# Print by pandas\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "#pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print data_pd\n", | |
| " \n", | |
| "#plt.show()\n", | |
| "for i in plt.get_fignums():\n", | |
| " plt.figure(i)\n", | |
| " plt.savefig('figure%d.png' % i)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Is the mean of differences equal ? True 0.0286741840541\n", | |
| "The summed variance of differences are 1.4053511685\n", | |
| "The standard deviation of the differences are 0.138749363494\n", | |
| "The standard error (SE) of the sampling distribution of d. 0.0161292858834\n", | |
| "The degree of fredom is: 73\n", | |
| "The tests statistics are t= 1.77777145631\n", | |
| "The two-tailed test p-value is approximately 0.080 and the one-tailed p-value is approximately 0.040\n", | |
| "Since the P-value (0.080) is greater than the significance level (0.050), we cannot reject the null hypothesis.\n", | |
| "The critical t value for confidence=0.95 is equal:1.993\n", | |
| "The 0.95 confidence interval of the average deviation=0.029 is between 0.061 to -0.003\n", | |
| "The number of consistent points is 73 out of 74 points\n", | |
| " res_num res_name ref_val ni_val ref_err ni_err d sum_err consistency\n", | |
| "0 3 A 0.9102 0.8931 0.1074 0.1051 0.0171 0.2125 1.0000\n", | |
| "1 4 E 3.6093 3.6129 0.2988 0.2787 -0.0037 0.5775 1.0000\n", | |
| "2 5 F 3.1778 3.1154 0.3611 0.3382 0.0624 0.6994 1.0000\n", | |
| "3 6 D 3.9970 3.9803 0.3078 0.3160 0.0167 0.6237 1.0000\n", | |
| "4 7 K 3.6071 3.4399 0.3086 0.3110 0.1672 0.6195 1.0000\n", | |
| "5 8 A 0.3116 0.2735 0.0778 0.0782 0.0381 0.1559 1.0000\n", | |
| "6 9 A 5.6750 5.6742 0.4547 0.4368 0.0008 0.8914 1.0000\n", | |
| "7 10 E 2.3086 2.2535 0.2592 0.2383 0.0551 0.4975 1.0000\n", | |
| "8 11 E 2.0373 2.0077 0.1724 0.1845 0.0296 0.3569 1.0000\n", | |
| "9 12 V 5.7770 5.7651 0.4490 0.4498 0.0119 0.8987 1.0000\n", | |
| "10 13 K 6.4892 6.4528 0.4842 0.4911 0.0365 0.9753 1.0000\n", | |
| "11 14 H 5.7102 5.6776 0.5168 0.5678 0.0326 1.0846 1.0000\n", | |
| "12 15 L 5.5529 5.3983 0.4971 0.4814 0.1546 0.9785 1.0000\n", | |
| "13 16 K 1.8576 1.8662 0.2431 0.2169 -0.0085 0.4600 1.0000\n", | |
| "14 17 T 5.6178 5.6209 0.5154 0.4833 -0.0031 0.9987 1.0000\n", | |
| "15 18 K 2.0961 2.1022 0.1627 0.1446 -0.0062 0.3073 1.0000\n", | |
| "16 20 A 2.0785 2.0677 0.2218 0.1968 0.0108 0.4187 1.0000\n", | |
| "17 21 D 3.0471 3.2792 0.3429 0.3338 -0.2320 0.6766 1.0000\n", | |
| "18 22 E 4.1114 4.1009 0.3645 0.3307 0.0104 0.6952 1.0000\n", | |
| "19 23 E 0.8430 0.8331 0.1478 0.1302 0.0098 0.2780 1.0000\n", | |
| "20 24 M 2.0799 2.0659 0.1961 0.2061 0.0140 0.4022 1.0000\n", | |
| "21 25 L 4.5674 4.5344 0.3136 0.3040 0.0330 0.6176 1.0000\n", | |
| "22 26 F 3.2010 3.1395 0.3796 0.3935 0.0615 0.7731 1.0000\n", | |
| "23 27 I 2.8222 2.9119 0.4411 0.4515 -0.0897 0.8926 1.0000\n", | |
| "24 28 Y 0.5842 0.6377 0.1093 0.1134 -0.0535 0.2227 1.0000\n", | |
| "25 29 S 4.3684 4.1923 0.5302 0.4736 0.1761 1.0038 1.0000\n", | |
| "26 30 H 4.0548 4.0385 0.2267 0.2302 0.0163 0.4568 1.0000\n", | |
| "27 31 Y 2.0080 2.0185 0.2374 0.2640 -0.0105 0.5014 1.0000\n", | |
| "28 32 K 6.3326 6.3038 0.5917 0.6155 0.0288 1.2072 1.0000\n", | |
| "29 34 A 11.2242 11.2250 0.8220 0.8432 -0.0008 1.6651 1.0000\n", | |
| "30 35 T 11.7861 11.4162 1.0125 0.9351 0.3699 1.9476 1.0000\n", | |
| "31 36 V 2.0500 2.1265 0.2566 0.2599 -0.0765 0.5165 1.0000\n", | |
| "32 37 G 3.7482 3.7869 0.3447 0.3718 -0.0387 0.7164 1.0000\n", | |
| "33 39 I 2.5179 2.4588 0.3966 0.4248 0.0591 0.8214 1.0000\n", | |
| "34 41 T 6.2170 6.1366 0.5592 0.5469 0.0804 1.1061 1.0000\n", | |
| "35 42 E 0.2774 0.3066 0.0823 0.0848 -0.0292 0.1671 1.0000\n", | |
| "36 43 R 4.6161 4.6029 0.3958 0.3724 0.0132 0.7682 1.0000\n", | |
| "37 45 G 4.2014 4.2943 0.3657 0.3651 -0.0930 0.7308 1.0000\n", | |
| "38 46 M 3.8779 3.8655 0.2470 0.2300 0.0125 0.4770 1.0000\n", | |
| "39 47 L 5.6266 5.5299 0.3325 0.3040 0.0967 0.6365 1.0000\n", | |
| "40 48 D 0.3844 0.3736 0.0866 0.0849 0.0107 0.1715 1.0000\n", | |
| "41 49 F 2.0202 1.9990 0.1612 0.1531 0.0213 0.3142 1.0000\n", | |
| "42 50 K 3.3476 3.2944 0.3263 0.3104 0.0531 0.6367 1.0000\n", | |
| "43 51 G 0.3551 0.4803 0.0898 0.0908 -0.1252 0.1806 1.0000\n", | |
| "44 52 K 2.6047 2.5367 0.3071 0.3128 0.0681 0.6199 1.0000\n", | |
| "45 53 A 6.5825 6.5936 0.4142 0.4142 -0.0110 0.8284 1.0000\n", | |
| "46 54 K 3.4231 2.4151 0.3118 0.2667 1.0080 0.5786 0.0000\n", | |
| "47 56 D 4.1629 4.1118 0.4188 0.4173 0.0512 0.8361 1.0000\n", | |
| "48 57 A 1.9347 1.9314 0.1038 0.1058 0.0034 0.2096 1.0000\n", | |
| "49 58 W 2.0753 2.0739 0.2062 0.1864 0.0013 0.3926 1.0000\n", | |
| "50 59 N 6.5254 6.3491 0.6629 0.6449 0.1762 1.3078 1.0000\n", | |
| "51 60 E 5.3780 5.4098 0.4645 0.4704 -0.0318 0.9350 1.0000\n", | |
| "52 61 L 8.6756 8.6028 0.6759 0.6578 0.0728 1.3336 1.0000\n", | |
| "53 62 K 2.9175 2.8702 0.2980 0.3130 0.0473 0.6110 1.0000\n", | |
| "54 63 G 9.5402 9.6023 1.1561 1.1315 -0.0621 2.2876 1.0000\n", | |
| "55 64 T 9.0191 9.0740 0.6389 0.7106 -0.0549 1.3495 1.0000\n", | |
| "56 66 K 0.4696 0.4532 0.1000 0.1039 0.0164 0.2039 1.0000\n", | |
| "57 67 E 6.2482 6.2171 0.4581 0.4724 0.0312 0.9306 1.0000\n", | |
| "58 68 D 0.8649 0.8598 0.0753 0.0751 0.0052 0.1505 1.0000\n", | |
| "59 69 A 0.3263 0.3370 0.0888 0.0936 -0.0107 0.1824 1.0000\n", | |
| " ... ... ... ... ... ... ... ... ...\n", | |
| "\n", | |
| "[74 rows x 9 columns]" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAEKCAYAAAAGvn7fAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYVPXCB/DvsLigxiKrIShqyiKCKGiijpaammHqtbDA\ntciLS/hy732wRe3x9vJmRrZcw26lXdDrVqmkoV4bNxIkd8USEgEVZZFFFtl+7x/lXEaWGWBmzjB8\nP88zz+PM+XHOF5z5cvjNOXNkQggBIiIyGiZSByAiIu1isRMRGRkWOxGRkWGxExEZGRY7EZGRYbET\nERkZFjvBy8sLx44dkzqGpI4cOYIxY8agR48eOH/+vNrxcrkcX3zxBQAgPj4ekyZNUi47e/YsJk+e\nDEtLS+zduxdFRUWYN28e7Ozs8Je//EVn3wPRQyx2I9enTx/85z//UXls8+bNGD16tPL+pUuXMGbM\nmGbXk5mZCRMTE9TV1ekkp9TeffddLFiwAKWlpRgyZIja8TKZDDKZDADw0ksvITExUbns008/xYgR\nI1BcXIznnnsOCQkJuH37Nm7evIl169bp7HsgeojFbuTqF5A26Op8ttraWp2sVxNCCJw8eRKjRo3S\nyvpOnjyJJ598Unn/xIkTGDZsGDp16tTiddXU1GglE3UsLPYO6NGi79OnD44cOQIAuHLlCmbMmAF7\ne3s4OjoiMjISAJR79FZWVujRoweSk5MBAHv37sWECRMwePBgfPbZZygvL1eu96effsLEiRPh6uqK\njz76SGU7q1evRnBwMBYvXgwnJyds2bIFp0+fxsiRI2FtbY2RI0fik08+USk2ExMT/Otf/4KPjw8e\nf/xxxMTEIDc3F5MmTYKzszNWrVrVbBE2lvXBgwfo0aMHHjx4AF9fXwwYMKDRr718+TJmz56NXr16\n4Y033lBZVv8voH79+uHXX39FUFAQevTogTlz5uDLL7/E+++/jx49eii//wMHDuC5557DwIEDERMT\ng/v37wP4719GO3fuhJeXFyZMmADg918OL730Evr27Ys1a9YgPz9f5ecSHx8PHx8f9O/fHzExMSr5\nfvzxR7z88suwsbGBp6cnzp49CwC4d+8ePvzwQ3h6emLy5Mk4ePCg8msefR78z//8T5M/VzJAgoxa\nnz59xOHDh1Ue++qrr0RgYKDKmP/85z9CCCFmzZolPvroI1FVVSXKysrEqVOnhBBCZGZmCplMJmpr\n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\ns1cAAAAASUVORK5CYII=\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x5e11c10>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x65520d0>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAEKCAYAAADkYmWmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYlXX+//Hn4aDAlFOMZpjLZLhvoQZ6ZSqagt/IaJlG\nLZdEJ0cbXGpy1HQ8X53qWzaVaGq5lpZTv/pmjicRZwoxy63Rb4XmAi1a46S4oQEqfH5/IMeDLMrh\ncDZej+viuuDmvu/zvqneva/3/VksxhiDiIj4pSBvByAiIq5TEhcR8WNK4iIifkxJXETEjymJi4j4\nMSVxERE/piQufm3FihX07NnT5evvuusuVq5c6caIrk5QUBDZ2dke/1wJPEriUm3r16+nd+/e3HDD\nDURERHDXXXexZcsWb4dVhs1mY9iwYaWOffjhh2WO+ZLq/k9KAp+SuFTL4sWLefjhh+nevTtbt27l\nwIEDJCUl8fbbb1f5XhcuXChzrLCw0B1higQuI+Ki06dPm/DwcPPMM89UeM758+fNypUrTbdu3Uz3\n7t3NqlWrzPnz540xxnz88cemcePGZuHChaZly5Zm2LBhxmazmcGDB5vf//73JiIiwixdutT8/PPP\nZsmSJSY6Otr06NHDvPPOO6aoqMgYY8zy5cvNHXfc4fi88ePHm6ZNm5qGDRuaRx991OzevdsYY8z6\n9etN3bp1TZ06dcy1115roqKijDHG9O7d2yxZssRx/QcffGD69etnOnToYBYuXGjOnj1rjDHmm2++\nMRaLxbz33numTZs2pmPHjmblypUVPveIESPMhAkTzH333WduvPFGM3nyZHPs2DHH7y0Wi8nKyjLG\nGHP27FmzYMEC06FDB9O/f3+zdu1aY4wxe/bsMaGhocZqtZprr73WhIeHX/0/HKk1lMTFZZ9++qmx\nWCzmq6++qvCcZcuWmU6dOpkdO3aYzz//3ERFRZnly5cbY4qTeHBwsElKSjL//ve/TV5enpk5c6ap\nU6eOSUlJMXl5eSYvL89MmjTJDB482HzzzTdm9+7dpkOHDiYtLc0YUzaJr1q1yhw/ftycOHHCPPnk\nk6ZHjx6O39lsNjNs2LBS8cXGxpqlS5caY4z56KOPTLNmzczGjRvN/v37zZ133mlmzpxpjLmUxAcN\nGmS+//57s2HDBhMSEmLy8vLKfe4RI0aYa665xrz++uvmhx9+MIMHDzaDBw92/N45if/5z382ffr0\nMfv27TP//Oc/zc0332w+/vhjY4wxK1asKPV8IpdTO0VcdujQIerVq0f79u0rPGfNmjU89thj3Hbb\nbXTp0oXHHnuM999/3/H7wsJCbDYbERERhIaGAtC0aVOSk5MJDQ0lJCSE999/n+eff56bb76ZW2+9\nlVGjRrFmzZpyP+/hhx8mPDyc66+/nhkzZrB7926OHTsGgCkuWiqN9eGHH6Zfv360bNmSKVOmlIoV\nYPLkyTRt2pS4uDhuvvlm0tPTK7xfly5dGD58ODfddBP//d//zYYNGygqKipz3gcffMCUKVNo1aoV\nffv25eGHH3Z8bmXxioB64lINTZs2JTc3l8zMzArP+fTTT+natavj565du7J582bHzzfeeCNNmzYt\ndU23bt0c33/99dd8//33dOrUifDwcMLDw5k5c2aFL05XrFhBQkICN9xwA82aNSMvL48vv/zyqp6n\nvFi//PJLcnNzHceioqIc3zdq1Igff/yx3HtZLBZuvfVWx8+tWrXi/Pnz7N27t9R5ubm5fPHFF5X+\njUQqoyQuLuvQoQPh4eGsXbu2wnN69OjBzp07HT/v3LmTXr16OX4ODg4udb7FYsFqtTp+bt26NU2a\nNGHPnj2cOHGCEydOcOrUKXbv3l3msw4dOsTjjz/OtGnT+O677/j+++8JCwtzVLPBwcGVVrblxdqx\nY0fq1atXyV+hfMaYUjHu27ePOnXq0LZt21Ln1atXj06dOlX4N7JararGpVJK4uKyevXq8dxzz/HX\nv/6VadOmkZWVxenTp3n//feZMGECAImJiSxatIjPP/+cXbt2sWjRIu69994K73l5wgoKCmLQoEH8\n6U9/Yu/evRQVFZGVlUVGRkaZa48ePYoxhoiICHJzc5k2bRoFBQWO33ft2pU9e/aUOuYsMTGR1atX\n89FHH3Hw4EHmzJnDfffdV+nfoLIEu2vXLt58801+/PFHZs2axYABAwgKKvufXGJiInPmzGH//v2k\np6ezevVqx9+oa9euHDhwgDNnzlQah9RewVc+RaRio0ePpkmTJjz77LO89tprBAcHEx0dzVNPPQXA\n0KFDsVqtjBs3DovFwsSJExk8eLDjeovFUup+FoulzDGbzcbbb7/N2LFj2b17N7fccgtTpkwpc36X\nLl0YN24cffv2JTQ0lMcff7xUq6Z37960atWK5s2bc9NNN5WqfgFiY2N56aWXeOaZZzhy5Ahjx47l\n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\nryTxUm0T3gAiIDzp4rjvc7D0EcgpAKxERk4jOXmAN8IUEfF5Hk/idnsG6elbgUFAGFj+A9HXQmwM\nbJ7qGHlitSbSr98MkpMH6KWliEgFPNoTt9szGDr0ZU6erA8sdpp1eRDW/A/kDHWcGx4+guPHX6+J\n0EREfFZVe+IenbGZkpLGyZN1imddRr8Co7tdnHX5HeTsK3Vu8+bXejI0ERG/5NF2SkFBMBAGAx+F\nG/bAsk+cZl1eGvsdETGJWbMGeTI0ERG/5HIlnpGRQdu2bWnZsiXz5s27qmtCQi4AeZA+E5Ztdkrg\nAJ8TGjqcLl0eY8mS+9QHFxG5Ci4n8QkTJvDqq6/yj3/8g1deeYVjx45d8Zrx4+OwWk/D6adLTZuH\n0YSGnuXdd0fz+eev+EUCT09P93YINSqQny+Qnw30fLWNS0n81KlTAPTq1Ytf//rXxMXFsW3btite\nl5DQi+nTB2K17gMGUjxC5QGuv/44775r84vkXSLQ/0UK5OcL5GcDPV9t41JPfMeOHbRp08bxc7t2\n7di6dSsJCQlXvNZmG0d0dAfmzdtIfn7xRJ7k5P5+lcBFRHyFVyb7JCT0UtIWEXEH44KTJ0+aqKgo\nx89/+MMfzLp160qdExkZaQB96Utf+tJXFb4iIyOrlI9dqsSvu+46oHiESrNmzdi4cSMzZ84sdc7B\ngwddubWIiFSBy+2Ul19+mTFjxnD+/HnGjx9PgwYN3BmXiIhchRqbdi8iIjWvRqbduzIRyF8cOnSI\nPn360L59e2JjY3nrrbe8HZLbFRYW0rlzZwYOHOjtUNzu7NmzjBgxglatWjlGVQWSxYsXc/vtt9O1\na1cmTpzo7XCqLSkpiRtvvJGOHTs6juXm5pKYmEizZs249957OXPmjBcjrJ7ynu/JJ5+kbdu2dOnS\nhYkTJ5KXl1fpPWokibsyEchf1KlTh5deeonMzEzeffddpk+fTm5urrfDcqu5c+fSrl07LBaLt0Nx\nu5kzZ9KsWTO++OILvvjiC9q2bevtkNzm+PHjPPPMM2zcuJEdO3awf/9+NmzY4O2wqmXkyJGkpqaW\nOrZw4UKaNWvGgQMHaNKkCYsWLfJSdNVX3vPFxcWRmZnJzp07OXv27BULRbcncVcnAvmLiIgIoqKi\nAGjQoAHt27dn586dXo7KfQ4fPsyHH37I6NGjq7SSmr/4xz/+wbRp0wgNDSU4ONjxkj4QhIWFYYzh\n1KlT5OXl8fPPPxMeHu7tsKqlZ8+eZZ5h+/btjBo1ipCQEJKSkvw6v5T3fP379ycoKIigoCDi4+PZ\ntGlTpfdwexKvaCJQIDp48CCZmZnExMR4OxS3mTRpEnPmzCEoyKMLXHrE4cOHyc/PZ+zYsXTr1o3n\nnnuO/Px8b4flNmFhYSxcuJCbb76ZiIgIevToEVD/bpZwzjFt2rRh+/btXo6o5ixevPiKbc3A+y/V\nQ3Jzcxk0aBAvvfQS11xzjbfDcYt169bRsGFDOnfuHJBVeH5+Pvv37+eBBx4gPT2dzMxM3nnnHW+H\n5TZHjx5l7Nix7Nmzh2+//ZbPPvsMu93u7bDcLhD/3SzPrFmzqFevHg8++GCl57k9iUdHR/P11187\nfs7MzKR79+7u/hivOn/+PA888ADDhg0jMTHR2+G4zaeffsratWtp3rw5Q4YM4aOPPmL48OHeDstt\nWrRoQevWrRk4cCBhYWEMGTKE9evXezsst9m+fTvdu3enRYsW1K9fnwcffJCMjAxvh+V20dHR7N27\nF4C9e/cSHR3t5Yjcb8WKFWzYsIFVq1Zd8Vy3J3HniUDffvstGzdupFu3bu7+GK8xxjBq1Cg6dOgQ\nEG//nT3zzDMcOnSIb775hr/97W/07duXN954w9thuVXLli3Ztm0bRUVF2O12+vXr5+2Q3KZnz57s\n3LmT48ePU1BQwPr164mLi/N2WG7XrVs3li1bRl5eHsuWLQu4IjE1NZU5c+awdu1aQkNDr3yBK9Pu\nryQ9Pd20adPGREZGmrlz59bER3jN5s2bjcViMbfeequJiooyUVFRZv369d4Oy+3S09PNwIEDvR2G\n2+3bt89069bN3HrrreaJJ54wZ86c8XZIbrV8+XLTq1cvc9ttt5np06ebwsJCb4dULYMHDzaNGjUy\ndevWNU2aNDHLli0zp0+fNvfcc49p2rSpSUxMNLm5ud4O02Ulz1enTh3TpEkTs3TpUtOiRQvTrFkz\nR34ZO3ZspffQZB8RET+mF5siIn5MSVxExI8piYuI+DElcRERP6YkLiLix5TERUT8mJK4iIgfUxIX\nEfFj/x+3OG9DH8TsmgAAAABJRU5ErkJggg==\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x62dde10>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 17 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Repeated Measures ANOVA" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions \n", | |
| "from scipy import stats\n", | |
| "import pandas as pd\n", | |
| "from scipy import special\n", | |
| " \n", | |
| "# Define data\n", | |
| "res_num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, \n", | |
| " 29, 30, 31, 32, 34, 35, 36, 37, 39, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58,\n", | |
| " 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 80, 81, 82, 83, 84, 85, 86]\n", | |
| " \n", | |
| "res_name = ['A', 'E', 'F', 'D', 'K', 'A', 'A', 'E', 'E', 'V', 'K', 'H', 'L', 'K', 'T', 'K', 'A', 'D',\n", | |
| " 'E', 'E', 'M', 'L', 'F', 'I', 'Y', 'S', 'H', 'Y', 'K', 'A', 'T', 'V', 'G', 'I', 'T', 'E',\n", | |
| " 'R', 'G', 'M', 'L', 'D', 'F', 'K', 'G', 'K', 'A', 'K', 'D', 'A', 'W', 'N', 'E', 'L', 'K',\n", | |
| " 'G', 'T', 'K', 'E', 'D', 'A', 'K', 'A', 'Y', 'I', 'D', 'K', 'E', 'L', 'K', 'K', 'K', 'Y',\n", | |
| " 'G', 'I']\n", | |
| " \n", | |
| "ref_val = [ 0.91024373, 3.60925171, 3.17784106, 3.99700115, 3.60711608,\n", | |
| " 0.31163906, 5.67501257, 2.30855341, 2.03726973, 5.77701703,\n", | |
| " 6.48923706, 5.71021757, 5.55290274, 1.85762676, 5.61780451,\n", | |
| " 2.09607925, 2.07852273, 3.04713421, 4.11137, 0.84296045,\n", | |
| " 2.07985013, 4.56743506, 3.20100931, 2.82223807, 0.58422802,\n", | |
| " 4.36838362, 4.05477225, 2.00800295, 6.33255709, 11.22422505,\n", | |
| " 11.78607978, 2.05001627, 3.74822605, 2.51791866, 6.21697472,\n", | |
| " 0.27736641, 4.61611892, 4.2013546, 3.87794532, 5.62661815,\n", | |
| " 0.3843826, 2.02021317, 3.34757423, 0.35509272, 2.60472753,\n", | |
| " 6.58254311, 3.42312234, 4.16294909, 1.93473179, 2.07526696,\n", | |
| " 6.5253814, 5.37803185, 8.67561747, 2.91750516, 9.54018383,\n", | |
| " 9.01911166, 0.46962397, 6.24824717, 0.86491637, 0.32630132,\n", | |
| " 3.30981738, 4.11945011, 1.96333298, 2.08634951, 5.66074641,\n", | |
| " 0.44726196, 5.33913566, 2.00701002, 0.33701417, 3.60688253,\n", | |
| " 3.57234264, 5.37404428, 3.30321923, 3.64269822]\n", | |
| " \n", | |
| "ni_val = [ 0.89309963, 3.61292809, 3.11542615, 3.98025178, 3.43994938,\n", | |
| " 0.27353119, 5.67418377, 2.25346994, 2.00767747, 5.76508857,\n", | |
| " 6.45277677, 5.67762211, 5.39834515, 1.86617222, 5.62091689,\n", | |
| " 2.10224377, 2.06772649, 3.27917723, 4.10094926, 0.83313694,\n", | |
| " 2.06588161, 4.53439958, 3.13949212, 2.91191774, 0.63773427,\n", | |
| " 4.19227403, 4.03850763, 2.01848384, 6.30377425, 11.22499578,\n", | |
| " 11.41615569, 2.12654154, 3.78688735, 2.45883007, 6.13661007,\n", | |
| " 0.3065527, 4.60294933, 4.2943232, 3.86548123, 5.52992443,\n", | |
| " 0.3736384, 1.9989515, 3.29443061, 0.48030984, 2.53667385,\n", | |
| " 6.59356022, 2.41508129, 4.11177612, 1.93137301, 2.07391903,\n", | |
| " 6.34913991, 5.40979641, 8.60283467, 2.87022147, 9.60225012,\n", | |
| " 9.07401983, 0.45323177, 6.21707616, 0.85976072, 0.3369907,\n", | |
| " 3.30338844, 4.12188801, 1.90165284, 2.2506127, 5.69555752,\n", | |
| " 0.40358004, 5.3478761, 1.98983745, 0.3311139, 3.61704454,\n", | |
| " 3.57329857, 5.35982765, 3.32741775, 3.66454006]\n", | |
| " \n", | |
| "ref_err = [ 0.10737387, 0.2988302, 0.36111907, 0.30777037, 0.30855783, 0.07778596,\n", | |
| " 0.45465738, 0.25918179, 0.17240042, 0.44896877, 0.48420278, 0.51684491,\n", | |
| " 0.49710594, 0.24309939, 0.51536974, 0.16272787, 0.22181091, 0.34287047,\n", | |
| " 0.36452403, 0.14781816, 0.19613379, 0.31360589, 0.37957875, 0.44111112,\n", | |
| " 0.10928475, 0.53023624, 0.22665547, 0.23738887, 0.59174888, 0.82198636,\n", | |
| " 1.01251054, 0.25656179, 0.34466063, 0.39659081, 0.55917821, 0.08228563,\n", | |
| " 0.39582688, 0.36574805, 0.24701975, 0.33248413, 0.08657965, 0.16115005,\n", | |
| " 0.32634004, 0.08984606, 0.30706413, 0.41415345, 0.31182309, 0.41883343,\n", | |
| " 0.10377392, 0.20621387, 0.66285639, 0.46451524, 0.67587898, 0.29799412,\n", | |
| " 1.15608672, 0.63892129, 0.09995497, 0.45812039, 0.07532633, 0.08880949,\n", | |
| " 0.29970947, 0.3325626, 0.19016293, 0.39020801, 0.43845404, 0.09150572,\n", | |
| " 0.45843908, 0.24604857, 0.09652762, 0.29571491, 0.28102906, 0.53560677,\n", | |
| " 0.32288339, 0.29264218]\n", | |
| " \n", | |
| "ni_err = [ 0.10512885, 0.27868399, 0.33824695, 0.31595396, 0.31098062, 0.07816262,\n", | |
| " 0.43676873, 0.23828771, 0.18446522, 0.44976116, 0.49110456, 0.56778965,\n", | |
| " 0.48140169, 0.21687251, 0.48332244, 0.14455428, 0.1968443, 0.33376286,\n", | |
| " 0.33065818, 0.13022267, 0.20605896, 0.30399551, 0.39353, 0.4514909,\n", | |
| " 0.11339814, 0.47358066, 0.23017618, 0.26396182, 0.61548713, 0.84315396,\n", | |
| " 0.93507, 0.25991585, 0.3717674, 0.42482049, 0.54690669, 0.08482096,\n", | |
| " 0.37239827, 0.36506568, 0.22995557, 0.30400334, 0.08491799, 0.15307524,\n", | |
| " 0.31036164, 0.09076805, 0.31280226, 0.41421353, 0.26672792, 0.4172986,\n", | |
| " 0.10581189, 0.18639669, 0.64489927, 0.47043783, 0.65775911, 0.31303265,\n", | |
| " 1.13146954, 0.7106016, 0.10390343, 0.47243515, 0.07512938, 0.09360014,\n", | |
| " 0.27862192, 0.33378593, 0.19940531, 0.40018419, 0.44858074, 0.08526919,\n", | |
| " 0.46592748, 0.22397215, 0.09109549, 0.29582885, 0.25223517, 0.5244558,\n", | |
| " 0.32844266, 0.33914167]\n", | |
| " \n", | |
| "# Create data tables\n", | |
| "info = np.array([res_num, res_name])\n", | |
| "info = np.core.records.fromarrays(info, names='res_num, res_name', formats = 'i8, S1')\n", | |
| " \n", | |
| "# Array with values\n", | |
| "means = np.array([ref_val, ni_val])\n", | |
| "means = np.core.records.fromarrays(means, names='ref_val, ni_val', formats = 'f8, f8')\n", | |
| "means_v = means.view((means.dtype[0], len(means.dtype.names)))\n", | |
| " \n", | |
| "# Array with standard deviations\n", | |
| "stds = np.array([ref_err, ni_err])\n", | |
| "stds = np.core.records.fromarrays(stds, names='ref_err, ni_err', formats = 'f8, f8')\n", | |
| " \n", | |
| "# Calculate the average across colums\n", | |
| "col_means = np.average(means_v, axis=1)\n", | |
| " \n", | |
| "# Calculate the average down trough rows.\n", | |
| "row_means = np.average(means_v, axis=0)\n", | |
| "print \"Row means is:\", row_means\n", | |
| " \n", | |
| "# Grand mean\n", | |
| "G_Mean = np.average(row_means)\n", | |
| "print \"Grand mean (average of row means) is:\", G_Mean\n", | |
| " \n", | |
| "# \n", | |
| "ni = len(means_v)\n", | |
| "print \"ni is :\", ni\n", | |
| "SSgroup = ni * np.sum( np.square( row_means - G_Mean ) )\n", | |
| "print \"SSgroup is :\", SSgroup\n", | |
| " \n", | |
| "SSw = 0.0\n", | |
| "for i, name in enumerate(means.dtype.names):\n", | |
| " col_sum = np.sum( np.square( means[name] - row_means[i] ) )\n", | |
| " SSw += col_sum\n", | |
| "print \"SSw is :\", SSw\n", | |
| " \n", | |
| "k = len(means.dtype.names)\n", | |
| "print \"k is :\", k\n", | |
| "SSsubjects = k * np.sum( np.square(col_means - G_Mean) )\n", | |
| "print \"SSsubjects is :\", SSsubjects\n", | |
| " \n", | |
| "SSerror = SSw - SSsubjects\n", | |
| "print \"SSerror is :\", SSerror\n", | |
| " \n", | |
| "MSgroup = SSgroup/(k - 1)\n", | |
| "print \"MSgroup is :\", MSgroup\n", | |
| " \n", | |
| "MSerror = SSerror/( (ni - 1) * (k - 1) )\n", | |
| "print \"MSerror is :\", MSerror\n", | |
| " \n", | |
| "F = MSgroup / MSerror\n", | |
| "print \"F is :\", F\n", | |
| " \n", | |
| "# The critical F-value\n", | |
| "# The between-group degrees of freedom is one less than the number of groups\n", | |
| "f_b = k-1\n", | |
| "# The within-group degrees of freedom\n", | |
| "f_W = f_b*(ni-1)\n", | |
| " \n", | |
| "alpha = 0.05\n", | |
| "pct = 1.0 - alpha\n", | |
| " \n", | |
| "Fcrit = special.fdtri(k - 1, ni - 1, pct)\n", | |
| "print \"Fcrit (%i, %i) at alpha=%3.2f is :%3.3f\"%(f_b, f_W, alpha, Fcrit)\n", | |
| " \n", | |
| "# The p-value for this tes\n", | |
| "p = stats.fprob(f_b, f_W, F)\n", | |
| "print \"The p-value for this test: p= %1.3f\"% (p)\n", | |
| " \n", | |
| "# Print by pandas\n", | |
| "# First add to table\n", | |
| "means = np.lib.recfunctions.append_fields(means, 'means', col_means, dtypes=float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Add 0.0 in the end of the array.\n", | |
| "row_means_row = np.append(row_means, [0.0])\n", | |
| "# Resize and add to bottom\n", | |
| "means = np.resize(means, (means.shape[0]+1) )\n", | |
| "means[-1] = row_means_row\n", | |
| " \n", | |
| "means_pd = pd.DataFrame(means)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "#pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print means_pd" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Row means is: [ 3.73785068 3.70917649]\n", | |
| "Grand mean (average of row means) is: 3.72351358473\n", | |
| "ni is : 74\n", | |
| "SSgroup is : 0.0304217267531\n", | |
| "SSw is : 909.164163867\n", | |
| "k is : 2\n", | |
| "SSsubjects is : 908.461488283\n", | |
| "SSerror is : 0.702675584253\n", | |
| "MSgroup is : 0.0304217267531\n", | |
| "MSerror is : 0.00962569293497\n", | |
| "F is : 3.16047135086\n", | |
| "Fcrit (1, 73) at alpha=0.05 is :3.972\n", | |
| "The p-value for this test: p= 0.080\n", | |
| " ref_val ni_val means\n", | |
| "0 0.9102 0.8931 0.9017\n", | |
| "1 3.6093 3.6129 3.6111\n", | |
| "2 3.1778 3.1154 3.1466\n", | |
| "3 3.9970 3.9803 3.9886\n", | |
| "4 3.6071 3.4399 3.5235\n", | |
| "5 0.3116 0.2735 0.2926\n", | |
| "6 5.6750 5.6742 5.6746\n", | |
| "7 2.3086 2.2535 2.2810\n", | |
| "8 2.0373 2.0077 2.0225\n", | |
| "9 5.7770 5.7651 5.7711\n", | |
| "10 6.4892 6.4528 6.4710\n", | |
| "11 5.7102 5.6776 5.6939\n", | |
| "12 5.5529 5.3983 5.4756\n", | |
| "13 1.8576 1.8662 1.8619\n", | |
| "14 5.6178 5.6209 5.6194\n", | |
| "15 2.0961 2.1022 2.0992\n", | |
| "16 2.0785 2.0677 2.0731\n", | |
| "17 3.0471 3.2792 3.1632\n", | |
| "18 4.1114 4.1009 4.1062\n", | |
| "19 0.8430 0.8331 0.8380\n", | |
| "20 2.0799 2.0659 2.0729\n", | |
| "21 4.5674 4.5344 4.5509\n", | |
| "22 3.2010 3.1395 3.1703\n", | |
| "23 2.8222 2.9119 2.8671\n", | |
| "24 0.5842 0.6377 0.6110\n", | |
| "25 4.3684 4.1923 4.2803\n", | |
| "26 4.0548 4.0385 4.0466\n", | |
| "27 2.0080 2.0185 2.0132\n", | |
| "28 6.3326 6.3038 6.3182\n", | |
| "29 11.2242 11.2250 11.2246\n", | |
| "30 11.7861 11.4162 11.6011\n", | |
| "31 2.0500 2.1265 2.0883\n", | |
| "32 3.7482 3.7869 3.7676\n", | |
| "33 2.5179 2.4588 2.4884\n", | |
| "34 6.2170 6.1366 6.1768\n", | |
| "35 0.2774 0.3066 0.2920\n", | |
| "36 4.6161 4.6029 4.6095\n", | |
| "37 4.2014 4.2943 4.2478\n", | |
| "38 3.8779 3.8655 3.8717\n", | |
| "39 5.6266 5.5299 5.5783\n", | |
| "40 0.3844 0.3736 0.3790\n", | |
| "41 2.0202 1.9990 2.0096\n", | |
| "42 3.3476 3.2944 3.3210\n", | |
| "43 0.3551 0.4803 0.4177\n", | |
| "44 2.6047 2.5367 2.5707\n", | |
| "45 6.5825 6.5936 6.5881\n", | |
| "46 3.4231 2.4151 2.9191\n", | |
| "47 4.1629 4.1118 4.1374\n", | |
| "48 1.9347 1.9314 1.9331\n", | |
| "49 2.0753 2.0739 2.0746\n", | |
| "50 6.5254 6.3491 6.4373\n", | |
| "51 5.3780 5.4098 5.3939\n", | |
| "52 8.6756 8.6028 8.6392\n", | |
| "53 2.9175 2.8702 2.8939\n", | |
| "54 9.5402 9.6023 9.5712\n", | |
| "55 9.0191 9.0740 9.0466\n", | |
| "56 0.4696 0.4532 0.4614\n", | |
| "57 6.2482 6.2171 6.2327\n", | |
| "58 0.8649 0.8598 0.8623\n", | |
| "59 0.3263 0.3370 0.3316\n", | |
| " ... ... ...\n", | |
| "\n", | |
| "[75 rows x 3 columns]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 18 | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Wilcoxon signed rank test" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from scipy import stats\n", | |
| "import numpy as np\n", | |
| "import numpy.lib.recfunctions\n", | |
| "import pandas as pd\n", | |
| " \n", | |
| "x1 = [ 0.91024373, 3.60925171, 3.17784106, 3.99700115, 3.60711608,\n", | |
| " 0.31163906, 5.67501257, 2.30855341, 2.03726973, 5.77701703,\n", | |
| " 6.48923706, 5.71021757, 5.55290274, 1.85762676, 5.61780451,\n", | |
| " 2.09607925, 2.07852273, 3.04713421, 4.11137, 0.84296045,\n", | |
| " 2.07985013, 4.56743506, 3.20100931, 2.82223807, 0.58422802,\n", | |
| " 4.36838362, 4.05477225, 2.00800295, 6.33255709, 11.22422505,\n", | |
| " 11.78607978, 2.05001627, 3.74822605, 2.51791866, 6.21697472,\n", | |
| " 0.27736641, 4.61611892, 4.2013546, 3.87794532, 5.62661815,\n", | |
| " 0.3843826, 2.02021317, 3.34757423, 0.35509272, 2.60472753,\n", | |
| " 6.58254311, 3.42312234, 4.16294909, 1.93473179, 2.07526696,\n", | |
| " 6.5253814, 5.37803185, 8.67561747, 2.91750516, 9.54018383,\n", | |
| " 9.01911166, 0.46962397, 6.24824717, 0.86491637, 0.32630132,\n", | |
| " 3.30981738, 4.11945011, 1.96333298, 2.08634951, 5.66074641,\n", | |
| " 0.44726196, 5.33913566, 2.00701002, 0.33701417, 3.60688253,\n", | |
| " 3.57234264, 5.37404428, 3.30321923, 3.64269822]\n", | |
| " \n", | |
| "x2 = [ 0.89309963, 3.61292809, 3.11542615, 3.98025178, 3.43994938,\n", | |
| " 0.27353119, 5.67418377, 2.25346994, 2.00767747, 5.76508857,\n", | |
| " 6.45277677, 5.67762211, 5.39834515, 1.86617222, 5.62091689,\n", | |
| " 2.10224377, 2.06772649, 3.27917723, 4.10094926, 0.83313694,\n", | |
| " 2.06588161, 4.53439958, 3.13949212, 2.91191774, 0.63773427,\n", | |
| " 4.19227403, 4.03850763, 2.01848384, 6.30377425, 11.22499578,\n", | |
| " 11.41615569, 2.12654154, 3.78688735, 2.45883007, 6.13661007,\n", | |
| " 0.3065527, 4.60294933, 4.2943232, 3.86548123, 5.52992443,\n", | |
| " 0.3736384, 1.9989515, 3.29443061, 0.48030984, 2.53667385,\n", | |
| " 6.59356022, 2.41508129, 4.11177612, 1.93137301, 2.07391903,\n", | |
| " 6.34913991, 5.40979641, 8.60283467, 2.87022147, 9.60225012,\n", | |
| " 9.07401983, 0.45323177, 6.21707616, 0.85976072, 0.3369907,\n", | |
| " 3.30338844, 4.12188801, 1.90165284, 2.2506127, 5.69555752,\n", | |
| " 0.40358004, 5.3478761, 1.98983745, 0.3311139, 3.61704454,\n", | |
| " 3.57329857, 5.35982765, 3.32741775, 3.66454006]\n", | |
| " \n", | |
| "T, p = stats.wilcoxon(x1, x2)\n", | |
| "print \"Standard. T and p: \", T, p\n", | |
| " \n", | |
| "# apply continuity correction by adjusting the Wilcoxon rank statistic by 0.5 towards the mean value when computing the z-statistic.\n", | |
| "T, p = stats.wilcoxon(x1, x2, correction=True)\n", | |
| "print \"Correction. T and p: \", T, p\n", | |
| " \n", | |
| " \n", | |
| "# Calculate the difference\n", | |
| "diff = np.asarray(x1) - np.asarray(x2)\n", | |
| " \n", | |
| "# Select only those who passes the different from zero test\n", | |
| "diff_c = np.compress(np.not_equal(diff , 0), diff )\n", | |
| "x1_c = np.compress(np.not_equal(diff , 0), x1 )\n", | |
| "x2_c = np.compress(np.not_equal(diff , 0), x2 )\n", | |
| " \n", | |
| "## Do it manually\n", | |
| "data = np.array([x1_c, x2_c])\n", | |
| "data = np.core.records.fromarrays(data, names='x1, x2', formats = 'f8, f8')\n", | |
| " \n", | |
| "data = np.lib.recfunctions.append_fields(data, 'sgn', np.sign(diff_c), float, usemask=False, asrecarray=True)\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'abs', np.abs(diff_c), float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "## Order by absolute difference\n", | |
| "data.sort(order='abs')\n", | |
| " \n", | |
| "## Rank the data\n", | |
| "rank = stats.rankdata(data['abs'])\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'Ri', rank, float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "sgn_ri = data['sgn'] * data['Ri']\n", | |
| "data = np.lib.recfunctions.append_fields(data, 'sgn_Ri', sgn_ri, float, usemask=False, asrecarray=True)\n", | |
| " \n", | |
| "# Number of ranks\n", | |
| "Nr = len(rank)\n", | |
| "print \"Nr is:\", Nr\n", | |
| " \n", | |
| "W = np.sum(sgn_ri)\n", | |
| "print \"W is:\", W\n", | |
| " \n", | |
| "STD_w = np.sqrt( (Nr*(Nr+1)*(2*Nr+1))/(6) )\n", | |
| "print \"STD_w is:\", STD_w\n", | |
| " \n", | |
| "z = (W - 0.5)/STD_w\n", | |
| "print \"z is:\", z\n", | |
| " \n", | |
| "# Confidence\n", | |
| "confidence = 0.95\n", | |
| "two_tailed_alpha = 1.00 - confidence\n", | |
| "one_tailed_alpha = two_tailed_alpha/2\n", | |
| " \n", | |
| "z_crit = stats.distributions.norm.isf(one_tailed_alpha )\n", | |
| "print \"z_crit=%1.4f for one-tailed alpha=%1.4f\"%(z_crit, one_tailed_alpha)\n", | |
| " \n", | |
| "# Probability\n", | |
| "p_one_tailed = stats.distributions.norm.sf(z)\n", | |
| "p_two_tailed = p_one_tailed * 2\n", | |
| "print 'The two-tailed test p-value is approximately %1.6f and the one-tailed p-value is approximately %1.7f'%(p_two_tailed, p_one_tailed)\n", | |
| " \n", | |
| " \n", | |
| "## Print by pandas\n", | |
| "data_pd = pd.DataFrame(data)\n", | |
| "pd.set_option('display.width', 1000)\n", | |
| "pd.options.display.float_format = '{:5,.4f}'.format\n", | |
| " \n", | |
| "print data_pd" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Standard. T and p: 925.0 0.0127170375176\n", | |
| "Correction. T and p: 925.0 0.0128137921981\n", | |
| "Nr is: 74\n", | |
| "W is: 925.0\n", | |
| "STD_w is: 371.247895617\n", | |
| "z is: 2.4902498059\n", | |
| "z_crit=1.9600 for one-tailed alpha=0.0250\n", | |
| "The two-tailed test p-value is approximately 0.012765 and the one-tailed p-value is approximately 0.0063827\n", | |
| " x1 x2 sgn abs Ri sgn_Ri\n", | |
| "0 11.2242 11.2250 -1.0000 0.0008 1.0000 -1.0000\n", | |
| "1 5.6750 5.6742 1.0000 0.0008 2.0000 2.0000\n", | |
| "2 3.5723 3.5733 -1.0000 0.0010 3.0000 -3.0000\n", | |
| "3 2.0753 2.0739 1.0000 0.0013 4.0000 4.0000\n", | |
| "4 4.1195 4.1219 -1.0000 0.0024 5.0000 -5.0000\n", | |
| "5 5.6178 5.6209 -1.0000 0.0031 6.0000 -6.0000\n", | |
| "6 1.9347 1.9314 1.0000 0.0034 7.0000 7.0000\n", | |
| "7 3.6093 3.6129 -1.0000 0.0037 8.0000 -8.0000\n", | |
| "8 0.8649 0.8598 1.0000 0.0052 9.0000 9.0000\n", | |
| "9 0.3370 0.3311 1.0000 0.0059 10.0000 10.0000\n", | |
| "10 2.0961 2.1022 -1.0000 0.0062 11.0000 -11.0000\n", | |
| "11 3.3098 3.3034 1.0000 0.0064 12.0000 12.0000\n", | |
| "12 1.8576 1.8662 -1.0000 0.0085 13.0000 -13.0000\n", | |
| "13 5.3391 5.3479 -1.0000 0.0087 14.0000 -14.0000\n", | |
| "14 0.8430 0.8331 1.0000 0.0098 15.0000 15.0000\n", | |
| "15 3.6069 3.6170 -1.0000 0.0102 16.0000 -16.0000\n", | |
| "16 4.1114 4.1009 1.0000 0.0104 17.0000 17.0000\n", | |
| "17 2.0080 2.0185 -1.0000 0.0105 18.0000 -18.0000\n", | |
| "18 0.3263 0.3370 -1.0000 0.0107 19.0000 -19.0000\n", | |
| "19 0.3844 0.3736 1.0000 0.0107 20.0000 20.0000\n", | |
| "20 2.0785 2.0677 1.0000 0.0108 21.0000 21.0000\n", | |
| "21 6.5825 6.5936 -1.0000 0.0110 22.0000 -22.0000\n", | |
| "22 5.7770 5.7651 1.0000 0.0119 23.0000 23.0000\n", | |
| "23 3.8779 3.8655 1.0000 0.0125 24.0000 24.0000\n", | |
| "24 4.6161 4.6029 1.0000 0.0132 25.0000 25.0000\n", | |
| "25 2.0799 2.0659 1.0000 0.0140 26.0000 26.0000\n", | |
| "26 5.3740 5.3598 1.0000 0.0142 27.0000 27.0000\n", | |
| "27 4.0548 4.0385 1.0000 0.0163 28.0000 28.0000\n", | |
| "28 0.4696 0.4532 1.0000 0.0164 29.0000 29.0000\n", | |
| "29 3.9970 3.9803 1.0000 0.0167 30.0000 30.0000\n", | |
| "30 0.9102 0.8931 1.0000 0.0171 31.0000 31.0000\n", | |
| "31 2.0070 1.9898 1.0000 0.0172 32.0000 32.0000\n", | |
| "32 2.0202 1.9990 1.0000 0.0213 33.0000 33.0000\n", | |
| "33 3.6427 3.6645 -1.0000 0.0218 34.0000 -34.0000\n", | |
| "34 3.3032 3.3274 -1.0000 0.0242 35.0000 -35.0000\n", | |
| "35 6.3326 6.3038 1.0000 0.0288 36.0000 36.0000\n", | |
| "36 0.2774 0.3066 -1.0000 0.0292 37.0000 -37.0000\n", | |
| "37 2.0373 2.0077 1.0000 0.0296 38.0000 38.0000\n", | |
| "38 6.2482 6.2171 1.0000 0.0312 39.0000 39.0000\n", | |
| "39 5.3780 5.4098 -1.0000 0.0318 40.0000 -40.0000\n", | |
| "40 5.7102 5.6776 1.0000 0.0326 41.0000 41.0000\n", | |
| "41 4.5674 4.5344 1.0000 0.0330 42.0000 42.0000\n", | |
| "42 5.6607 5.6956 -1.0000 0.0348 43.0000 -43.0000\n", | |
| "43 6.4892 6.4528 1.0000 0.0365 44.0000 44.0000\n", | |
| "44 0.3116 0.2735 1.0000 0.0381 45.0000 45.0000\n", | |
| "45 3.7482 3.7869 -1.0000 0.0387 46.0000 -46.0000\n", | |
| "46 0.4473 0.4036 1.0000 0.0437 47.0000 47.0000\n", | |
| "47 2.9175 2.8702 1.0000 0.0473 48.0000 48.0000\n", | |
| "48 4.1629 4.1118 1.0000 0.0512 49.0000 49.0000\n", | |
| "49 3.3476 3.2944 1.0000 0.0531 50.0000 50.0000\n", | |
| "50 0.5842 0.6377 -1.0000 0.0535 51.0000 -51.0000\n", | |
| "51 9.0191 9.0740 -1.0000 0.0549 52.0000 -52.0000\n", | |
| "52 2.3086 2.2535 1.0000 0.0551 53.0000 53.0000\n", | |
| "53 2.5179 2.4588 1.0000 0.0591 54.0000 54.0000\n", | |
| "54 3.2010 3.1395 1.0000 0.0615 55.0000 55.0000\n", | |
| "55 1.9633 1.9017 1.0000 0.0617 56.0000 56.0000\n", | |
| "56 9.5402 9.6023 -1.0000 0.0621 57.0000 -57.0000\n", | |
| "57 3.1778 3.1154 1.0000 0.0624 58.0000 58.0000\n", | |
| "58 2.6047 2.5367 1.0000 0.0681 59.0000 59.0000\n", | |
| "59 8.6756 8.6028 1.0000 0.0728 60.0000 60.0000\n", | |
| " ... ... ... ... ... ...\n", | |
| "\n", | |
| "[74 rows x 6 columns]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 19 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment