从样本数据计算置信区间
我有样本数据,我想计算一个置信区间,假设一个正态分布。
我发现并安装了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
是你的样本量。