2013-02-22 37 views
46

Tôi có dữ liệu mẫu mà tôi muốn tính toán khoảng tin cậy cho, giả định một phân bố chuẩn.Tính toán khoảng tin cậy từ dữ liệu mẫu

Tôi đã tìm thấy và cài đặt các gói gọn gàng và scipy và đã nhận được numpy để trả về độ lệch trung bình và chuẩn (numpy.mean (dữ liệu) với dữ liệu là danh sách). Bất kỳ lời khuyên nào về việc nhận được khoảng tin cậy mẫu sẽ được đánh giá cao.

Trả lời

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 

bạn có thể tính toán theo cách này.

+1

sp.stats.stderr không được dùng nữa. Tôi thay thế sp.stats.sem và nó hoạt động rất tốt! – Bmayer0122

+1

Nhập 'scipy' không nhất thiết phải nhập tất cả các gói phụ tự động. Tốt hơn là nhập gói phụ 'scipy.stats' một cách rõ ràng. – Vikram

+22

Cẩn thận với việc sử dụng "riêng tư" của 'sp.stats.t._ppf'. Tôi không thoải mái với điều đó mà không giải thích thêm. Tốt hơn nên sử dụng trực tiếp 'sp.stats.t.ppf', trừ khi bạn chắc chắn mình biết mình đang làm gì. Khi kiểm tra nhanh [nguồn] (https://github.com/scipy/scipy/blob/v0.13.0/scipy/stats/distributions.py#L1474), có một số lượng mã được bỏ qua bằng '_ppf'. Có thể lành tính, nhưng cũng có thể là một nỗ lực tối ưu hóa không an toàn? – Russ

6

Bắt đầu bằng cách tra cứu z-value cho khoảng tin cậy mong muốn của bạn từ look-up table. Khoảng tin cậy sau đó là mean +/- z*sigma, trong đó sigma là độ lệch chuẩn ước tính trung bình mẫu của bạn, được cho bởi sigma = s/sqrt(n), trong đó s là độ lệch chuẩn được tính từ dữ liệu mẫu của bạn và n là kích thước mẫu của bạn.

+20

'scipy.stats.norm.interval (sự tự tin, loc = mean, scale = sigma) ' – Jaime

+0

Tôi đã không thấy hàm đó. Cảm ơn! – bogatron

+3

Người hỏi ban đầu chỉ ra rằng phân bố bình thường được giả định, nhưng đáng lưu ý là đối với các quần thể mẫu nhỏ (N <100 hoặc hơn), tốt hơn là tìm kiếm z trong [Phân phối của sinh viên] (http: //en.wikipedia.org/wiki/Student%27s_t-distribution) thay vì trong [phân phối bình thường] (http://en.wikipedia.org/wiki/Standard_normal_table). câu trả lời của shasan đã làm điều này. – Russ

45

Dưới đây là một phiên bản rút gọn của mã shasan của, tính toán khoảng tin cậy 95% của giá trị trung bình của mảng 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)) 

Nhưng sử dụng StatsModels' tconfint_mean được cho là thậm chí đẹp hơn:

import statsmodels.stats.api as sms 

sms.DescrStatsW(a).tconfint_mean() 

Các giả định cơ bản cho cả hai là mẫu (mảng a) được vẽ độc lập với phân phối chuẩn không có độ lệch chuẩn (xem MathWorld hoặc Wikipedia).

Đối với cỡ mẫu lớn n, trung bình mẫu được phân bố bình thường và có thể tính khoảng tin cậy bằng cách sử dụng st.norm.interval() (như được đề xuất trong nhận xét của Jaime). Nhưng các giải pháp trên cũng đúng đối với các n nhỏ, trong đó st.norm.interval() cho các khoảng tin cậy quá hẹp (tức là "sự tự tin giả"). Xem answer của tôi cho một câu hỏi tương tự để biết thêm chi tiết (và một trong những nhận xét của Russ tại đây).

Dưới đây là một ví dụ trong đó các tùy chọn đúng cho (chủ yếu) giống hệt nhau khoảng tin cậy:

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) 

Và cuối cùng, kết quả không chính xác sử dụng 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

Tôi tin rằng bạn nên gọi 'st.t.interval (0.05)' để có được khoảng tin cậy 95%. – Scimonster

+1

Không, 'st.t.interval (0.95)' là chính xác cho khoảng tin cậy 95%, xem [docs] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats. t.html) cho 'scipy.stats.t'. SciPy đặt tên cho đối số 'alpha' có vẻ ít hơn lý tưởng. –

Các vấn đề liên quan