从样本数据计算置信区间

问题描述 投票:75回答:4

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

我已经找到并安装了numpy和scipy软件包,并且已经很难恢复平均值和标准差(numpy.mean(数据),数据是列表)。任何关于获得样本置信区间的建议都会非常感激。

python numpy statistics confidence-interval
4个回答
121
投票
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

你可以这样计算。


86
投票

这里是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)独立于具有未知标准偏差的正态分布(参见MathWorldWikipedia)。

对于大样本大小n,样本均值是正态分布的,并且可以使用st.norm.interval()计算其置信区间(如Jaime的评论中所建议的)。但是上述解决方案对于小n也是正确的,其中st.norm.interval()给出了太窄的置信区间(即,“假信心”)。有关更多详细信息,请参阅我的answer以获得类似问题(以及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)

12
投票

首先从z-value查找look-up table所需的置信区间。置信区间为mean +/- z*sigma,其中sigma是样本均值的估计标准差,由sigma = s / sqrt(n)给出,其中s是根据样本数据计算的标准差,n是您的样本大小。


3
投票

启动Python 3.8,标准库提供NormalDist对象作为statistics模块的一部分:

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

这个:

  • 从数据样本中创建一个NormalDist对象(NormalDist.from_samples(data),通过NormalDist.meanNormalDist.stdev,我们可以访问样本的均值和标准差。
  • 使用累积分布函数的倒数(Z-score),基于标准正态分布(由NormalDist()表示)计算给定置信度的inv_cdf
  • 根据样本的标准差和平均值生成置信区间。

这假设样本大小足够大(假设超过~100分),以便使用标准正态分布而不是学生t分布来计算z值。

© www.soinside.com 2019 - 2024. All rights reserved.