<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Непараметрические криетрии
Критерий | Одновыборочный | Двухвыборочный | Двухвыборочный (связанные выборки)
  ------------- | -------------|
  Знаков  | $\times$ | | $\times$ 
  Ранговый | $\times$  | $\times$ | $\times$
Перестановочный | $\times$  | $\times$ | $\times$ 
Терапия при анорексии
В исследовании оценивается эффективность поведенческой терапии для лечения анорексии. Для 50 пациентов известен вес до начала терапии и по её окончании. Была ли терапия эффективной?
Step1:  Загрузка данных
Step2:  Двухвыборочные критерии для связных выборок
$H_0\colon$ медианы веса до и после терапии совпадает
$H_1\colon$ медианы веса до и после тепрапии отличаются
Step3:  Критерий знаков
$H_0\colon$ медианы равны
$H_1\colon$ медианы не равны
Step4:  Критерий знаковых рангов Вилкоксона
Step5:  Перестановочный критерий
$H_0\colon E(X_1 - X_2) = 0$
$H_1\colon E(X_1 - X_2) ≠ 0$
<ASSISTANT_TASK:>
Python Code:
import numpy as np
import pandas as pd
import itertools
from scipy import stats
from statsmodels.stats.descriptivestats import sign_test
from statsmodels.stats.weightstats import zconfint
%pylab inline
Explanation: Непараметрические криетрии
Критерий | Одновыборочный | Двухвыборочный | Двухвыборочный (связанные выборки)
  ------------- | -------------|
  Знаков  | $\times$ | | $\times$ 
  Ранговый | $\times$  | $\times$ | $\times$
Перестановочный | $\times$  | $\times$ | $\times$ 
Терапия при анорексии
В исследовании оценивается эффективность поведенческой терапии для лечения анорексии. Для 50 пациентов известен вес до начала терапии и по её окончании. Была ли терапия эффективной?
End of explanation
weight_data = pd.read_csv('weight.txt', sep = '\t', header = 0)
weight_data.head()
pylab.figure(figsize=(12,4))
pylab.subplot(1,2,1)
pylab.grid()
pylab.hist(weight_data.Before, color = 'r')
pylab.xlabel('Before')
pylab.subplot(1,2,2)
pylab.grid()
pylab.hist(weight_data.After, color = 'b')
pylab.xlabel('After')
pylab.show()
weight_data.describe()
Explanation: Загрузка данных
End of explanation
print '95%% confidence interval for median weight before therapy: [%f, %f]' % zconfint(weight_data.Before)
print '95%% confidence interval for median weight after therapy: [%f, %f]' % zconfint(weight_data.After)
pylab.hist(weight_data.After - weight_data.Before)
pylab.show()
Explanation: Двухвыборочные критерии для связных выборок
$H_0\colon$ медианы веса до и после терапии совпадает
$H_1\colon$ медианы веса до и после тепрапии отличаются
End of explanation
print "M: %d, p-value: %f" % sign_test(weight_data.After - weight_data.Before)
Explanation: Критерий знаков
$H_0\colon$ медианы равны
$H_1\colon$ медианы не равны
End of explanation
stats.wilcoxon(weight_data.After, weight_data.Before)
stats.wilcoxon(weight_data.After - weight_data.Before)
Explanation: Критерий знаковых рангов Вилкоксона
End of explanation
def permutation_t_stat_1sample(sample, mean):
    t_stat = sum(map(lambda x: x - mean, sample))
    return t_stat
def permutation_zero_distr_1sample(sample, mean, max_permutations = None):
    centered_sample = map(lambda x: x - mean, sample)
    if max_permutations:
        signs_array = set([tuple(x) for x in 2 * np.random.randint(2, size = (max_permutations, 
                                                                              len(sample))) - 1 ])
    else:
        signs_array =  itertools.product([-1, 1], repeat = len(sample))
    distr = [sum(centered_sample * np.array(signs)) for signs in signs_array]
    return distr
pylab.hist(permutation_zero_distr_1sample(weight_data.After - weight_data.Before, 0., 
                               max_permutations = 10000))
pylab.show()
def permutation_test(sample, mean, max_permutations = None, alternative = 'two-sided'):
    if alternative not in ('two-sided', 'less', 'greater'):
        raise ValueError("alternative not recognized\n"
                         "should be 'two-sided', 'less' or 'greater'")
    
    t_stat = permutation_t_stat_1sample(sample, mean)
    
    zero_distr = permutation_zero_distr_1sample(sample, mean, max_permutations)
    
    if alternative == 'two-sided':
        return sum([1. if abs(x) >= abs(t_stat) else 0. for x in zero_distr]) / len(zero_distr)
    
    if alternative == 'less':
        return sum([1. if x <= t_stat else 0. for x in zero_distr]) / len(zero_distr)
    if alternative == 'greater':
        return sum([1. if x >= t_stat else 0. for x in zero_distr]) / len(zero_distr)
print "p-value: %f" % permutation_test(weight_data.After - weight_data.Before, 0., 
                               max_permutations = 1000)
print "p-value: %f" % permutation_test(weight_data.After - weight_data.Before, 0., 
                               max_permutations = 50000)
Explanation: Перестановочный критерий
$H_0\colon E(X_1 - X_2) = 0$
$H_1\colon E(X_1 - X_2) ≠ 0$
End of explanation
<END_TASK>