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$ 
Mirrors as potential environmental enrichment for individually housed laboratory mice
(Sherwin, 2004): 16 лабораторных мышей были помещены в двухкомнатные клетки, в одной из комнат висело зеркало. С целью установить, есть ли у мышей какие-то предпочтения насчет зеркал, измерялась доля времени, которое каждая мышь проводила в каждой из своих двух клеток.
End of explanation
"""


mouses_data = pd.read_csv('mirror_mouses.txt', header = None)
mouses_data.columns = ['proportion_of_time']

mouses_data

mouses_data.describe()

pylab.hist(mouses_data.proportion_of_time)
pylab.show()

"""
Explanation: Загрузка данных
End of explanation
"""


print '95%% confidence interval for the mean time: [%f, %f]' % zconfint(mouses_data)

"""
Explanation: Одновыборочные критерии
End of explanation
"""


print "M: %d, p-value: %f" % sign_test(mouses_data, 0.5)

"""
Explanation: Критерий знаков
$H_0\colon$ медиана доли времени, проведенного в клетке с зеркалом, равна 0.5
$H_1\colon$ медиана доли времени, проведенного в клетке с зеркалом, не равна 0.5
End of explanation
"""


m0 = 0.5
stats.wilcoxon(mouses_data.proportion_of_time - m0)

"""
Explanation: Критерий знаковых рангов Вилкоксона
End of explanation
"""


def permutation_t_stat_1sample(sample, mean):
    t_stat = sum(map(lambda x: x - mean, sample))
    return t_stat

permutation_t_stat_1sample(mouses_data.proportion_of_time, 0.5)

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(mouses_data.proportion_of_time, 0.5), bins = 15)
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(mouses_data.proportion_of_time, 0.5)

print "p-value: %f" % permutation_test(mouses_data.proportion_of_time, 0.5, 10000)

"""
Explanation: Перестановочный критерий
$H_0\colon$ среднее равно 0.5
$H_1\colon$ среднее не равно 0.5
End of explanation
"""


