web-dev-qa-db-fra.com

Fonction Python pour obtenir la statistique t

Je suis à la recherche d’une fonction Python (ou d’écrire la mienne s’il n’en existe pas) pour obtenir la statistique t afin de pouvoir l’utiliser dans un calcul d’intervalle de confiance.

J'ai trouvé des tableaux donnant des réponses pour diverses probabilités/degrés de liberté comme celui-ci , mais j'aimerais pouvoir le calculer pour toute probabilité donnée. Pour les personnes qui ne sont pas déjà familiarisées avec ces degrés de liberté, le nombre de points de données (n) dans votre échantillon est -1 et les nombres pour les en-têtes de colonne en haut sont des probabilités (p), par exemple. un niveau de signification bilatéral de 0,05 est utilisé si vous recherchez le t-score à utiliser dans le calcul avec une certitude de 95% que si vous répétez n tests, le résultat se situe dans les limites de la moyenne +/- l'intervalle de confiance.

J'ai envisagé d'utiliser diverses fonctions dans scipy.stats, mais aucune de celles que je vois ne semble autoriser les simples entrées décrites ci-dessus.

Excel a une implémentation simple de cet exemple. pour obtenir le t-score pour un échantillon de 1 000, où je dois être sûr à 95%, je voudrais utiliser: =TINV(0.05,999) et obtenir le score ~ ​​1,96

Voici le code que j’ai utilisé jusqu’à présent pour mettre en œuvre les intervalles de confiance. Comme vous pouvez le constater, j’utilise actuellement un moyen très grossier d’obtenir le t-score. échantillons <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

Voici un exemple d'appel pour le code ci-dessus:

# 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).' 

La sortie pour ceci est:

Je peux être sûr à 95% que le résultat de 1000 lancers sera de dans les +/- 3,1% de 500, c'est-à-dire entre 469 et 531 têtes (en supposant une probabilité de de 0,5 pour chaque retournement).

J'ai également cherché à calculer la distribution t pour une plage, puis à renvoyer le score t qui obtenait la probabilité la plus proche de celle requise, mais la mise en œuvre de la formule me posait problème. Faites-moi savoir si cela est pertinent et si vous voulez voir le code, mais je suppose que non, car il existe probablement un moyen plus facile.

Merci d'avance.

24
ChrisProsser

Avez-vous essayé Scipy?

Vous devrez installer la bibliothèque scipy ... pour plus d'informations sur son installation, cliquez ici: http://www.scipy.org/install.html

Une fois installé, vous pouvez répliquer les fonctionnalités d'Excel telles que:

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)

Vous pouvez également lire sur l’installation de la bibliothèque ici: comment installer scipy pour python?

38
henderso

Essayez le code suivant:

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

Vous pouvez essayer ce code:

# 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