从样本数据计算置信区间

时间:2013-02-22 21:29:50

标签: python numpy statistics confidence-interval

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

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

5 个答案:

答案 0 :(得分:118)

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
你可以这样计算。

答案 1 :(得分:80)

这里是shasan代码的缩短版本,计算数组# create label-sets lab1 <- ifelse(as.character(d$CA) %in% c("Balears", "Aragón", "Murcia", "C. La Mancha","Extremadura"), "", as.character(d$CA)) lab2 <- ifelse(!(as.character(d$CA) %in% c("Balears", "Aragón", "Murcia", "C. La Mancha", "Extremadura")), "", as.character(d$CA)) # same graph, two sets of labels. ggplot(d, aes(x=ILE2, y=TE)) + geom_point(mapping=aes(x=ILE2, y=TE, fill=d$CA), size=9, shape=20, color="black") + geom_text(data = d,mapping=aes(x=ILE2, y=TE,label=lab1), size=4, vjust=1.5, hjust=1,size=6)+ geom_text(data = d,mapping=aes(x=ILE2, y=TE,label=lab2), size=4, vjust=-1.5, hjust=0,size=6)+ geom_smooth(method=lm,se=F)+ theme(legend.position = "none")+ ggtitle("Tasa de Empleo según Índice de Libertad Económica") + labs(x="Índice de Libertad Económica",y="Tasa de Empleo") + theme(plot.title = element_text(family =windowsFonts(Times=windowsFont("TT Times New Roman")), color="#666666", face="bold", size=22, hjust=0.5)) + theme(axis.title = element_text(family =windowsFonts(Times=windowsFont("TT Times New Roman")), color="#666666", face="bold", size=22)) 均值的95%置信区间:

a

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

import numpy as np, scipy.stats as st

st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))

两者的基本假设是样本(数组import statsmodels.stats.api as sms sms.DescrStatsW(a).tconfint_mean() )独立于具有未知标准差的正态分布(参见MathWorldWikipedia)。

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

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

st.norm.interval()

最后,使用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()

答案 2 :(得分:11)

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

答案 3 :(得分:1)

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.from_samples(data)中创建一个NormalDist对象,这使我们可以通过NormalDist.meanNormalDist.stdev访问样本的均值和标准差。 / p>

  • 使用累积分布函数(inv_cdf的反函数,根据给定的置信度,根据标准正态分布(由Z-score表示)计算NormalDist()

  • 根据样本的标准偏差和平均值得出置信区间。


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

答案 4 :(得分:0)

如果我们重复测量,置信区间给出了您可能期望获得的参数值范围的上限和下限。对于命名分布,您可以分析地计算它们或查找它们,但是引导程序方法的许多美丽特性之一是您可以采用引导程序复制的百分位数来获得您的置信区间。方便的是,您可以使用 np.percentile() 函数。

使用您刚刚生成的引导复制来计算 95% 置信区间。也就是说,将引导复制的第 2.5 个和第 97.5 个百分位数存储为 bs_replicates。

'''蟒蛇

confidence_interval = np.percentile(bs_replicates,[2.5,97.5])

'''