2010-02-24 6 views
22

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 numpy/scipy. ¿Hay alguna buena explicación?Cómo calcular las estadísticas "t-test" con numpy

Por ejemplo, tengo tres conjuntos de datos relacionados con este aspecto:

[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 estudiante en ellos.

Respuesta

26

En un paquete scipy.stats hay pocas funciones de ttest_.... Véase el ejemplo de here:

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

gracias por responder. parece tomar una variable aleatoria. ¿Tengo que generar una variable aleatoria de mi población de muestra de antemano? – Mark

+0

Creo que puede usar su muestra (no "población de muestra") – van

+0

¿Muestra como en un valor de muestra? Tenía la impresión de que podía usar una muestra de varios resultados como parámetro, pero tal vez me engañaron :) – Mark

-4

vez que obtenga su valor t, usted puede preguntarse cómo interpretarlo como una probabilidad - que 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. respuesta

# 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

Solo quería señalar que el coeficiente de correlación no tiene ninguna interpretación como probabilidad, por lo que es bastante confuso. Es solo una medida de la dependencia lineal que toma valores en el intervalo [-1,1] –

+0

El coeficiente de correlación está claramente relacionado con la probabilidad (consulte los valores de retorno de esta función): http://docs.scipy.org/doc/scipy /reference/generated/scipy.stats.pearsonr.html Cuanto más fuerte sea el coeficiente, más probabilidades hay de que dos cosas se correlacionen. Podría tomar la correlación como un hecho si muestreara el universo completo, pero si tiene un tamaño de muestra limitado, es solo una indicación de correlación: una probabilidad. –

+0

El coeficiente de correlación mide el grado en que un valor puede predecirse dado que el otro es conocido: es la proporción de varianza en una variable explicada por la otra. Solo porque tome valores entre 0 y 1 (o sus valores absolutos sí) no significa que sea una probabilidad. Debido a esto, no toma valores binarios en el límite, como sugiere: para tamaños de muestra infinitos, aún toma cualquier valor en el intervalo [-1,1]. Su valor indica la fuerza de la relación, que podría ser débil independientemente del tamaño de la muestra. –

1

de van utilizando scipy es exactamente correcto y el uso de las funciones scipy.stats.ttest_* es muy conveniente.

Pero llegué a esta página buscando una solución con numpy puro, como se indica en el encabezado, para evitar la dependencia scipy. Con 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 numpy no tiene funciones de distribución acumulativa, por lo tanto, mi conclusión es que realmente debería usar scipy. De todos modos, usando numpy es posible:

De la pregunta original supongo que quiere comparar sus conjuntos de datos y juzgar con una prueba t si hay una desviación significativa? Además, ¿las muestras están emparejadas? (Ver https://en.wikipedia.org/wiki/Student%27s_t-test#Unpaired_and_paired_two-sample_t-tests) En ese caso, se puede calcular el t y el valor p de esta 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]) 
# 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)) 

Esto imprimirá There is a 73.028 % probability that the paired samples stem from distributions with the same means. Puesto que esto es muy por encima de cualquier intervalo de confianza en su sano juicio (por ejemplo 5%), que debiera no concluir nada para el caso concreto.

Cuestiones relacionadas