2014-03-24 14 views
13

Ich habe einen Mittelwert, Std Dev und N von Probe 1 und Probe 2 - Proben werden aus der Stichprobe Population genommen, aber von verschiedenen Labors gemessen.Führen Sie 2 Probe t-Test

n ist für Probe 1 und Probe 2 unterschiedlich. Ich möchte einen gewichteten (t berücksichtigen) two-tailed t-test machen.

Ich habe versucht, mit dem scipy.stat Modul durch die Erstellung meiner Nummern mit np.random.normal, da es nur Daten und nicht Stat-Werte wie Mittelwert und Std-Dev (gibt es eine Möglichkeit, diese Werte direkt zu verwenden). Aber es hat nicht funktioniert, da die Datenfelder von gleicher Größe sein müssen.

Jede Hilfe auf, wie man den p-Wert erhält, würde sehr geschätzt.

+2

Soweit ich verstehe, Welch-t-Test für das ungepaarte Fall ist (dh nicht-Proben verwandt) ... – rroowwllaanndd

+0

Sie haben "(bezogen)" in der Fragetitel. Wie @rroowwllaanndd hervorhebt, ist Welchs t-Test für unabhängige Stichproben. Wenn Sie etwas anderes im Sinn haben, erklären Sie es bitte. –

+0

Ich habe die Frage aktualisiert. Hoffe, es ist jetzt klarer – Norfeldt

Antwort

36

Wenn Sie die Originaldaten als Arrays a und b haben, können Sie scipy.stats.ttest_ind mit dem Argument verwenden equal_var=False:

t, p = ttest_ind(a, b, equal_var=False) 

Wenn Sie nur die Auswertungsstatistik von Mit den beiden Datensätzen können Sie den Wert t unter Verwendung von scipy.stats.ttest_ind_from_stats (in Version 0.16 zu scipy hinzugefügt) oder anhand der Formel (http://en.wikipedia.org/wiki/Welch%27s_t_test) berechnen.

Das folgende Skript zeigt die Möglichkeiten.

from __future__ import print_function 

import numpy as np 
from scipy.stats import ttest_ind, ttest_ind_from_stats 
from scipy.special import stdtr 

np.random.seed(1) 

# Create sample data. 
a = np.random.randn(40) 
b = 4*np.random.randn(50) 

# Use scipy.stats.ttest_ind. 
t, p = ttest_ind(a, b, equal_var=False) 
print("ttest_ind:   t = %g p = %g" % (t, p)) 

# Compute the descriptive statistics of a and b. 
abar = a.mean() 
avar = a.var(ddof=1) 
na = a.size 
adof = na - 1 

bbar = b.mean() 
bvar = b.var(ddof=1) 
nb = b.size 
bdof = nb - 1 

# Use scipy.stats.ttest_ind_from_stats. 
t2, p2 = ttest_ind_from_stats(abar, np.sqrt(avar), na, 
           bbar, np.sqrt(bvar), nb, 
           equal_var=False) 
print("ttest_ind_from_stats: t = %g p = %g" % (t2, p2)) 

# Use the formulas directly. 
tf = (abar - bbar)/np.sqrt(avar/na + bvar/nb) 
dof = (avar/na + bvar/nb)**2/(avar**2/(na**2*adof) + bvar**2/(nb**2*bdof)) 
pf = 2*stdtr(dof, -np.abs(tf)) 

print("formula:    t = %g p = %g" % (tf, pf)) 

Der Ausgang:

ttest_ind:   t = -1.5827 p = 0.118873 
ttest_ind_from_stats: t = -1.5827 p = 0.118873 
formula:    t = -1.5827 p = 0.118873 
+0

Vielen Dank. Speziell für die 'stdtr' - sehr nützlich – Norfeldt

+0

Wenn man nur die Statistik hat, kann man scipy.stats.test_ind_from_stats (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind_from_stats. html # scipy.stats.test_ind_from_stats) –

+0

@JensdeBruijn Danke für die Erinnerung. "ttest_ind_from_stats" wurde zu scipy hinzugefügt, nachdem diese Antwort ursprünglich geschrieben wurde. Ich habe die Antwort aktualisiert, um sie einzuschließen. –

2

Mit einer aktuellen Version von Scipy 0.12.0 ist diese Funktionalität integriert (und funktioniert tatsächlich bei Proben unterschiedlicher Größe). In scipy.stats führt die ttest_ind-Funktion den Welch-T-Test durch, wenn das Flag equal_var auf False gesetzt ist.

Zum Beispiel:

>>> import scipy.stats as stats 
>>> sample1 = np.random.randn(10, 1) 
>>> sample2 = 1 + np.random.randn(15, 1) 
>>> t_stat, p_val = stats.ttest_ind(sample1, sample2, equal_var=False) 
>>> t_stat 
array([-3.94339083]) 
>>> p_val 
array([ 0.00070813])