2010-02-24 14 views
22

Sto cercando di generare alcune statistiche su un modello che ho creato in python. Mi piacerebbe generare il t-test su di esso, ma mi chiedevo se esistesse un modo semplice per farlo con numpy/scipy. Ci sono buone spiegazioni in giro?Come calcolare le statistiche "t-test" con numpy

Per esempio, ho tre insiemi di dati correlati che assomigliano a questo:

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

Ora, vorrei fare t-test dello studente su di loro.

risposta

26

In un pacchetto scipy.stats ci sono alcune funzioni . Vedi l'esempio da here:

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

grazie per la risposta. sembra prendere una variabile casuale. Devo generare una variabile casuale dalla mia popolazione di esempio? – Mark

+0

Penso che puoi semplicemente utilizzare il campione (non "campione di popolazione") – van

+0

Campione come in un valore campione? Avevo l'impressione che potessi usare un parametro di diversi risultati come parametro, ma forse ero indotto in errore :) – Mark

-4

Dopo aver ottenuto i t-valore, ci si potrebbe chiedere come interpretare come una probabilità - l'ho fatto. Ecco una funzione che ho scritto per aiutarti.

Si basa sulle informazioni che ho ricavato da http://www.vassarstats.net/rsig.html e http://en.wikipedia.org/wiki/Student%27s_t_distribution. risposta

# 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

Volevo solo notare che il coefficiente di correlazione non ha alcuna interpretazione come probabilità, quindi questo è abbastanza confuso. È solo una misura della dipendenza lineare che assume valori nell'intervallo [-1,1] –

+0

Il coefficiente di correlazione è chiaramente correlato alla probabilità (guarda i valori di ritorno di questa funzione): http://docs.scipy.org/doc/scipy /reference/generated/scipy.stats.pearsonr.html Più forte è il coefficiente, più è probabile che due cose siano realmente correlate. Potresti considerare la correlazione come un fatto se hai campionato l'intero universo, ma se hai una dimensione campione limitata, è solo un'indicazione di correlazione: una probabilità. –

+0

Il coefficiente di correlazione misura la misura in cui un valore può essere previsto dato che l'altro è noto: è la proporzione della varianza in una variabile spiegata dall'altra. Solo perché assume valori compresi tra 0 e 1 (oi suoi valori assoluti sì) non significa che sia una probabilità. Per questo motivo, non accetta valori binari nel limite, come suggerito: per infinite dimensioni del campione, esso prende comunque qualsiasi valore nell'intervallo [-1,1]. Il suo valore indica la forza della relazione, che potrebbe essere debole indipendentemente dalle dimensioni del campione. –

1

del furgone usando SciPy è esattamente a destra e utilizzando le funzioni scipy.stats.ttest_* è molto conveniente.

Ma sono venuto in questa pagina cercando una soluzione con puro numpy, come indicato nell'intestazione, per evitare la dipendenza da scipy. A tal fine, vorrei farvi notare l'esempio qui riportato: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.standard_t.html

Il problema principale è che il numpy non ha funzioni di distribuzione cumulative, quindi la mia conclusione è che si dovrebbe usare veramente scipy. Ad ogni modo, usando solo numpy è possibile:

Dalla domanda iniziale, immagino che tu voglia confrontare i tuoi set di dati e giudicare con un t-test se c'è una deviazione significativa? Inoltre, che i campioni sono accoppiati? (Vedere https://en.wikipedia.org/wiki/Student%27s_t-test#Unpaired_and_paired_two-sample_t-tests) In tal caso, è possibile calcolare la T e p-value in questo modo:

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)) 

questo stampa There is a 73.028 % probability that the paired samples stem from distributions with the same means. Dal momento che questo è di gran lunga al di sopra qualsiasi intervallo di confidenza sano di mente (ad esempio 5%), si dovrebbe non concludere nulla per il caso concreto.

Problemi correlati