web-dev-qa-db-de.com

So führen Sie einen einseitigen t-Test mit zwei Stichproben mit numpy/scipy durch

In R ist es möglich, einen einseitigen t-Test mit zwei Stichproben auf einfache Weise durchzuführen

> A = c(0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846)
> B = c(0.6383447, 0.5271385, 1.7721380, 1.7817880)
> t.test(A, B, alternative="greater")

    Welch Two Sample t-test

data:  A and B 
t = -0.4189, df = 6.409, p-value = 0.6555
alternative hypothesis: true difference in means is greater than 0 
95 percent confidence interval:
 -1.029916       Inf 
sample estimates:
mean of x mean of y 
0.9954942 1.1798523 

In der Python-Welt bietet scipy eine ähnliche Funktion ttest_ind , die jedoch nur zweiseitige t-Tests durchführen kann. Die nächstgelegenen Informationen zu dem gefundenen Thema sind this link, aber es scheint eher eine Diskussion über die Politik der Implementierung von einseitigem versus zwei-taktigem in scipy zu sein.

Daher ist meine Frage, dass jemand Beispiele oder Anweisungen zur Durchführung einer einseitigen Version des Tests mit numpy/scipy kennt.

28
Timo

Über den Link Ihrer Mailingliste:

weil die einseitigen Tests aus dem zweiseitigen .__ entfernt werden können. Tests. (Bei symmetrischen Verteilungen ist der einseitige p-Wert nur die Hälfte des zweiseitigen p-Werts.)

Es heißt weiter, dass Scipy die Teststatistik immer als unterzeichnet angibt. Dies bedeutet, dass Sie bei gegebenem p- und t-Wert aus einem zweiseitigen Test die Nullhypothese eines Größentests bei p/2 < alpha and t > 0 und eines Nicht-Testes bei p/2 < alpha and t < 0 ablehnen.

55
lvc

Nachdem ich versucht hatte, einige Erkenntnisse als Kommentare zu der akzeptierten Antwort hinzuzufügen, diese aber aufgrund allgemeiner Einschränkungen für Kommentare nicht richtig aufschreiben konnte, entschied ich mich, meine beiden Cents als vollständige Antwort einzusetzen.

Lassen Sie uns zuerst unsere Untersuchungsfrage richtig formulieren. Die Daten, die wir untersuchen, sind

A = np.array([0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846])
B = np.array([0.6383447, 0.5271385, 1.7721380, 1.7817880])

mit den beispielmitteln

A.mean() = 0.99549419
B.mean() = 1.1798523

Ich gehe davon aus, dass der Mittelwert von B offensichtlich größer ist als der Mittelwert von A, und Sie möchten prüfen, ob dieses Ergebnis statistisch signifikant ist.

Wir haben also die Nullhypothese

H0: A >= B

dass wir zugunsten der Alternativhypothese ablehnen möchten

H1: B > A

Wenn Sie nun scipy.stats.ttest_ind(x, y) aufrufen, führt dies zu einem Hypothesetest über den Wert von x.mean()-y.mean() aus. Das heißt, um positive Werte während der gesamten Berechnung zu erhalten (was alle Überlegungen vereinfacht), müssen wir aufrufen 

stats.ttest_ind(B,A)

anstelle von stats.ttest_ind(B,A). Wir bekommen eine Antwort

  • t-value = 0.42210654140239207
  • p-value = 0.68406235191764142

und da laut Dokumentation dies die Ausgabe für einen zweiseitigen t-Test ist, müssen wir die p für unseren einseitigen Test durch 2 dividieren. Abhängig von der Signifikanzstufe alpha, die Sie ausgewählt haben, benötigen Sie

p/2 < alpha

um die Nullhypothese H0 abzulehnen. Bei alpha=0.05 ist dies eindeutig nicht der Fall, so dass SieH0 nicht ablehnen können.

Eine alternative Methode, um zu entscheiden, ob Sie H0 ablehnen, ohne Algebra für t oder p ausführen zu müssen, besteht darin, den t-Wert zu betrachten und mit dem kritischen t-Wert t_crit auf der gewünschten Vertrauensstufe (z. B. 95%) zu vergleichen Anzahl der Freiheitsgrade df, die auf Ihr Problem zutreffen. Seit wir ... Haben

df = sample_size_1 + sample_size_2 - 2 = 8

wir erhalten aus einer statistischen Tabelle wie diese das

t_crit(df=8, confidence_level=95%) = 1.860

Das haben wir eindeutig

t < t_crit

so erhalten wir wieder dasselbe Ergebnis, nämlich dass wirH0 nicht ablehnen können.

5
bpirvu

Wenn die Nullhypothese Ho: P1>=P2 und die alternative Hypothese Ha: P1<P2 ist. Um es in Python zu testen, schreiben Sie ttest_ind(P2,P1). (Beachten Sie, dass die Position zuerst P2 ist). 

first = np.random.normal(3,2,400)
second = np.random.normal(6,2,400)
stats.ttest_ind(first, second, axis=0, equal_var=True)

Sie erhalten das Ergebnis wie folgt Ttest_indResult(statistic=-20.442436213923845,pvalue=5.0999336686332285e-75)

Wenn in Python statstic <0 der tatsächliche p-Wert tatsächlich real_pvalue = 1-output_pvalue/2= 1-5.0999336686332285e-75/2 ist, ist dies ungefähr 0,99. Da Ihr p-Wert größer als 0,05 ist, können Sie die Nullhypothese, dass 6> = 3 ist, nicht ablehnen. Wenn statstic >0 der tatsächliche z-Wert tatsächlich gleich -statstic ist, ist der tatsächliche p-Wert gleich pvalue/2.

Ivcs Antwort sollte lauten, wenn (1-p/2) < alpha and t < 0 die Hypothese weniger als abgelehnt werden kann. 

3
evapanda

Hast du dir das angesehen: Wie berechnet man die Statistik "t-test" mit numpy

Ich denke, genau das ist es, worum es in dieser Frage geht.

Grundsätzlich gilt:

import scipy.stats
x = [1,2,3,4]
scipy.stats.ttest_1samp(x, 0)

Ttest_1sampResult(statistic=3.872983346207417, pvalue=0.030466291662170977)

ist dasselbe Ergebnis wie dieses Beispiel in R. https://stats.stackexchange.com/questions/51242/statistical-difference-from-zero

1
Jorge