Cómo calcular las estadísticas “t-test” con numpy

Estoy buscando generar algunas estadísticas sobre un modelo que creé en Python. Me gustaría generar el t-test en él, pero me preguntaba si había una manera fácil de hacer esto con adormecer / escéptico. ¿Hay buenas explicaciones alrededor?

Por ejemplo, tengo tres conjuntos de datos relacionados que se parecen a esto:

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

Ahora, me gustaría hacer la prueba t de los estudiantes en ellos.

En un paquete scipy.stats hay pocas funciones ttest_... Ver ejemplo desde aquí :

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

La respuesta de van utilizando scipy es exactamente correcta y usar las funciones scipy.stats.ttest_* es muy conveniente.

Pero vine a esta página en busca de una solución con números puros, como se indica en el encabezado, para evitar la dependencia escéptica. Para este fin, permítanme señalar el ejemplo dado aquí: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.standard_t.html

El problema principal es que ese número no tiene funciones de distribución acumulativa, por lo que mi conclusión es que realmente debería usar scipy. De todos modos, usar solo numpy es posible:

A partir de la pregunta original, supongo que desea comparar sus conjuntos de datos y juzgar con una prueba t si existe una desviación significativa. Además, que las muestras están emparejadas? (Consulte https://en.wikipedia.org/wiki/Student%27s_t-test#Unpaird_and_paird_two-sample_t-tests ) En ese caso, puede calcular el valor de t y p de la siguiente manera:

 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]) # paird 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 

Esto se imprimirá. There is a 73.028 % probability that the paird samples stem from distributions with the same means. Dado que esto está muy por encima de cualquier intervalo de confianza sano (por ejemplo, 5%), no debe concluir nada para el caso concreto.

Una vez que obtenga su valor t, puede preguntarse cómo interpretarlo como una probabilidad, lo hice. Aquí hay una función que escribí para ayudar con eso.

Se basa en la información que obtuve de http://www.vassarstats.net/rsig.html y 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)