从样本数据计算置信区间

我有样本数据,我想计算一个置信区间,假设一个正态分布。

我发现并安装了numpy和scipy软件包,并得到numpy返回一个平均值和标准偏差(numpy.mean(数据)与数据列表)。 获得样本置信区间的任何build议将不胜感激。

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, mh, m+h 

你可以像这样计算。

这里是shasan代码的缩写版本,计算数组a的平均值的95%置信区间:

 import numpy as np, scipy.stats as st st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) 

但使用StatsModels的tconfint_mean可以说更好:

 import statsmodels.stats.api as sms sms.DescrStatsW(a).tconfint_mean() 

两者的基本假设是样本(数组a )独立于标准差未知的正态分布(参见MathWorld或Wikipedia )。

对于大样本量n,样本均值是正态分布的,可以使用st.norm.interval()来计算置信区间(如Jaime的评论中所build议的)。 但是,对于小的n,上面的解决scheme也是正确的,其中st.norm.interval()给出了太窄的置信区间(即“假置信度”)。 有关更多详细信息,请参阅我对类似问题的回答 (以及Russ在此处的评论之一)。

这里是一个例子,其中正确的选项给出(基本上)相同的置信区间:

 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) 

最后,使用st.norm.interval()的错误结果是:

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

首先从查找表中查找所需的置信区间的z值 。 置信区间为mean +/- z*sigma ,其中sigma是样本均值的估计标准偏差,由sigma = s / sqrt(n) ,其中s是从您的样本数据计算出的标准偏差, n是你的样本量。