Tính khoảng tin cậy từ dữ liệu mẫu


109

Tôi có dữ liệu mẫu mà tôi muốn tính khoảng tin cậy, giả sử là phân phối chuẩn.

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


1
Tôi nghĩ rằng bạn chắc chắn chỉ định nếu bạn muốn tính CI cho trung bình mẫu hoặc trung bình dân số. Điều đó sẽ xác định xem bạn muốn sử dụng phân phối chuẩn hay t để tính điểm z. Và câu trả lời hàng đầu bên dưới là cho giá trị trung bình mẫu, vì vậy ở phân phối được sử dụng.
Jake

Câu trả lời:


162
import numpy as np
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 * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
    return m, m-h, m+h

bạn có thể tính toán như thế 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 tốt!
Bmayer0122

1
Việc nhập scipykhông nhất thiết phải tự động nhập tất cả các gói con. Tốt hơn nên nhập gói phụ scipy.statsmột cách rõ ràng.
Vikram

31
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 đó trong đó mà không cần giải thích thêm. Tốt hơn nên sử dụng sp.stats.t.ppftrực tiếp, trừ khi bạn chắc chắn rằng mình biết mình đang làm gì. Khi kiểm tra nhanh nguồn, có một lượng mã hợp lý bị bỏ qua _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

Tôi thích nó vì bạn chỉ có thể thêm *ss.t._ppf((1+conf)/2.,n-1) vào các built-in gấu trúc dataframe .semphương pháp, do đó bạn không cần phải lo lắng vềapply
TNT

1
Chỉ muốn làm rõ tính toán này là cho trung bình mẫu, vì vậy ở phân phối được sử dụng. Nếu các câu hỏi là để tính giá trị trung bình của tổng thể, thì nên sử dụng phân phối chuẩn và khoảng tin cậy sẽ nhỏ hơn cho cùng mức độ tin cậy.
Jake

133

Đây là phiên bản rút gọn của mã shasan, tính 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à còn đẹ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 với độ lệch chuẩn chưa biết (xem MathWorld hoặc Wikipedia ).

Đối với cỡ mẫu lớn n, giá trị trung bình của mẫu được phân phối chuẩn và người ta có thể tính khoảng tin cậy của nó 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 n nhỏ, nơi st.norm.interval()cung cấp khoảng tin cậy quá hẹp (tức là "độ tin cậy giả"). Xem câu trả lời 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 cung cấp (về cơ bản) các khoảng tin cậy giống hệt nhau:

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 khi 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)

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

5
Không, st.t.interval(0.95)đúng cho khoảng tin cậy 95%, hãy xem tài liệu cho scipy.stats.t. Tuy nhiên, việc đặt tên cho đối số của SciPy alphacó vẻ ít lý tưởng hơn.
Ulrich Stern

Nếu tôi có hai mảng dữ liệu và sau đó tính toán sự khác biệt của giá trị trung bình của chúng. Có cách nào để có được KTC 95% cho sự khác biệt trung bình này không? Bạn có thể nghĩ ra bất kỳ cách dễ dàng nào để thực hiện như cách bạn cung cấp ở đây bằng cách sử dụng StatsModelsl không?
steven

@steven, hóa ra, tôi đã trả lời một câu hỏi về điều này. :)
Ulrich Stern

16

Bắt đầu với việc tra cứu giá trị z cho khoảng tin cậy mong muốn của bạn từ bảng tra cứu . Sau đó mean +/- z*sigma, khoảng tin cậy là , đâu sigmalà độ lệch chuẩn ước tính của giá trị trung bình mẫu của bạn, được cho bởi sigma = s / sqrt(n), đâu slà độ lệch chuẩn được tính từ dữ liệu mẫu và nlà kích thước mẫu của bạn.


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

4
Người hỏi ban đầu chỉ ra rằng phân phối chuẩn đã được giả định, nhưng cần chỉ ra rằng, đối với các quần thể mẫu nhỏ (N <100 hoặc lâu hơn), tốt hơn nên tra cứu z trong phân phối Student t thay vì trong phân phối chuẩn . Câu trả lời của shasan đã làm được điều này.
Russ

3
@bogatron, về phép tính được đề xuất cho khoảng tin cậy, sẽ không có nghĩa là +/- z * sigma / sqrt (n) , trong đó n là cỡ mẫu?
David

3
@David, bạn nói đúng. Tôi đã hiểu sai ý nghĩa của sigma. sigmatrong câu trả lời của tôi nên là độ lệch chuẩn ước tính của trung bình mẫu, không phải độ lệch chuẩn ước tính của phân phối. Tôi đã cập nhật câu trả lời để làm rõ điều đó. Cảm ơn vì đã chỉ ra điều đó.
bogatron

15

Bắt đầu Python 3.8, thư viện chuẩn cung cấp NormalDistđối tượng như một phần của statisticsmô-đun:

from statistics import NormalDist

def confidence_interval(data, confidence=0.95):
  dist = NormalDist.from_samples(data)
  z = NormalDist().inv_cdf((1 + confidence) / 2.)
  h = dist.stdev * z / ((len(data) - 1) ** .5)
  return dist.mean - h, dist.mean + h

Điều này:

  • Tạo một NormalDistđối tượng từ mẫu dữ liệu ( NormalDist.from_samples(data), cho phép chúng tôi truy cập vào giá trị trung bình và độ lệch chuẩn của mẫu thông qua NormalDist.meanNormalDist.stdev.

  • Tính toán Z-scoredựa trên phân phối chuẩn chuẩn (được biểu thị bằng NormalDist()) cho độ tin cậy đã cho bằng cách sử dụng nghịch đảo của hàm phân phối tích lũy ( inv_cdf).

  • Tạo khoảng tin cậy dựa trên độ lệch chuẩn và giá trị trung bình của mẫu.


Điều này giả sử kích thước mẫu đủ lớn (giả sử hơn ~ 100 điểm) để sử dụng phân phối chuẩn chuẩn thay vì phân phối t của học sinh để tính zgiá trị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.