web-dev-qa-db-de.com

Python-Funktion zum Abrufen der T-Statistik

Ich suche nach einer Python-Funktion (oder um meine eigene zu schreiben, wenn es keine gibt), um die T-Statistik zu erhalten, um sie in einer Konfidenzintervallberechnung zu verwenden.

Ich habe Tabellen gefunden, die Antworten auf verschiedene Wahrscheinlichkeiten/Freiheitsgrade wie this geben, aber ich möchte dies für jede gegebene Wahrscheinlichkeit berechnen können. Für jeden, der diesen Freiheitsgrad noch nicht kennt, ist die Anzahl der Datenpunkte (n) in Ihrer Stichprobe -1 und die Zahlen für die Spaltenüberschriften oben sind Wahrscheinlichkeiten (p), z. Ein 2-taktiges Signifikanzniveau von 0,05 wird verwendet, wenn Sie den in der Berechnung zu verwendenden T-Score für 95% ige Sicherheit nachschlagen, wenn Sie n Tests wiederholen, würde das Ergebnis innerhalb des Mittelwerts +/- des Konfidenzintervalls liegen.

Ich habe mich mit verschiedenen Funktionen in scipy.stats beschäftigt, aber keine, die ich sehen kann, scheint die einfachen Eingaben zuzulassen, die ich oben beschrieben habe.

Excel hat eine einfache Implementierung davon, z. Um den t-Score für eine Stichprobe von 1000 zu erhalten, bei dem ich zu 95% überzeugt sein muss, würde ich Folgendes verwenden: =TINV(0.05,999) und den Score ~ ​​1,96

Hier ist der Code, den ich bisher verwendet habe, um Konfidenzintervalle zu implementieren. Wie Sie sehen, verwende ich derzeit einen sehr groben Weg, um den T-Score zu erhalten (nur einige Werte für perc_conf zulassen und Warnungen, für die er nicht genau ist Proben <1000):

# -*- coding: utf-8 -*-
from __future__ import division
import math

def mean(lst):
    # μ = 1/N Σ(xi)
    return sum(lst) / float(len(lst))

def variance(lst):
    """
    Uses standard variance formula (sum of each (data point - mean) squared)
    all divided by number of data points
    """
    # σ² = 1/N Σ((xi-μ)²)
    mu = mean(lst)
    return 1.0/len(lst) * sum([(i-mu)**2 for i in lst])

def conf_int(lst, perc_conf=95):
    """
    Confidence interval - given a list of values compute the square root of
    the variance of the list (v) divided by the number of entries (n)
    multiplied by a constant factor of (c). This means that I can
    be confident of a result +/- this amount from the mean.
    The constant factor can be looked up from a table, for 95% confidence
    on a reasonable size sample (>=500) 1.96 is used.
    """
    if perc_conf == 95:
        c = 1.96
    Elif perc_conf == 90:
        c = 1.64
    Elif perc_conf == 99:
        c = 2.58
    else:
        c = 1.96
        print 'Only 90, 95 or 99 % are allowed for, using default 95%'
    n, v = len(lst), variance(lst)
    if n < 1000:
        print 'WARNING: constant factor may not be accurate for n < ~1000'
    return math.sqrt(v/n) * c

Hier ist ein Beispiel für den obigen Code:

# Example: 1000 coin tosses on a fair coin. What is the range that I can be 95%
#          confident the result will f all within.

# list of 1000 perfectly distributed...
perc_conf_req = 95
n, p = 1000, 0.5 # sample_size, probability of heads for each coin
l = [0 for i in range(int(n*(1-p)))] + [1 for j in range(int(n*p))]
exp_heads = mean(l) * len(l)
c_int = conf_int(l, perc_conf_req)

print 'I can be '+str(perc_conf_req)+'% confident that the result of '+str(n)+ \
      ' coin flips will be within +/- '+str(round(c_int*100,2))+'% of '+\
      str(int(exp_heads))
x = round(n*c_int,0)
print 'i.e. between '+str(int(exp_heads-x))+' and '+str(int(exp_heads+x))+\
      ' heads (assuming a probability of '+str(p)+' for each flip).' 

Die Ausgabe dafür ist:

Ich kann zu 95% sicher sein, dass das Ergebnis von 1000 Münzwürfeln .__ sein wird. innerhalb von +/– 3,1% von 500, d. h. zwischen 469 und 531 Köpfen (unter Annahme einer Wahrscheinlichkeit von 0,5 für jeden Flip).

Ich habe mich auch mit der Berechnung der t-Verteilung für einen Bereich beschäftigt und dann den T-Score zurückgegeben, der die Wahrscheinlichkeit am nächsten kam, aber ich hatte Probleme mit der Implementierung der Formel. Lassen Sie mich wissen, ob dies relevant ist und Sie den Code sehen möchten, aber ich habe nicht angenommen, da es wahrscheinlich einen einfacheren Weg gibt.

Danke im Voraus.

24
ChrisProsser

Hast du scipy ausprobiert?

Sie müssen die Scipy-Bibliothek installieren ... Weitere Informationen zur Installation finden Sie hier: http://www.scipy.org/install.html

Nach der Installation können Sie die Excel-Funktionalität wie folgt replizieren:

from scipy import stats
#Studnt, n=999, p<0.05, 2-tail
#equivalent to Excel TINV(0.05,999)
print stats.t.ppf(1-0.025, 999)

#Studnt, n=999, p<0.05%, Single tail
#equivalent to Excel TINV(2*0.05,999)
print stats.t.ppf(1-0.05, 999)

Sie können hier auch lesen, wie Sie die Bibliothek installieren: Wie installiere ich scipy für Python?

38
henderso

Versuchen Sie den folgenden Code:

from scipy import stats
#Studnt, n=22,  2-tail
#stats.t.ppf(1-0.025, df)
# df=n-1=22-1=21
print (stats.t.ppf(1-0.025, 21))
3
javac

Sie können diesen Code ausprobieren:

# for small samples (<50) we use t-statistics
# n = 9, degree of freedom = 9-1 = 8
# for 99% confidence interval, alpha = 1% = 0.01 and alpha/2 = 0.005
from scipy import stats

ci = 99
n = 9
t = stats.t.ppf(1- ((100-ci)/2/100), n-1) # 99% CI, t8,0.005
print(t) # 3.36
0
user8864088