2016-05-04 15 views
5

Ho un problema nel fare un test t in scipy che mi sta facendo impazzire lentamente. Dovrebbe essere semplice da risolvere, ma niente di ciò che faccio funziona e non c'è una soluzione che possa trovare attraverso una ricerca approfondita. Sto usando Spyder nell'ultima distribuzione di Anaconda.Test T in Scipy con valori NaN

In particolare: voglio confrontare i mezzi tra due colonne - "Trait_A" e "Trait_B" - in un dataframe panda che ho importato da un file csv. Alcuni dei valori in una delle colonne sono "Nan" ("Not a Number"). L'impostazione predefinita sulla funzione scipy t-test dei campioni indipendenti non supporta i valori 'NaN'. Tuttavia, setting the 'nan_policy' parameter to 'omit' should deal with this. Tuttavia, quando lo faccio, la statistica del test e il valore p tornano come "NaN". Quando limito l'intervallo di valori coperti da numeri reali, il test funziona correttamente. I miei dati e il codice sono sotto; qualcuno può suggerire cosa sto facendo di sbagliato? Grazie!

dati:

 Trait_A Trait_B 
0 1.714286 0.000000 
1 4.275862 4.000000 
2 0.500000 4.625000 
3 1.000000 0.000000 
4 1.000000 4.000000 
5 1.142857 1.000000 
6 2.000000 1.000000 
7 9.416667 1.956522 
8 2.052632 0.571429 
9 2.100000 0.166667 
10 0.666667 0.000000 
11 2.333333 1.705882 
12 2.768145  NaN 
13 0.000000  NaN 
14 6.333333  NaN 
15 0.928571  NaN 

Il mio codice:

import pandas as pd 
import scipy.stats as sp 
data= pd.read_csv("filepath/Data2.csv") 
print (sp.stats.ttest_ind(data['Trait_A'], data['Trait_B'], nan_policy='omit'))  

Il mio risultato:

Ttest_indResult(statistic=nan, pvalue=nan) 

risposta

10

Sembra come un insetto. Si può cadere nan s prima di passarli al t-test:

sp.stats.ttest_ind(data.dropna()['Trait_A'], data.dropna()['Trait_B']) 
Ttest_indResult(statistic=0.88752464718609214, pvalue=0.38439692093551037) 
+1

Grazie mille! Funziona esattamente come speravo; sembra che sia un bug di sicuro. Lo segnalerò agli sviluppatori Scipy. – Lodore66

+1

Quale versione di Scipy stai usando? (nan_policy è nuovo nella versione 0.17.) se è 0.17 o superiore, si prega di fare un errore di file –

+0

Sto usando la versione 0.17 - quindi sì, il bug sarà archiviato. – Lodore66

1

Il bug è in linea 3885, nel file di SciPy/SciPy/statistiche/stats.py:

# check both a and b 
contains_nan, nan_policy = (_contains_nan(a, nan_policy) or 
          _contains_nan(b, nan_policy)) 

deve essere

contains_nan    = (_contains_nan(a, nan_policy)[0] or 
          _contains_nan(b, nan_policy)[0]) 

scambiando 'Trait_A' e 'Trait_B' nel tuo caso a risolvere il problema.

+0

Utile da sapere - grazie per la soluzione! – Lodore66