2013-02-22 16 views
46

Mam próbki danych, dla których chciałbym obliczyć przedział ufności, zakładając rozkład normalny.Oblicz przedział ufności na podstawie danych przykładowych.

Znalazłem i zainstalowałem pakiety numpy i scipy i otrzymałem numpy, aby zwrócić średnią i odchylenie standardowe (numpy.mean (dane) z danymi będącymi listą). Wszelkie porady dotyczące uzyskania próbnego przedziału ufności będą mile widziane.

Odpowiedz

82
import numpy as np 
import scipy as sp 
import scipy.stats 

def mean_confidence_interval(data, confidence=0.95): 
    a = 1.0*np.array(data) 
    n = len(a) 
    m, se = np.mean(a), scipy.stats.sem(a) 
    h = se * sp.stats.t._ppf((1+confidence)/2., n-1) 
    return m, m-h, m+h 

można obliczyć w ten sposób.

+1

sp.stats.stderr jest przestarzałe. Zastąpiłem sp.stats.sem i działało świetnie! – Bmayer0122

+1

Importowanie 'scipy' niekoniecznie automatycznie importuje wszystkie podpakiety. Lepiej zaimportować pakiet podrzędny 'scipy.statystyki jawnie. – Vikram

+22

Ostrożnie z "prywatnym" użyciem 'sp.stats.t._ppf'. Nie jestem z tym tak komfortowo bez dalszych wyjaśnień. Lepiej używać 'sp.stats.t.ppf' bezpośrednio, chyba że masz pewność, że wiesz, co robisz. Po szybkiej inspekcji [źródła] (https://github.com/scipy/scipy/blob/v0.13.0/scipy/stats/distributions.py#L1474) jest sporo kodu pomijanego przez '_ppf'. Być może łagodna, ale także potencjalnie niebezpieczna próba optymalizacji? – Russ

6

Zacznij od wyszukania wartości z-value, aby uzyskać pożądany przedział ufności od look-up table. Przedział ufności to zatem mean +/- z*sigma, gdzie sigma jest szacowanym odchyleniem standardowym średniej próbki, podanym przez sigma = s/sqrt(n), gdzie s jest odchyleniem standardowym obliczonym na podstawie danych próbki, a n jest wielkością próbki.

+20

'scipy.stats.norm.interval (confidence, loc = mean, scale = sigma) ' – Jaime

+0

Nie widziałem tej funkcji. Dzięki! – bogatron

+3

Pierwotny pytający wskazał, że należy przyjąć rozkład normalny, ale warto zauważyć, że dla małych populacji próbek (N <100 lub mniej), lepiej jest wyszukać z w [Rozmieszczenie t studenta] (http: //en.wikipedia.org/wiki/Student%27s_t-distribution) zamiast w [rozkład normalny] (http://en.wikipedia.org/wiki/Standard_normal_table). Odpowiedź shasana już to robi. – Russ

45

Oto skrócona wersja kodu shasan, w obliczeniu 95% przedział ufności średniej tablicy a:

import numpy as np, scipy.stats as st 

st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) 

Ale używając StatsModels' tconfint_mean niewątpliwie jest nawet ładniejszy:

import statsmodels.stats.api as sms 

sms.DescrStatsW(a).tconfint_mean() 

Podstawowymi założeniami dla obu są to, że próbka (tablica a) została pobrana niezależnie od rozkładu normalnego z nieznanym odchyleniem standardowym (patrz MathWorld lub Wikipedia).

Dla dużego rozmiaru próby n średnia próbka jest zwykle dystrybuowana i można obliczyć jej przedział ufności za pomocą st.norm.interval() (jak zasugerowano w komentarzu Jaime'a). Jednak powyższe rozwiązania są poprawne również dla małych n, gdzie st.norm.interval() daje przedziały ufności, które są zbyt wąskie (tj. "Fałszywe zaufanie"). Zobacz moje answer na podobne pytanie, aby uzyskać więcej szczegółów (i jeden z komentarzy Russa tutaj).

Oto przykład, gdzie właściwe opcje dać (zasadniczo) identyczne przedziały ufności:

In [9]: a = range(10,14) 

In [10]: mean_confidence_interval(a) 
Out[10]: (11.5, 9.4457397432391215, 13.554260256760879) 

In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) 
Out[11]: (9.4457397432391215, 13.554260256760879) 

In [12]: sms.DescrStatsW(a).tconfint_mean() 
Out[12]: (9.4457397432391197, 13.55426025676088) 

I wreszcie, nieprawidłowy wynik używając st.norm.interval():

In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a)) 
Out[13]: (10.23484868811834, 12.76515131188166) 
+0

Wierzę, że powinieneś wywoływać 'st.t.interval (0.05)', aby uzyskać 95% przedział ufności. – Scimonster

+1

Nie, 'st.t.interval (0.95)' jest poprawny dla 95% przedziału ufności, zobacz [docs] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats. t.html) dla 'scipy.stats.t'. SciPy nazwał argument "alfa", ale wydaje się mniej niż idealny. –

Powiązane problemy