Skip to content

Instantly share code, notes, and snippets.

@DustinAlandzes
Forked from tlinnet/ANOVA.ipynb
Created September 23, 2017 20:15
Show Gist options
  • Save DustinAlandzes/44c62955f4f51778882f631c40d39007 to your computer and use it in GitHub Desktop.
Save DustinAlandzes/44c62955f4f51778882f631c40d39007 to your computer and use it in GitHub Desktop.
ANOVA in python
Display the source blob
Display the rendered blob
Raw
{
"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": "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\nrkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x5e12d50>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEKCAYAAAAYd05sAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVHX+P/DXCDb4EL7FtqUVEC1eJq8xhLCaguSt3IJu\nX/GhdqFtNzQgA91+SjFuFx6i7W74WLFUsJXNauthmogXqsndNAYNN13xNlpQWWSaDlcV3r8/WubL\nyIAwzMyZOfN6Ph7zeDBnzpzz5sP48jOfc87naEREQEREqtNH6QKIiMg1GPBERCrFgCciUikGPBGR\nSjHgiYhUigFPRKRSDHhSpXXr1mH8+PEOv//uu+/G+vXrnVhR9/Tp0wcnTpxw+35JnRjw5DKlpaWI\ni4vDddddh4EDB+Luu+/Gp59+qnRZHRgMBsyZM8dm2datWzss8yS9/Q+MfAMDnlxi9erVmDVrFmJj\nY/HZZ5/h2LFjSElJwdtvv93jbV26dKnDspaWFmeUSaRuQuRk58+fl+DgYHn55Zc7XefixYuyfv16\niYmJkdjYWCkuLpaLFy+KiMjHH38sN910kxQUFMjgwYNlzpw5YjAYJDk5WZ588kkZOHCgrF27Vhoa\nGmTNmjUSHR0t48aNk3feeUdaW1tFRKSoqEjuuOMO6/7S09MlNDRUrr/+evnd734n+/fvFxGR0tJS\nueqqq6Rv374SGBgot912m4iIxMXFyZo1a6zv37Rpk0yaNElGjBghBQUFUl9fLyIiJ0+eFI1GI++9\n957odDoZOXKkrF+/vtPf+5FHHpGMjAy57777ZMCAAbJw4UI5ffq09XWNRiNms1lEROrr62XlypUy\nYsQImTx5smzevFlERA4dOiQBAQHi5+cngYGBEhwc3P0/DvkUBjw53e7du0Wj0cjBgwc7XaewsFBG\njRolFRUVsm/fPrntttukqKhIRH4OeH9/f0lJSZFTp05JY2Oj5OTkSN++fSU/P18aGxulsbFR5s+f\nL8nJyXLy5EnZv3+/jBgxQnbs2CEiHQO+uLhYzpw5I2fPnpUFCxbIuHHjrK8ZDAaZM2eOTX3x8fGy\ndu1aERH56KOPJCwsTHbu3ClHjx6VO++8U3JyckTk/wJ+xowZUl1dLdu3bxetViuNjY12f+9HHnlE\n+vfvL2+88YZ88803kpycLMnJydbX2wf8888/LxMnTpQjR47Ihx9+KOHh4fLxxx+LiMi6detsfj8i\nezhEQ05XU1ODoKAgDB8+vNN13n//fcybNw+333479Ho95s2bh40bN1pfb2lpgcFgwMCBAxEQEAAA\nCA0NRVpaGgICAqDVarFx40bk5eUhPDwco0ePxuOPP47333/f7v5mzZqF4OBgXHPNNXjuueewf/9+\nnD59GgAgP3d0uqx11qxZmDRpEgYPHoxnn33WplYAWLhwIUJDQzFlyhSEh4fDaDR2uj29Xo+HH34Y\nN954I5YsWYLt27ejtbW1w3qbNm3Cs88+iyFDhiAhIQGzZs2y7rereonaMODJ6UJDQ2GxWPCf//yn\n03V2796NqKgo6/OoqCj885//tD4fMGAAQkNDbd4TExNj/fnw4cOorq7GqFGjEBwcjODgYOTk5HR6\nEHfdunWYPn06rrvuOoSFhaGxsREHDhzo1u9jr9YDBw7AYrFYl912223Wn2+44QZ8++23drel0Wgw\nevRo6/MhQ4bg4sWLqKqqslnPYrHgiy++6LKNiK6EAU9ON2LECAQHB2Pz5s2drjNu3Djs3bvX+nzv\n3r2YMGGC9bm/v7/N+hqNBn5+ftbnQ4cORUhICA4dOoSzZ8/i7NmzOHfuHPbv399hXzU1NXjmmWew\naNEifPXVV6iurka/fv2svWB/f/8ue8T2ah05ciSCgoK6aAX7RMSmxiNHjqBv37649dZbbdYLCgrC\nqFGjOm0jPz8/9uLpihjw5HRBQUFYunQpXnnlFSxatAhmsxnnz5/Hxo0bkZGRAQBITEzEqlWrsG/f\nPlRWVmLVqlVISkrqdJuXh1mfPn0wY8YM/OEPf0BVVRVaW1thNpuxa9euDu/94YcfICIYOHAgLBYL\nFi1ahObmZuvrUVFROHTokM2y9hITE7FhwwZ89NFHOH78OJYtW4b77ruvyzboKnwrKyvx97//Hd9+\n+y3++Mc/Ytq0aejTp+M/xcTERCxbtgxHjx6F0WjEhg0brG0UFRWFY8eOoa6urss6yLf5X3kVop77\n7W9/i5CQEOTm5uL111+Hv78/oqOjsXjxYgDA7Nmz4efnh7lz50Kj0eDpp59GcnKy9f0ajcZmexqN\npsMyg8GAt99+G6mpqdi/fz9+9atf4dlnn+2wvl6vx9y5c5GQkICAgAA888wzNsM/cXFxGDJkCG65\n5RbceOONNr1mAIiPj8ef//xnvPzyy/juu++QmpqKRx99tNNaO1vWtvyJJ57Ae++9h8zMTDz88MNY\nuHCh3fctXLgQRUVFuP/++3HDDTfgT3/6E+Li4gAAw4YNQ1JSEoYPH47GxkbU1tba3R/5No100dVI\nSUlBSUkJrr/+eut45T/+8Q8YDAYcPnwYFRUV0Ov11vXz8/OxYsUK9O3bF6+//jruuOMO1/8GRF7k\nscceQ0hICF544QWlSyEf0OUQzWOPPYZt27bZLBs5ciQ2btxoM14KALW1tVi5ciU+/PBDFBQUID09\n3fnVEnk5jpuTO3U5RDN+/Hh8+eWXNst0Op3ddcvLyzFt2jSEhYUhLCwMIgKLxeLQgSgitbI31ETk\nKk4bgzeZTDZnAgwdOhQmkwl33nmns3ZB5PWKioqULoF8iNPOorH31ZM9FSIi5TitBx8TE4OysjLr\n88OHDyM6OrrDeoMGDYLZbHbWbomIfEJERASOHz/eo/f0qgffvtc+ZswYbN++HdXV1TAajejTp4/d\n8Xez2Wy9NNyTHjk5OYrXwJpYky/WxZq693CkY9xlD37mzJn45JNPcPr0aYSGhmLJkiX4xS9+gbS0\nNJw+fRrTp09HZGQkSktLMWDAAKSmpiIhIQFXXXUVXnvttR4XQ0REztNlwG/YsMHu8s6uOMzIyLBe\nqUhERMrilaz/FR8fr3QJHbCm7mFNQEnJLuTn70Bzsz+02ktIT5+C6dMndFiPbdU9nliTI7q8ktUl\nO9Ro4OZdEqlaSckuZGRsh9n8knVZRMRivPrqVLshT97JkezkZGNEXi4/f4dNuAOA2fwSVqzYqVBF\n5CkY8ERerrnZ/khrU5Of3eXkOxjwRF5Oq+14U3IACAjgjcl9HQOeyMulp09BRMRim2UREYuQljZZ\noYrIU/AgK5EKlJTswooVO9HU5IeAgBakpU3mAVaVcSQ7GfBERF6AZ9EQEZEVA56ISKUY8EREKsWA\nJyJSKQY8EZFKMeCJiFSKAU9EpFIMeCIilWLAExGpFAOeiEilGPBERCrFgCciUikGPBGRSjHgiYhU\nigFPRKRSDHgiIpViwBMRqRQDnohIpRjwREQqxYAnIlKpLgM+JSUFAwYMwMiRI63LLBYLEhMTERYW\nhqSkJNTV1Vlfy8/Px+DBgzFs2DD861//cl3VRER0RV0G/GOPPYZt27bZLCsoKEBYWBiOHTuGkJAQ\nrFq1CgBQW1uLlStX4sMPP0RBQQHS09NdVzUREV1RlwE/fvx4BAcH2ywzmUx4/PHHodVqkZKSgvLy\ncgBAeXk5pk2bhrCwMMTFxUFEYLFYXFc5ERF1qcdj8BUVFdDpdAAAnU4Hk8kE4OeAv/XWW63rDR06\n1PoaERG5X48DXkS6va5Go+np5omIyEn8e/qG6OhoVFVVITIyElVVVYiOjgYAxMTEoKyszLre4cOH\nra9dzmAwWH+Oj49HfHx8T8sgIlI1o9EIo9HYq21o5Apd8i+//BL33HMPDhw4AADIy8tDTU0N8vLy\nkJWVhVtuuQVZWVn4/vvvERcXhx07duDEiRN45pln8Pnnn3fcoUbTo28BRETkWHZ2OUQzc+ZMjB07\nFkePHkVoaCiKioqQmpqK6upqDB06FN988w2efPJJAMCAAQOQmpqKhIQEzJ07F6+++qrjvwkREfXa\nFXvwTt8he/BERD3m9B48ERF5LwY8EZFKMeCJiFSKAU9EpFIMeCIilWLAExGpFAOeiEilGPBERCrF\ngCciUikGPBGRSjHgiYhUigFPRKRSDHgiIpViwBMRqRQDnohIpXp8yz76PyUlu5CfvwPNzf7Qai8h\nPX0Kpk+foHRZREQAGPAOKynZhYyM7TCbX7IuM5sXAwBDnog8AodoHJSfv8Mm3AHAbH4JK1bsVKgi\nIiJbDHgHNTfb//LT1OTn5kqIiOxjwDtIq71kd3lAQIubKyEiso8B76D09CmIiFhssywiYhHS0iYr\nVBERkS2N9PQ23b3doQN3BvdUJSW7sGLFTjQ1+SEgoAVpaZN5gJWIXMKR7GTAExF5AUeyk0M0REQq\nxYAnInISEcGlVvsnYCiBAU9E1EsigtJjpYhdG4u1n69VuhwrXslKROQgEcG249tg+MSA+gv1yInL\nwQPDHlC6LCsGPBFRD3UW7H00njUowoAnIuombwn2Ng5X9eabbyIuLg7Dhw/HmjVrAAAWiwWJiYkI\nCwtDUlIS6urqnFYoEZFS2o+xL9i5AFm/zsIXqV/goeEPeWy4Aw6eB3/u3DmMGTMGn332Gfr27YuE\nhATs3LkTr732GmpqarB8+XJkZmYiPDwcWVlZtjvkefBE5CU8qcfuSHY6NESze/du6PV6BAcHAwAm\nTpyIPXv2wGQyITs7G1qtFikpKcjNzXVk80REivKkYO8NhwJ+woQJeOqpp3Dy5EkEBARg69at0Gq1\nqKiogE6nAwDodDqYTCanFktE5EpqCfY2DgV8//798Ze//AXz5s3DuXPnMHLkSGi12m5/fTAYDNaf\n4+PjER8f70gZRERO4YnBbjQaYTQae7UNp8xFk5ycjAULFuDll19GdnY2IiMjsW/fPuTm5uLdd9+1\n3SHH4InIQ3hisHfGrXPR1NbWAgDKyspw8OBB6PV6xMTEoLCwEI2NjSgsLERsbKyjmycicpn2Z8Vk\n7cxC5q8zveKsmJ5yuAc/YcIE1NbWIigoCH/9618xZswYWCwWzJ49G5WVldDr9SguLkZgYKDtDtmD\nJyKFtO+x112oQ05cDh4c9qBXhDqnCyYissObg72N206TJCLyBmoI9t5gwBOR6vh6sLdhwBORajDY\nbTHgicjrMdjtY8ATkddisHeNAU9EXofB3j0MeCLyGgz2nmHAE5HHY7A7hgFPRB6Lwd47DHgi8jgM\ndudgwBORx2CwOxcDnogUx2B3DQY8ESmGwe5aDHgicjsGu3sw4InIbRjs7sWAJyKXY7ArgwFPRC7D\nYFcWA56InI7B7hkY8ETkNO4K9pKSXcjP34HmZn9otZeQnj4F06dPcOo+1IABT0S95s4ee0nJLmRk\nbIfZ/JJ1mdm8GAAY8pfhTbeJyGEigu3m7TAYfw725+Oed/lQzNSp2dix40U7y5/Dtm0vuGy/SuNN\nt4nILS4P9py4HDww7AG3jLE3N9uPraYmP5fv29sw4Imo29qGYpZ8ssTtwd5Gq71kd3lAQIvbavAW\nDHgiuqL2Y+z1F+oVCfY26elTYDYvthmDj4hYhLS0aW6vxdNxDJ6IOuVJwd5eSckurFixE01NfggI\naEFa2mTVH2B1JDsZ8ETUgacGuy/jQVYi6hUGu7ow4ImIwa5SDv/1Vq9ejbFjxyIqKgpPP/00AMBi\nsSAxMRFhYWFISkpCXV2d0wolIucTEZQeK0Xs2lgs2LkAWb/OwhepX+Ch4Q8x3FXAoTH4M2fOICoq\nCgcPHkS/fv3wm9/8BhkZGfj3v/+NmpoaLF++HJmZmQgPD0dWVpbtDjkGT6Q49ti9j9vG4Pv16wcR\nwblz5wAADQ0NuOaaa2AymZCdnQ2tVouUlBTk5uY6snkichEGu29xOOALCgoQHh4OrVaL9PR0xMTE\noKKiAjqdDgCg0+lgMpmcWiwROYbB7pscCvgffvgBqampOHToEIKDg/HQQw9hy5Yt3f76YDAYrD/H\nx8cjPj7ekTKI6AoY7N7LaDTCaDT2ahsOjcGXlJRg/fr1eOuttwAABQUF+PLLL3H8+HFkZ2cjMjIS\n+/btQ25uLt59913bHXIMnsjlGOzu5+opjN02Bj9+/HhkZGTgzJkz6N+/P0pLS5GRkYFrr70WhYWF\nyMvLQ2FhIWJjYx3ZPBE5iMGuDE+dwtjhK1nXrVuHoqIiNDQ0YNq0aViyZAnq6+sxe/ZsVFZWQq/X\no7i4GIGBgbY7ZA+eyOkY7MpyxxTGbr2S9dFHH8Wjjz5qsywoKAibNm1ydJNE1EMMds/gqVMY80pW\nIi/kDcHuS7fV89QpjBnwRF7EG4Id8NwxaVfx1CmMOZskkRfwlmBv44u31XP1FMacTZK65IlfmT2x\nJk/ibcHexlPHpF1p+vQJHvfZZcD7CE/8yuyJNXkKbw32Np46Ju1zxM0U2CWJyJQpiwWQDo+pU7NZ\nkwdpbW2VrUe3ypjVY2T4X4fLOwffkZbWFqXL6rEtWz6RiIhFNn/XiIj/J1u2fKJ0aV7LkexkD95H\neOJXZk+sSSni5T32y7V9A1ux4rl2Y9LTfP6bmbsx4H2EJ35l9sSa3O3yYH8+7nk8OOxBrw329jxx\nTNrXeP+niLolPX0KIiIW2yz7+TSuyQpV5Jk1uYt0cqON/x3+v6oId/IMPE3Sh3jineg9sSZXat9j\nr7tQh5y4HNX02Mm1HMlOBjyRGzDYqbd4HjyRh2Gwk5IY8EQuoOaDp+Q9GPBETqS20x3JuzHgiZyA\nwU6eiAFP1AsMdvJkDHgiB3CMnbwBA56oB9hjJ2/CgCfqBgY7eSMGPFEXOBRD3owBT2QHe+ykBgx4\nonYY7KQmDHgiuC/YeYtCcicGPPk0d/bYeYtCcjfOJkk+SYmhmKlTs7Fjx4t2lj+HbdtecNl+SR04\nmyTRFSg5xs5bFJK7MeDJJ3jCwVPeopDcjQFPquYJwd4mPX0KzObFNmPwP9+icJrbayHf4NAY/JEj\nR5CcnGx9fuLECbzwwgtISUnBrFmzUFlZCb1ej+LiYgQGBtrukGPw5AaeFOzt+dotCsl5FLllX2tr\nK2666SaYTCZs2LABNTU1WL58OTIzMxEeHo6srKxeF0nUXZ4a7ES9pchB1rKyMgwaNAihoaEwmUzI\nzs6GVqtFSkoKcnNze7t5om7hlAJEHfU64N966y3MnDkTAFBRUQGdTgcA0Ol0MJlMvd08UZfYYyfq\nXK8C/sKFC/jggw+wdOlSAOj21weDwWD9OT4+HvHx8b0pg3wQg53Uzmg0wmg09mobvQr40tJSREVF\n4brrrgMAREdHo6qqCpGRkaiqqkJ0dLTd97UPePJ+7rz8nsFOvuLyzu+SJUt6vI1eBfyGDRuswzMA\nEBMTg8LCQuTl5aGwsBCxsbG92Tx5AXddfs9gJ+o5h8+iqa+vx80334yTJ08iKCgIAGCxWDB79mye\nJulDXH35PYOd6GduPYumf//+OH36tM2yoKAgbNq0ydFNkhdy1eX3DHai3uOVrNQrzr78nsFO5DwM\neOoVZ11+z2Ancj5OF0y91pvL7xnsRN2jyFQFPcWAJ4DBTtRTnA+ePB6Dnch9GPDkFgx2IvdjwJNL\nMdiJlKOKgOed6j0Pg51IeV4f8LxTvWdhsBN5Dq8/i4Z3qvcMDHYi1/LJs2h4p3plMdiJPJfXBzzv\nVK8MBjuR5/P6gOed6t2LwU7kPbx+DB7gnerdgcFOpCxOVUBOx2An8gw+eZCVXIPBTuT9GPBkg8FO\npB4MeALAYCdSIwa8j2OwE6kXA95HMdiJ1I8B72PaB3vdhToY4gwMdiKVYsD7iMuDPScuBw8Oe5DB\nTqRiqg94X59KmMFO5LtUHfC+PJUwg52IVH0lqy9OJcxgJ1InXsl6GV+aSpjBTkSXU3XA+8JUwgx2\nIuqMqgNezVMJM9iJ6EocHoOvr6/H3LlzsWfPHvj7+6OoqAjDhg3D7NmzUVlZCb1ej+LiYgQGBtru\n0M2zSaptKmEGO5Fvcut0wVlZWejXrx8WL14Mf39/1NfX47XXXkNNTQ2WL1+OzMxMhIeHIysrq9dF\nEoOdyNe59SBrWVkZ9uzZg4CAAADA1VdfDZPJhOzsbGi1WqSkpCA3N9fRzdN/MdiJyFEO9eC//vpr\nTJo0CbGxsaiqqsL999+P9PR06HQ6HDlyBAEBAWhoaMCtt96Kr776ynaH7MF3C4OdiNpzWw++qakJ\nR48exbJlyzBp0iT8/ve/xzvvvMPgdgIGOxE5i0MBP2jQIAwdOhT33HMPAGDmzJn429/+hujoaFRV\nVSEyMhJVVVWIjo62+36DwWD9OT4+HvHx8Y6UoSoMdiJqz2g0wmg09mobDh9kvffee7F48WJER0cj\nPT0dkZGR+PHHH1FTU4O8vDxkZWXhlltu4UHWK2CwE1F3uPUsmqNHj+Lhhx9GU1MTJk2ahCVLlqC1\ntdXjTpP0VAx2IuoJtwa8o3w94BnsROQIzkXjwRjsRORuDHgXY7ATkVIY8C7CYCcipTHgnUxEsN28\nHQajAZYLFgY7ESmGAe8k7YO97kIdno97nsFORIpiwPfS5cGeE5eDB4Y9wGAnIsUx4B3UNsa+5JMl\nDHYi8kgM+B5qf/C0/kI9g52IPBYDvpsY7ETkbRjwV8BgJyJvxYDvBIOdiLwdA/4yag72kpJdyM/f\ngeZmf2i1l5CePsWr709LRF1jwP+XmoMd+DncMzK2w2x+ybrMbF4MAAx5IpXy+dkk1R7sbaZOzcaO\nHS/aWf4ctm17QYGKiKgnOJtkD/hKsLdpbrb/p25q8nNzJUTkLj4X8L4W7G202kt2lwcEtLi5EiJy\nF58JeF8N9jbp6VNgNi+2GYOPiFiEtLRpClZFRK6k+jF4Xw/29kpKdmHFip1oavJDQEAL0tIm8wAr\nkZfgLfvaYbATkZrwICsY7EREbVQT8Ax2IiJbqgn42Rtn49/f/ZvBTkT0X6oZg68+V42Q/wlhsBOR\nKvEgKxGRSjmSnezuEhGpFAOeiEilGPBERCrFgCciUimHAz48PByjRo1CZGQkxowZAwCwWCxITExE\nWFgYkpKSUFdX57RCiYioZxwOeI1GA6PRiMrKSphMJgBAQUEBwsLCcOzYMYSEhGDVqlVOK9TVjEaj\n0iV0wJq6hzV1nyfWxZpcp1dDNJefsmMymfD4449Dq9UiJSUF5eXlvSrOnTzxD8qauoc1dZ8n1sWa\nXKdXPfiEhAQkJSVh8+bNAICKigrodDoAgE6ns/bsiYjI/RyequDTTz/FDTfcgKqqKtxzzz0YM2YM\nL2AiIvIk4gTz58+X119/Xe6//375/PPPRURk79698sADD3RYNyIiQgDwwQcffPDRg0dERESPs9mh\nHnxDQwNaWloQFBSEH374Adu3b8f8+fNx9uxZFBYWIi8vD4WFhYiNje3w3uPHjzuySyIi6iGH5qI5\nefIk7rvvPgDAtddei1mzZiElJQUWiwWzZ89GZWUl9Ho9iouLERgY6PSiiYjoytw+2RgREbmHy69k\n9cQLouzVZDAYEBISgsjISERGRmLbtm1uram+vh6PPPIIhgwZgmHDhqG8vFzxdrq8ps8++0zxdjpy\n5Ih135GRkbj66quRn5+Puro6xdrKXk2vvvqq4m21evVqjB07FlFRUXj66acBKP9vz15NSrfTm2++\nibi4OAwfPhxr1qwBoHw7dVZXj9uqV0dXuyE8PFx+/PFHm2VLly6Vp556SpqammTevHmybNkyV5dx\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