2010-02-24 1 views
22

Я ищу, чтобы создать некоторую статистику о модели, которую я создал в python. Я хотел бы сгенерировать t-тест на нем, но было интересно, есть ли простой способ сделать это с помощью numpy/scipy. Есть ли хорошие объяснения?Как рассчитать статистику «t-test» с numpy

К примеру, у меня есть три связанных наборов данных, которые выглядят следующим образом:

[55.0, 55.0, 47.0, 47.0, 55.0, 55.0, 55.0, 63.0] 

Теперь, я хотел бы сделать Т-тест студента на них.

ответ

26

В пакете scipy.stats есть несколько функций ttest_.... Смотрите пример из here:

>>> print 't-statistic = %6.3f pvalue = %6.4f' % stats.ttest_1samp(x, m) 
t-statistic = 0.391 pvalue = 0.6955 
+0

спасибо, что ответили. он, кажется, принимает случайную величину. Должен ли я заранее создать случайную переменную из моей выборки? – Mark

+0

Я думаю, что вы можете просто использовать свой образец (а не «образец населения») – van

+0

Образец, как в одном примере значения? У меня создалось впечатление, что я могу использовать образец нескольких результатов в качестве параметра, но, возможно, я был введен в заблуждение :) – Mark

-4

После того, как вы получите ваш т-значение, вы можете задаться вопросом, как интерпретировать его как вероятность - я сделал. Вот что я написал, чтобы помочь с этим.

Основано на информации, которую я почерпнул от http://www.vassarstats.net/rsig.html и http://en.wikipedia.org/wiki/Student%27s_t_distribution. Ответ

# Given (possibly random) variables, X and Y, and a correlation direction, 
# returns: 
# (r, p), 
# where r is the Pearson correlation coefficient, and p is the probability 
# of getting the observed values if there is actually no correlation in the given 
# direction. 
# 
# direction: 
# if positive, p is the probability of getting the observed result when there is no 
#  positive correlation in the normally distributed full populations sampled by X 
#  and Y 
# if negative, p is the probability of getting the observed result, when there is no 
#  negative correlation 
# if 0, p is the probability of getting your result, if your hypothesis is true that 
# there is no correlation in either direction 
def probabilityOfResult(X, Y, direction=0): 
    x = len(X) 
    if x != len(Y): 
     raise ValueError("variables not same len: " + str(x) + ", and " + \ 
         str(len(Y))) 
    if x < 6: 
     raise ValueError("must have at least 6 samples, but have " + str(x)) 
    (corr, prb_2_tail) = stats.pearsonr(X, Y) 

    if not direction: 
     return (corr, prb_2_tail) 

    prb_1_tail = prb_2_tail/2 
    if corr * direction > 0: 
     return (corr, prb_1_tail) 

    return (corr, 1 - prb_1_tail) 
+1

Я просто хотел заметить, что коэффициент корреляции не имеет никакой интерпретации как вероятность, поэтому это довольно запутанно. Это всего лишь мера линейной зависимости, принимающей значения в интервале [-1,1] –

+0

Коэффициент корреляции явно связан с вероятностью (посмотрите на значения возврата этой функции): http://docs.scipy.org/doc/scipy /reference/generated/scipy.stats.pearsonr.html Чем сильнее коэффициент, тем более вероятно, что две вещи действительно будут коррелированы. Вы могли бы принять корреляцию как факт, если вы пробовали полный юниверс, но если у вас ограниченный размер выборки, это всего лишь показатель корреляции: вероятность. –

+0

Коэффициент корреляции измеряет степень, в которой одно значение может быть предсказано, учитывая, что другое известно: это доля дисперсии в одной переменной, объясняемая другой. Просто потому, что он принимает значения от 0 до 1 (или его абсолютные значения), не означает, что это вероятность. Из-за этого он не принимает двоичные значения в пределе, как вы предлагаете: для бесконечных размеров выборки он все равно принимает любое значение в интервале [-1,1]. Его значение указывает на прочность связи, которая может быть слабой независимо от размера выборки. –

1

фургона с помощью SciPy точно правильно и используя scipy.stats.ttest_* функции очень удобно.

Но я пришел на эту страницу, чтобы найти решение с чистым numpy, как указано в заголовке, чтобы избежать скудной зависимости. С этой целью позвольте мне указать приведенный здесь пример: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.standard_t.html

Основная проблема заключается в том, что numpy не имеет кумулятивных функций распределения, поэтому мой вывод состоит в том, что вы действительно должны использовать scipy. Во всяком случае, возможно использование только numpy:

Из исходного вопроса я предполагаю, что вы хотите сравнить свои наборы данных и судить с помощью t-теста, есть ли значительное отклонение? Кроме того, что образцы спарены? (См https://en.wikipedia.org/wiki/Student%27s_t-test#Unpaired_and_paired_two-sample_t-tests) В этом случае, вы можете вычислить t- и р-значение следующим образом:

import numpy as np 
sample1 = np.array([55.0, 55.0, 47.0, 47.0, 55.0, 55.0, 55.0, 63.0]) 
sample2 = np.array([54.0, 56.0, 48.0, 46.0, 56.0, 56.0, 55.0, 62.0]) 
# paired sample -> the difference has mean 0 
difference = sample1 - sample2 
# the t-value is easily computed with numpy 
t = (np.mean(difference))/(difference.std(ddof=1)/np.sqrt(len(difference))) 
# unfortunately, numpy does not have a build in CDF 
# here is a ridiculous work-around integrating by sampling 
s = np.random.standard_t(len(difference), size=100000) 
p = np.sum(s<t)/float(len(s)) 
# using a two-sided test 
print("There is a {} % probability that the paired samples stem from distributions with the same means.".format(2 * min(p, 1 - p) * 100)) 

Это напечатает There is a 73.028 % probability that the paired samples stem from distributions with the same means. Поскольку это намного выше любой здравомыслящий доверительный интервал (скажем, 5%), вы должны не заключают ничего для конкретного случая.