从样本数据计算置信区间

新手上路,请多包涵

我有样本数据,假设服从正态分布,我想为其计算置信区间。

我已经找到并安装了 numpy 和 scipy 包,并让 numpy 返回平均值和标准差(numpy.mean(data) 数据是一个列表)。任何关于获得样本置信区间的建议将不胜感激。

原文由 Bmayer0122 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 749
2 个回答
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

你可以这样计算。

原文由 shasan 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是 shasan 代码的简化版本,计算数组平均值的 95% 置信区间 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))

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

 import statsmodels.stats.api as sms

sms.DescrStatsW(a).tconfint_mean()

两者的基本假设是样本(数组 a )是独立于标准差未知的正态分布绘制的(参见 MathWorld 或 [Wikipedia](https://en.wikipedia.org/wiki/Student’s_t-distribution) )。

对于大样本量 n,样本均值呈正态分布,可以使用 st.norm.interval() 计算其置信区间(如 Jaime 的评论中所建议)。但上述解决方案对于小 n 也是正确的,其中 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)

原文由 Ulrich Stern 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题