面向Python开发人员的综合置信区间全面理解

置信区间是以范围表示并汇总统计中的不确定性的。换句话说,这是一系列我们确信自己真正价值所在的价值观。例如:我有95%的信心认为人口平均数在8.76到15.88之间→ (12.32 ± 3.56)

置信区间告诉你,如果有可能对整个人群进行调查,你对民意测验或调查的结果会反映出你期望的结果有多大的信心。由于资源和时间有限,很难获得整个数据集(总体)的测量数据。你最好的办法是调查整个数据集中的一小部分(样本),并祈祷你的样本数据能合理地代表人口。

样本数据可能无法很好地代表一个群体的多种因素(例如:偏差),因此,从样本数据得出的任何估计都会引入不确定性。由于样本数据的不确定性,任何统计估计都需要在一定范围内进行,而不是在点估计中。

样本统计对潜在总体参数的估计程度始终是一个问题(总体与样本)。置信区间通过提供一系列值来解决这个问题,这些值可能包含不确定性范围内感兴趣的总体参数。

1.通过类比理解置信区间

如果你在高中或大学里上过有实验报告的科学课,你可能必须在实验报告中包含测量误差。例如,如果要求你用尺子测量回形针的长度,你必须包括 ±0.5cm±0.5cm±0.5cm 或 ±0.05cm±0.05cm±0.05cm(取决于刻度线的间距)以说明显示测量工具精度的测量误差。

根据图(1),回形针似乎有2.7厘米长,但我们不能确定,因为尺子上的记号不够精确,无法测量十进制长度。然而,我可以100%确信回形针的长度在2到3厘米之间,因为回形针的刻度在2厘米到3厘米之间。将回形针的长度记录在一个范围内,而不是点估计值,以考虑测量工具的限制带来的不确定性。

图1:直尺的测量误差

类似的想法也适用于均值的置信区间。您希望获得整个数据集(总体)的平均值,但只能测量整个数据集的一小部分(样本)的值。这归结为人口与样本的传统问题,因为获取大型数据集的测量数据需要花费大量成本。你的样本中引入了不确定性,因为你不知道你的样本是否100%代表了人群,并且不带有偏见。因此,你在一个范围内给出结论,而不是在一个点估计中,来解释不确定性。

例1:岩石孔隙度的不确定性

(借用迈克尔·皮尔茨博士的地质统计学课程)

石油和天然气行业的储层工程师想知道地层的岩石孔隙度,以估计地下9500英尺的总石油储量。由于从深层获取岩芯样本的成本很高,他只能获取12个岩芯样本。由于点估计的不确定性与样本量成反比,因此他的估计具有不可忽略的不确定性。他获得了14.5%的平均岩石孔隙度和4.3%的标准偏差。公司高管希望了解最坏情况(第10页)和最佳情况(第90页)以做出商业决策。你可以通过构造平均值的置信区间来表达你对平均孔隙度的不确定性估计。

假设你有理由相信岩石孔隙度服从正态分布,你可以用下面描述的程序构造它的80%置信区间:

stats.t.interval(1 - 0.2, 12 - 1, loc=14.5, scale= 4.3 / np.sqrt(12))
(12.807569748569543, 16.19243025143046)

上述不确定度范围是从12个岩芯样本中获得的。在最坏的情况下,地下9500英尺处的岩层具有12.8%的孔隙度。在最佳情况下,油藏的孔隙度为16.2%。同样的程序也适用于在不同深度采集的岩芯样品,这为我们提供了如图(2)所示的岩石孔隙度置信区间图。
图2:岩芯样品孔隙度沿深度的置信区间

import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(39)depth = [i * 10 + 8000 for i in range(100)]
l = len(depth)
avg_por = []
p10_por = []
p90_por = []
for i, item in enumerate(depth):# You collect 12 rock core samples for each depth# Assume that sample porosity follows a normal distributionsample_size = 12por_samples = np.random.normal(loc=0.15 - i/2000, scale=0.022, size=sample_size)avg_por.append(np.mean(por_samples))# 80% confidence interval of meanp10, p90 = stats.t.interval(1 - 0.2, sample_size - 1, loc=np.mean(por_samples), scale=stats.sem(por_samples))p10_por.append(p10)p90_por.append(p90)# plotting
plt.style.use('seaborn-whitegrid')
fig, ax = plt.subplots(1, 2, figsize=(8, 4))ax[0].plot(avg_por[:l//2], depth[:l//2], 'k', label='P50', alpha=0.8)
ax[0].plot(p10_por[:l//2], depth[:l//2], 'grey', linewidth=0.7, label='P10', linestyle='--')
ax[0].plot(p90_por[:l//2], depth[:l//2], 'grey', linewidth=0.7, label='P90')ax[0].set_xlim(0.08, 0.17)
ax[0].set_ylabel('Depth (ft)', fontsize=15)
ax[0].set_xlabel('Porosity', fontsize=15)
ax[0].fill_betweenx(depth[:l//2], p10_por[:l//2], p90_por[:l//2], facecolor='lightgrey', alpha=0.3)
ax[0].invert_yaxis()ax[1].plot(avg_por[l//2:], depth[l//2:], 'k', label='P50', alpha=0.8)
ax[1].plot(p10_por[l//2:], depth[l//2:], 'grey', linewidth=0.7, label='P10', linestyle='--')
ax[1].plot(p90_por[l//2:], depth[l//2:], 'grey', linewidth=0.7, label='P90')ax[1].set_xlim(0.08, 0.17)
ax[1].set_xlabel('Porosity', fontsize=15)
ax[1].legend(loc='best', fontsize=14, framealpha=1, frameon=True)
ax[1].fill_betweenx(depth[l//2:], p10_por[l//2:], p90_por[l//2:], facecolor='lightgrey', alpha=0.3)
ax[1].invert_yaxis()

例2:破坏者中去氧麻黄碱(晶体)的纯度

怀特先生烹制的21批水晶平均纯度为99.1%,标准偏差为3%。平克曼先生烹制的18批水晶平均纯度为96.2%,标准偏差为4%。怀特先生做的水晶总是比平克曼先生做得好吗?还是平克曼先生有可能幸运地在水晶纯度方面击败怀特先生?假设正态分布,我们可以用下面描述的程序构造95%的置信区间:

# Mr. White's
stats.t.interval(1 - 0.05, 21 - 1, loc=99.1, scale= 3 / np.sqrt(21))
(97.73441637228476, 100.46558362771523)
# Mr. Pinkman's
stats.t.interval(1 - 0.05, 18 - 1, loc=96.2, scale= 4 / np.sqrt(18))
(94.21084679714819, 98.18915320285181)

怀特先生和平克曼先生的置信区间有一小部分重叠。虽然怀特先生确实是一个更好的厨师,但平克曼先生如果运气好的话,很有可能会做出一批更纯净的水晶。比较两个样本数据集的均值与构建均值差的置信区间密切相关。

图3:两个样本95%置信区间的重叠

import matplotlib.pyplot as plt
from scipy import stats
import numpy as npconf_pinkman = stats.t.interval(1 - 0.05, 18 - 1, loc=96.2, scale= 4 / np.sqrt(18))
conf_white = stats.t.interval(1 - 0.05, 21 - 1, loc=99.1, scale= 3 / np.sqrt(21))plt.style.use('seaborn-whitegrid')
fig, ax = plt.subplots(figsize=(5, 2))ax.errorbar(99.1, 1, xerr=(conf_white[1] - conf_white[0]) / 2,fmt='o', markersize=8, capsize=5, label='Mr. White\'s', color='grey')
ax.errorbar(96.2, 0, xerr=(conf_pinkman[1] - conf_pinkman[0]) / 2,fmt='o', markersize=8, capsize=5, label='Mr. Pinkman\'s', color='k')
ax.set_ylim(-0.6, 1.6)
ax.fill_betweenx([1, 0], conf_white[0], conf_pinkman[1], facecolor='lightgrey', alpha=0.3)
ax.legend(loc='best', fontsize=11, framealpha=1, frameon=True)
ax.set_xlabel('Purity (%)', fontsize=12)
ax.yaxis.set_major_formatter(plt.NullFormatter())
fig.tight_layout();

例3:石油产量预测中的不确定性

石油和天然气行业的生产工程师想知道碳氢化合物产量预测的最坏情况(P10)和最佳情况(P90)。在石油工程中,我们使用一种称为递减曲线分析(DCA)的技术来预测未来的油气产量。量化DCA模型的不确定性很重要,因为石油生产的不确定性可能高达数百万美元;公司高管根据P10和P90值做出商业决策。DCA主要有三种模型:指数模型、双曲模型和调和模型。出于演示目的,这里将使用双曲线模型。双曲线递减曲线可定义为:

q=qi(1+bDit)1/bq = \frac{q_i}{(1+bD_it)^{1/b}} q=(1+bDi​t)1/bqi​​
这是一个非线性回归问题,需要优化三个参数:DiD_iDi​、qiq_iqi​ 和 bbb。自变量为时间 ttt。我们可以构造回归模型的置信区间,以获得P10和P90值。由于非线性模型置信区间的解析解比较复杂,且数据不是正态分布,我们使用非参数数值替代方法bootstrap获得以下不确定性预测模型:
图4:递减曲线分析预测中的不确定性

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit##################################### Prepare Data #########################################file = 'https://aegis4048.github.io/downloads/notebooks/sample_data/decline_curve.xlsx'
df = pd.read_excel(file, sheet_name='sheet_1')
df = df[df['Oil Prod. (bopd)'] > 200]           # remove bad data points
t = df['Time'][1:].values[: -40]
y = df['Oil Prod. (bopd)'][1:].values[:-40]
x = np.array([i for i in range(len(t))])#################################### Define function #######################################def hyperbolic(x, qi, b, Di):return qi / (1 + b * Di * x) ** (1 / b)################################# Bootstrap regression #####################################np.random.seed(42)y_boot_reg = []
for i in range(1000):# Bootstrappingboot_index = np.random.choice(range(0, len(y)), len(y))x_boot = x[boot_index]y_boot = y[boot_index]# Curve fit datapopt, pcov = curve_fit(hyperbolic, x_boot, y_boot, maxfev=100000, p0=[max(y), 0.1, 0.1])# Define predicted regionpred_x = [i for i in range(x[-1], x[-1] + 20)][1:]x_new = np.append(x, np.array([pred_x]))# Predicty_boot_reg = y_boot_reg + [hyperbolic(x_new, *popt)]y_boot_reg = np.array(y_boot_reg)p10 = np.percentile(y_boot_reg, 10, axis=0)
p50 = np.percentile(y_boot_reg, 50, axis=0)
p90 = np.percentile(y_boot_reg, 90, axis=0)# Basic curve fit
popt, pcov = curve_fit(hyperbolic, x, y, maxfev=100000, p0=[max(y), 0.1, 0.1])###################################### Plotting ##########################################fig, ax = plt.subplots(figsize=(8, 4))for reg_sample in y_boot_reg:ax.plot(x_new, reg_sample, color='grey', alpha=0.3)
ax.plot(x, y, '--o', color='k', alpha=1)
ax.plot(x_new, p10, ':',color='#1f77b4', alpha=1, label='P10')
ax.plot(x_new, hyperbolic(x_new, *popt), color='r', label='P50')
ax.plot(x_new, p90, '-.',color='#1f77b4', alpha=1, label='P90')ax.set_yscale('log')
ax.set_ylim(80, 30000)
ax.set_xlim(-2, 57)
ax.set_xlabel('Months', fontsize=15)
ax.set_ylabel('Oil Production (bopd)', fontsize=15)
ax.set_title('Uncertainty in decline curve analysis with Bootstrap', fontsize=18)
ax.grid(True, linestyle='--', color='#acacac')ax.axvspan(-2, x[-1], facecolor='#efefef', alpha=0.5)
ax.axvspan(x[-1], 57, facecolor='lightgrey', alpha=0.5)ax.text(0.38, 0.1, 'Fitted region', fontsize=15,transform=ax.transAxes, color='k')
ax.text(0.7, 0.1, 'Predicted region', fontsize=15,transform=ax.transAxes, color='k')
ax.text(0.27, 0.91, 'aegis4048.github.io', fontsize=13, ha='center', va='center',transform=ax.transAxes, color='grey', alpha=0.5)
ax.legend()fig.tight_layout()

2.关键要素

1.置信区间量化了统计估计的不确定性

置信区间量化了与统计估计相关的不确定性,以缓解总体与样本的问题。它总是在-C.I.:x‘±3.43这样的范围内表示 – C.I.:xˉ±3.43\text{C.I.}: \quad \bar{x} \pm 3.43C.I.:xˉ±3.43 或者 −51.4<xˉ<−43.2-51.4 < \bar{x} < -43.2−51.4<xˉ<−43.2

2.置信区间是参数假设检验的基础

置信区间是参数假设检验的基础。例如,t检验使用均值差异的置信区间计算其p值。当样本服从正态分布,因此它们的中心趋势可以用它们的平均值来描述时,t检验可以用来判断两个分布是否显著不同。

3.置信区间的公式因统计数据而异

均值的置信区间

C.I.mean:μ±(tα2,df×sn)\text{C.I.}_{\text{mean}}: \quad \mu \pm (t_{\frac{\alpha}{2},df} \times \frac{s}{\sqrt{n}}) C.I.mean​:μ±(t2α​,df​×n​s​)

均值差的置信区间

C.I.Δmean:(μ1−μ2)±(t1−α2,df×s12n1+s22n2)\text{C.I.}_{\Delta \text{mean}}: \quad (\mu_{1}- \mu_{2}) \pm (t_{1-\frac{\alpha}{2},df} \times \sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}) C.I.Δmean​:(μ1​−μ2​)±(t1−2α​,df​×n1​s12​​+n2​s22​​​)

比例置信区间

C.I.proportion:p^±(tα2,df×p^(1−p^)n)\text{C.I.}_{\text{proportion}}: \quad \hat{p} \pm (t_{\frac{\alpha}{2},df} \times \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} ) C.I.proportion​:p^​±(t2α​,df​×np^​(1−p^​)​​)

方差的置信区间

C.I.variance:(n−1)s2χα22≤σ2≤(n−1)s2χ1−α22\text{C.I.}_{\text{variance}}: \frac{(n-1)s^{2}}{\chi^{2}_{\frac{\alpha}{2}}} \leq \sigma^2 \leq \frac{(n-1)s^{2}}{\chi^{2}_{1-\frac{\alpha}{2}}} C.I.variance​:χ2α​2​(n−1)s2​≤σ2≤χ1−2α​2​(n−1)s2​

标准差的置信区间

C.I.standard deviation:(n−1)s2χα22≤σ≤(n−1)s2χ1−α22\text{C.I.}_{\text{standard deviation}}: \sqrt{\frac{(n-1)s^{2}}{\chi^{2}_{\frac{\alpha}{2}}}} \leq \sigma \leq \sqrt{\frac{(n-1)s^{2}}{\chi^{2}_{1-\frac{\alpha}{2}}}} C.I.standard deviation​:χ2α​2​(n−1)s2​​≤σ≤χ1−2α​2​(n−1)s2​​
对于不同的统计数据,存在不同的分析解决方案。然而,许多其他统计数据的置信区间无法解析求解,仅仅因为它们没有公式。如果你感兴趣的统计数据的置信区间没有解析解,或者你根本不知道它,那么像boostapping这样的数值方法可以是一个很好的选择(而且它的强大功能)。

4.在非正态性条件下,参数方法的精度会降低

如果样本数据集不是正态分布,则上述方程式无效。对于非正态分布的数据,其置信区间可以用boostrapping等非参数方法来确定,或者使用可信区间,可信区间是置信区间的Baysian等价物。或者,您可以使用Box-Cox变换将数据转换为正态分布。确保您了解非正态分布的参数与非参数方法的稳健性,这将在下面详细讨论。

5.95%的C.I.并不意味着95%的样本数据在区间内。

这意味着95%的概率,估计的统计数据在区间内。95%的置信区间与估计程序的可靠性有关。你对总体方差的估计有多可靠?

6.总是使用t-score而不是z-score

在构建均值的置信区间或进行t检验时,始终使用t分数而不是z分数。这是因为当样本量为samll时,t分布比正态分布具有更大的不确定性,但当样本量大于30时,t分布会收敛到正态分布。下面将详细介绍这一概念。

7.样本量越大,置信区间越窄

直觉上,这是因为我们拥有的样本越多,统计估计的不确定性就越小。从数学上讲,这是因为置信区间与样本量 nnn 成反比,如式(1)所示。

8.均值并不总是等同于中心趋势

当样本不是正态分布时,它们的均值并不能很好地衡量它们的中心趋势。例如,如果你用t检验比较两个非正态数据集的均值,以得出它们是否来自同一人群,那么你的方法是错误的。更可行的替代方案是使用非参数替代方案,即使用中值,或其他捕捉非正态分布中心趋势的统计数据。

3.人口 vs. 样本

置信区间描述了与总体参数的样本估计相关的不确定性量。人们需要很好地理解样本和总体之间的差异,才能理解在一个范围内(也称为置信区间)进行统计估计的必要性。

图 5: 人口 vs. 样本

Population:包含指定组的所有成员的数据集。所有生活在美国的人。
Samples:包含人口的一部分或子集的数据集,例如:生活在美国的一些人。

假设你正在进行一项电话调查,以调查社会对平价医疗法案(“奥巴马医改”)的看法。因为你不能给美国所有的3.272亿人(人口)打电话,所以你给大约1000人(样本)打电话。你的民意调查显示59%的登记选民支持奥巴马医改。这与2018年进行的实际调查不符;53%有利,42%不利(来源)。错误的来源是什么?
由于(正式)奥巴马总统是民主党成员,选民的反应可能会受到他们的政治偏好的影响。你怎么知道你打电话给的1000人碰巧大部分是民主党人,他们更可能支持奥巴马的政策,因为他们有相似的政治观点?你收集的样本可能有偏差,但你不确定。当然,选民的反应可能会受到许多其他因素的影响,比如种族、年龄、居住地或经济状况。这个想法是,你的估计总是有不确定性的,因为你无法接触到整个人口。
置信区间是从样本中估计总体参数时量化不确定性的一种技术。

注:总体方差 σ2\sigma^2σ2 与样本方差 s2s^2s2 的比较 总体参数和样本参数之间的区别很重要。在统计学中,通常将总体方差表示为
σ2\sigma^2σ2 ,样本方差为 s2s^2s2 .区别很重要,因为每种方法使用不同的方程式。 对于人口: variance=σ2=∑(x−xˉ)2n\text{variance} = \sigma^2 = \frac{\sum(x - \bar{x})^2}{n} variance=σ2=n∑(x−xˉ)2​ 对于样本: variance=s2=∑(x−xˉ)2n−1\text{variance} = s^2 = \frac{\sum(x - \bar{x})^2}{n-1} variance=s2=n−1∑(x−xˉ)2​ 除数 n−1n−1n−1
是偏差的校正系数。注意,当 nnn
较小时,校正比nnn较大时具有更大的比例效应,这是我们想要的,因为样本越多,估计效果越好。这个想法在StackExchange线程中得到了很好的解释。

python 小提示: Numpy方差和Pandas方差之间的差异

不同的库对输入数组有不同的假设。Pandas和Numpy的ddof默认值不同,导致差异不同。ddof 表示自由度,设置 ddof=Trueddof=1 告诉方差函数通过考虑偏差因子 n−1 来计算样本方差.(回想一下,在Python中,True==1。)请记住,总体方差(σ2\sigma^2σ2)与样本方差(s2s^2s2)之间存在区别。如果您不清楚哪个库在计算哪个方差(样本或总体),请记住:无论您使用哪个库,请使用 ddof=Trueddof=1 来计算样本方差,并使用 ddof=Falseddof=0 来计算总体方差。

import numpy as np
import pandas as pdarr = pd.DataFrame([5,3,1,6])# numpy, population
arr.values.var()
3.6875
# numpy, sample
arr.values.var(ddof=1)
4.916666666666667
# pandas, population
arr.var(ddof=0)
0    3.6875
dtype: float64
# pandas, sample
arr.var()
0    4.916667
dtype: float64

4.正态分布的置信区间

计算一个统计量的置信区间取决于两个因素:统计量的类型和样本分布的类型。如上所述,不同类型的统计数据(例如:均值、标准差、方差)有不同的公式,非正态数据集使用不同的方法(例如:boostripping、可信区间、Box-Cox变换)。

我们将讨论均值的置信区间、均值和方差的差异。

4.1. 均值的置信区间

均值置信区间用于根据样本数据估计总体均值,并量化相关的不确定性。考虑下面的数字:
图6:人口分布和平均成本指数

在图(6)中,假设人口是正态分布的。由于我们无法访问整个人口,我们必须使用样本数据集尽可能地猜测人口平均数(未知)。我们通过计算样本均值并构造其95%置信区间来实现这一点。请注意,信心水平的常用选择是:90%、95%和99%
假设总体为正态分布,其样本均值也为正态分布。假设你有一个总体,你画出它的一小部分N
时报。然后,N个样本集的计算平均值 μ=(μ1,μ2,...,μN−1,μN)\boldsymbol{\mu}=(\mu_1, \mu_2,..., \mu_{N-1}, \mu_N)μ=(μ1​,μ2​,...,μN−1​,μN​) 为正态分布,如图(7)所示。它们的置信区间表示为黑色水平箭头:。

可以看到 μ5μ_5μ5​ 的置信区间不包括绿色垂直虚线12.31。让我们假设12.31是真实的人口平均数(我们永远不知道这是否是实际的人口平均数,但让我们假设)。如果我们得到 μ5μ_5μ5​

它的置信区间作为我们对总体均值的估计,那么我们的估计是错误的。这种情况发生的可能性为5%,因为我们将信心水平设定为95%。注意,置信区间的宽度(黑色水平箭头)取决于样本大小,如等式(1)所示

图(6)的灰色区域基本上等同于图(7)的灰色区域。μ1=12.32μ_1=12.32μ1​=12.32 为样本平均值,且 ±3.56±3.56±3.56 是与95%置信度的样本平均值相关的不确定度。不确定度是分布分数和平均值标准误差的乘积。分布分数基本上反映了距离中心(12.32)的极限(8.76和15.88)有多少标准误差。选择较大的置信水平会导致较大的置信区间。这增加了图(6)和图(7)中的灰色区域。
我们将平均值的95%置信区间表示为:

我有95%的信心,人口平均数在8.76到15.88之间。如果我对数据进行20次抽样,19次抽样平均值将在8.76~15.88之间,但预计我会错1次。

注:各种统计数据的分布
不同的统计数据表现出不同的分布。样本的正态性并不保证其统计数据的正态性。当样本为正态分布时,其均值为正态分布,但其方差为卡方 χ2\chi^2χ2 分发。下文将对方差分布和χ2分布进行更多讨论。请注意,当样本不正常时,这些假设无效。

from scipy import stats
import matplotlib.pyplot as plt
import numpy as npdf_values = [1, 2, 6, 9]
linestyles = ['-', '--', ':', '-.']
normal_params = [(10, 1), (11, 1), (10, 2), (10, 3)]
x = np.linspace(-1, 20, 1000)plt.style.use('seaborn-whitegrid')
fig, ax = plt.subplots(1, 2, figsize=(13.3, 5))
fig.tight_layout()
plt.subplots_adjust(left=0.09, right=0.96, bottom=0.12, top=0.93)for df, norm_p, ls in zip(df_values, normal_params, linestyles):ax[1].plot(x, stats.chi2.pdf(x, df, loc=0, scale=1),ls=ls, c='black', label=r'Degrees of freedom$=%i$' % df)ax[0].plot(x, stats.norm.pdf(x, loc=norm_p[0], scale=norm_p[1]),ls=ls, c='black', label='Mean = %d, ' % norm_p[0] + 'Std = %s' % norm_p[1])ax[0].set_xlim(4, 16)
ax[0].set_ylim(-0.025, 0.525)
ax[0].set_xlabel('$x$', fontsize=20)
ax[0].set_ylabel(r'Probability', fontsize=20)
ax[0].set_title(r'Distribution of means: normal distribution', fontsize=20)
ax[0].legend(loc='upper left', fontsize=16, framealpha=1, frameon=True)ax[1].set_xlim(0, 10)
ax[1].set_ylim(-0.025, 0.525)
ax[1].set_xlabel('$\chi^2$', fontsize=20)
ax[1].set_title(r'Distribution of variances: $\chi^2$ distribution', fontsize=20)
ax[1].legend(loc='best', fontsize=16, framealpha=1, frameon=True)

如果样本数据是正态分布或类正态分布,我们几乎总是假设t分布来计算置信区间,如下所述。然后,均值的置信区间具有以下解析解:

C.I.mean:μ±(t1−α2,df×sn)(1)\text{C.I.}_{\text{mean}}: \quad \mu \pm (t_{1-\frac{\alpha}{2},df} \times \frac{s}{\sqrt{n}}) \tag{1} C.I.mean​:μ±(t1−2α​,df​×n​s​)(1)

whereμ : sample meanα : significance leveln : number of samplesdf : degrees of freedom. In this example, df = n - 1s : sample standard deviation
t : t-score. depends on α and df

回想一下,当计算 sss 时,校正系数 (n−1)(n−1)(n−1) 如上文所述,该方法用于解释样本偏差。密切关注标准误差 s(n)\frac{s}{\sqrt{(n)}}(n)​s​ . 随着样本量 nnn 的增加,标准误差减小,置信区间范围减小。从某种意义上说,这是直观的,我们拥有的样本越多,统计估计的不确定性就越小。图(7)中黑色水平箭头的长度取决于样本大小。样本量越大,箭头宽度越窄,反之亦然。

注:z分数与t分数(z-score vs t-score)
在你的研究中,你可能已经看到了z分数和t分数对置信区间的混合使用。长话短说,使用t-score比使用z-score更安全,而且几乎总是更好。
z-score( zα2z_{\frac{\alpha}{2}}z2α​​ )用于正态分布,t-评分( tα2,dft_{\frac{\alpha}{2},df}t2α​,df​ )用于t-分布。如果你知道总体方差 σ2\sigma^2σ2,你就使用z分数。如果不是,则使用t-score。由于总体方差 σ2\sigma^2σ2 几乎是未知的,所以几乎总是使用t-分数作为置信区间。毕竟,在估计总体参数(σ2\sigma^2σ2)时,使用置信区间的目的是缓解总体与样本之间的问题
)来自样本。如果你知道总体参数,你可能一开始就不需要置信区间。
一个自然的问题是,“使用t-score而不是z-score如何安全?我不应该使用z-score吗?因为我从以前的知识中知道人口是正态分布的?”这样做是安全的,因为根据中心极限定理,t分布收敛于正态分布。回想一下,随着样本量的增加,t分布的行为越来越像正态分布。
谷歌“95%置信度z分数”,你会看到z
=1.96,置信度为95%。另一方面,随着自由度的增加,t分数接近1.96:lim⁡df→∞t\lim_{df \to \infty}tlimdf→∞​t。对于95%的置信水平,当n-1=10时t=2.228,当n-1=20时t=2.086。这就是为什么在计算置信区间时,总是用t分数代替z分数是安全的。

Pythonic技巧:用SciPy计算均值的置信区间
我们可以使用等式(1)直接计算平均值的置信区间。召回以通过 ddof=1,以确保计算样本标准偏差 s ,而不是如上所述的总体标准偏差 σσσ。我们将使用 np.random.normal() 从正态分布中抽取随机样本。请注意,loc 代表总体平均值,scale 代表总体标准偏差,size 代表要抽取的样本数量。

from scipy import stats
import numpy as npnp.random.seed(42)arr = np.random.normal(loc=74, scale=4.3, size=20)alpha = 0.05                       # significance level = 5%
df = len(arr) - 1                  # degress of freedom = 20
t = stats.t.ppf(1 - alpha/2, df)   # t-critical value for 95% CI = 2.093
s = np.std(arr, ddof=1)            # sample standard deviation = 2.502
n = len(arr)lower = np.mean(arr) - (t * s / np.sqrt(n))
upper = np.mean(arr) + (t * s / np.sqrt(n))
(lower, upper)
(71.33139551903422, 75.19543685256606)

或者我们可以用 scipy.stats.t.interval() 计算。请注意,您没有将 alpha 除以2,因为函数会为您这样做。还要注意的是,平均 sn\frac{s}{\sqrt{n}}n​s​ 的标准误差可以用 scipy.stats.sem() 计算。

stats.t.interval(1 - alpha, len(arr) - 1, loc=np.mean(arr), scale=stats.sem(arr))
(71.33139551903422, 75.19543685256606)

请注意 loc=0scale=1 的默认值。这将假设样本平均值 μμμ 为0,标准误差 sn\frac{s}{\sqrt{n}}n​s​ 为 1,假设平均值的标准正态分布为0,标准偏差为1。这不是我们想要的。

stats.t.interval(1 - alpha, len(arr) - 1)
(-2.093024054408263, 2.093024054408263)

4.2. 均值差的置信区间

均值差的置信区间本身并不是很有用。但了解它的工作原理很重要,因为它构成了最广泛使用的假设检验之一:t检验的基础。

我们通常想知道两种分布是否有显著差异。换句话说,我们想通过比较人群的中心趋势来知道两个样本数据集是否来自同一人群。标准方法是检查样本均值是否不同。然而,从某种意义上说,这是一种误导性的方法,即样本的平均值几乎总是不同的,即使差异是微小的。更有用的方法是估计一个范围内的差异,以考虑不确定性,并计算其足够大,具有实际重要性的概率。T检验通过计算均值差异的置信区间来检查差异是否“足够接近”为零。

T检验假设:
H0:μ1−μ2=0H_0: \mu_1 - \mu_2 = 0 H0​:μ1​−μ2​=0
H1:μ1−μ2≠0H_1: \mu_1 - \mu_2 \neq 0 H1​:μ1​−μ2​​=0

whereμ : sample meanH0 : null hypothesis — sample means are the same "enough"H1 : alternate hypothesis — sample means are "significantly" different

注意,上述假设检验一组的平均值是否与另一组的平均值显著不同;我们使用双尾检验。这并不检查一组的平均值是否显著大于使用单尾检验的另一组的平均值。

注:用方差分析比较两个以上样本的均值
方差分析(ANOVA)检查两个或更多样本的平均值是否存在显著差异。在样本数超过2个的情况下,使用t检验是不可靠的。如果我们对两个以上的样本进行多个t检验,这将对结果的错误率产生复合影响。
方差分析有以下假设:

H0:μ1=μ2=⋯=μLH_0: \mu_1 = \mu_2 = \, \cdots \, =\mu_L H0​:μ1​=μ2​=⋯=μL​

H1:μa≠μbH_1: \mu_a \neq \mu_b H1​:μa​​=μb​
其中L是组数,μa和μb属于任何组的任意两个样本均值。本文很好地说明了方差分析的概念。

图8:样本分布

在图(8)中,μ 表示样本平均值。如果两个样本数据集来自同一人群,平均数的分布将“足够”相似。否则,它们将“显著”不同。可以通过重叠区域进行目视检查。重叠越大,两种分布起源于同一种群的可能性越大。

比较样本均值的更稳健的方法是构造均值差异的置信区间。如果这两个样本来自同一人群,它们应该具有相似的“足够”均值。它们的差异应接近于零,并满足(或未能拒绝)零假设 H0:μ1−μ2=0H_0: \mu_1 - \mu_2 = 0H0​:μ1​−μ2​=0
在不确定的范围内。考虑下面的数字:

图9:平均数差异分布

在图(9)中,样本均值的计算差异为 μ1−μ2=1.00\mu_1 - \mu_2 = 1.00μ1​−μ2​=1.00. 我们通过构建其95%置信区间[-1.31~3.31],提供与样本均值差异估计相关的不确定性。自零假设 H0:μ1−μ2=0H_0: \mu_1 - \mu_2 = 0H0​:μ1​−μ2​=0
在95%置信区间(灰色阴影区域)内,我们接受零假设;我们得出结论,样本在不确定度范围内具有相同的平均值。
然而,如果零假设不在置信区间内,并且落在2.5%的异常值区域,我们拒绝零假设,并接受替代假设 H1:μ1−μ2≠0H_1: \mu_1 - \mu_2 \neq 0H1​:μ1​−μ2​​=0 换句话说,我们得出的结论是,样本均值存在显著差异。

均值差异置信区间的三种变化

t检验有三种变化,因此均值差异的置信区间有三种变化。维基百科(Wikipedia)很好地解释了这三种变体的区别和应用(它是少数几个真正易于理解、术语最少的变体之一)

  1. Independent (unpaired) samples, equal variance - Student’s t-interval
  2. Independent (unpaired) samples, unequal variance - Welch’s t-interval
  3. Dependent (paired) samples

回想一下,所有的t检验都假设数据是正态的。然而,只要与正态的偏差不大,它们对非正态性非常鲁棒。可视化您的分布以测试这一点。下面将详细讨论t检验对非正态性的稳健性。

4.2.1. 独立(未配对)样本,等方差-学生t-区间(student’s t-interval)
当你有理由相信样本的方差几乎相等时,你可以使用student t检验来检查均值差异是否显著不同。请注意,只要样本大小相等或接近相等,且样本大小不太小,即使方差不相等,student的t检验也能很好地工作。

然而,建议始终使用韦尔奇t检验,假设方差不相等,如下所述。如果绝对确定总体方差几乎相等,则使用学生t检验。

假设方差相等,均值差异的置信区间(student’s t-区间)可计算如下:

C.I.Δmean:(μ1−μ2)±(t1−α2,df×sp1n1+1n2),sp=(n1−1)s12+(n2−1)s22n1+n2−2(4)\text{C.I.}_{\Delta \text{mean}}: \quad (\mu_{1}- \mu_{2}) \pm (t_{1-\frac{\alpha}{2},df} \times s_p\sqrt{\frac{1}{n_1}+\frac{1}{n_2}})\,, \quad s_p = \sqrt{\frac{(n_1-1)s_{1}^2 + (n_2-1)s_{2}^2}{n_1+n_2-2}} \tag{4} C.I.Δmean​:(μ1​−μ2​)±(t1−2α​,df​×sp​n1​1​+n2​1​​),sp​=n1​+n2​−2(n1​−1)s12​+(n2​−1)s22​​​(4)

where
μ : sample mean
α : significance level
n : number of samples
df : degrees of freedom
sp : pooled standard deviation
s : sample standard deviation
t : t-score. depends on α and degrees of freedom n−1

4.2.3. 相关(配对)样本-配对t-区间

当样品相互依赖时,使用本试验;也就是说,只有一个样本进行了两次测试(重复测量),或者有两个样本已匹配或“配对”(配对或未配对?阅读下文)

假设成对样本,均值差异的置信区间可计算如下:
C.I.Δmean:dˉ±(t1−α2,df×sdn)(8)\text{C.I.}_{\Delta \text{mean}}: \quad \bar{d} \pm (t_{1-\frac{\alpha}{2}, df} \times \frac{s_d}{\sqrt{n}})\tag{8} C.I.Δmean​:dˉ±(t1−2α​,df​×n​sd​​)(8)

where
d¯ : average of sample differences
α : significance level
n : number of samples
df : degrees of freedom
sd : standard deviation of sample differences
t : t-score. depends on α and degrees of freedom n−1

该方程与等式(1)非常相似,只是我们计算的是受试者在测试前后状态之间差异的平均值和标准偏差。让我们试着用一个例子来理解这一点。
一所学校制定了一个辅导计划来提高高中生的SAT成绩。学校要求学生在辅导前后进行测试,并检查辅导是否对学生的SAT成绩有显著影响。由于受试者是与自己进行比较的,而不是与其他人进行比较,因此培训前后的测量结果并不独立。
为了计算相关t-区间,我们计算辅导前后的测试分数差异:

Student # X1 X2 X1-X2
1 1480 1510 -30
2 1280 1460 -180
3 890 1320 -430
4 340 700 -360
5 1550 1550 0
6 1230 1420 -190
7 1010 1340 -330
8 1590 1570 20
9 1390 1500 -110
10 980 1300 -320

我们发现 dˉ=−193.0,sd=161.7\bar{d}=-193.0,s_d=161.7dˉ=−193.0,sd​=161.7。这些值被插入等式(8)中。相关t-区间的自由度df可通过以下公式计算:
df=n−1(9)df = n - 1 \tag{9} df=n−1(9)
与独立t检验不同,在独立t检验中,两个样本可以有不同的样本大小 n1n_1n1​ 和 n2n_2n2​ 依赖性t检验只有一个样本量,因为受试者与自己进行比较。

还要注意的是,依赖性t检验假设测试分数的差异是正态分布的,而不是学生本身的测试分数。但只要考试成绩是正态分布,由于正态分布的性质,考试成绩的差异也将是正态分布的。

Pythonic提示:计算配对t-区间

虽然Scipy支持计算依赖t检验的t统计量,但它不支持允许我们计算依赖t区间的函数。我们必须编写自己的代码来计算它。你可以用等式(8)计算,不要忘记计算样本标准偏差,而不是通过如上所述设置ddof=1来计算总体标准偏差。

from scipy import stats
import numpy as np
x1 = np.array([1480, 1280, 890, 340, 1550, 1230, 1010, 1590, 1390, 980])
x2 = np.array([1510, 1460, 1320, 700, 1550, 1420, 1340, 1570, 1500, 1300])alpha = 0.05                        # significance level = 5%
d_bar = np.mean(x1 - x2)            # average of sample differences
s_d = np.std(x1 - x2, ddof=1)       # sample standard deviation of sample differences
n = len(x1)                         # sample size
df = n - 1                          # degrees of freedom
t = stats.t.ppf(1 - alpha/2, df)    # t-critical value for 95% CIlower = d_bar - t * s_d / np.sqrt(n)
upper = d_bar + t * s_d / np.sqrt(n)(lower, upper)
(-308.64567899681356, -77.35432100318641)

相依样本均值差异的95%置信区间在其区间内没有0。这意味着零假设 $H_0: \mu_1 - \mu_2 = 0 $ 图(9)中,不在区间内。相反,我们的估计值落在左边2.5%的异常值范围内, H1:μ1−μ2≠0H_1: \mu_1 - \mu_2 \neq 0H1​:μ1​−μ2​​=0. 我们拒绝零假设H0,接受替代假设H1.我们得出结论,样本均值存在显著差异。换句话说,学校开发的辅导项目对学生的SAT成绩有显著影响。
我们可以通过使用scipy进行正式的假设检验来证实这一点。统计数据。ttest_rel()。请注意,这是假设相关t检验。

stats.ttest_rel(x1, x2)
Ttest_relResult(statistic=-3.7752930865755987, pvalue=0.004380623368522125)

计算的pvalue=0.004小于α=0.05的显著性水平,因此我们拒绝了无效假设,接受了替代假设,这与从均值差异的置信区间得出的结论一致。

注:上述假设检验回答了“该辅导计划是否对学生的SAT成绩有显著影响?”的问题。然而,在这种情况下,一个更直观的问题是“这个辅导计划是否显著提高了学生的SAT分数?”前者采用双尾检验,后者采用单尾检验,两者的程序略有不同。

# R 语言
x1 = c(1480, 1280, 890, 340, 1550, 1230, 1010, 1590, 1390, 980)
x2 = c(1510, 1460, 1320, 700, 1550, 1420, 1340, 1570, 1500, 1300)t.test(x1, x2, paired=TRUE)#     Paired t-test# data:  x1 and x2
# t = -3.7753, df = 9, p-value = 0.004381
# alternative hypothesis: true difference in means is not equal to 0
# 95 percent confidence interval:
#  -308.64568  -77.35432
# sample estimates:
# mean of the differences
#                    -193

未完, 待续:

@online{Kim2020Jul,
author = {Kim, E.},
title = {{Comprehensive Confidence Intervals for Python Developers | Pythonic Excursions}},
organization = {Pythonic Excursions},
year = {2020},
month = {7},
date = {2020-07-14},
urldate = {2022-03-24},
language = {english},
hyphenation = {english},
note = {[Online; accessed 24. Mar. 2022]},
url = {https://aegis4048.github.io/comprehensive_confidence_intervals_for_python_developers},
keywords = {confidence interval, uncertainty, statistics, non-normal, normal, non-Gaussian, Gaussian, normality test, hypotheses testing, bootstrap, t-test, f-test, central tendency, box-cox, non-parametric, parametric, lognormal, exponential, heavy-tails, skewness, kurtosis, Statistics},
abstract = {{This post covers everything you need to know about confidence intervals: from the introductory conceptual explanations, to the detailed discussions about the variations of different techniques, their assumptions, strength and weakness, when to use, and when not to use.}}
}

面向Python开发人员的综合置信区间全面理解相关推荐

  1. 微软的python开发工具_面向 Python 开发人员的 Azure 工具

    面向 Python 开发人员的 Azure 工具Azure tools for Python developers 08/06/2020 本文内容 Visual Studio CodeVisual S ...

  2. python项目开发计划_面向中级 Python 开发人员的 13 个项目构想

    建立信心:无论项目的复杂程度如何,你都会更加相信自己创建软件的能力. 探索其他技术:你将了解构建完整产品所需的其他技术,如数据库.服务器和其他语言. 更好地理解编程概念:你将学习更好地编写代码,并了解 ...

  3. 面向.NET开发人员的Dapr- actors 构建块

    原文地址:https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor m ...

  4. 面向.NET开发人员的Dapr——发布和订阅

    目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 面向.NET开发人员的Dapr--俯瞰Dapr 面向.NET开发人员的Dapr--入门 面向.NET开发人 ...

  5. 面向.NET开发人员的Dapr——总结和前景

    目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 面向.NET开发人员的Dapr--俯瞰Dapr 面向.NET开发人员的Dapr--入门 面向.NET开发人 ...

  6. 面向.NET开发人员的Dapr——俯瞰Dapr

    目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 Dapr at 20,000 feet 俯瞰Dapr In chapter 1, we discussed ...

  7. 推荐给中高级Python开发人员的自然语言处理书

    随着NLP技术的发展,信息流和计算能力也不断增强.我们现在只需在搜索栏中输入几个字符,就可以检索出完成任务所需的准确信息.搜索提供的前几个自动补全选项通常非常合适,以至于让我们感觉是有一个人在帮助我们 ...

  8. 面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序

    面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 Ajax 为更好的 Web 应用程序铺平了道路 在 Web 应用程序开发中,页面重载循环是最大的一个使用障碍,对于 Java™ ...

  9. 面向.NET开发人员的Dapr——状态管理

    目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 面向.NET开发人员的Dapr--俯瞰Dapr 面向.NET开发人员的Dapr--入门 面向.NET开发人 ...

最新文章

  1. 管理 zabbix_Zabbix 2019 峰会丨看睿象云如何在 Zabbix 中玩转告警
  2. html5图片加载不了,webView加载html图片遇到的问题解决
  3. Java数据结构与算法:红黑树
  4. matlab调用opencv的函数
  5. 【DirectX12】3.配置FBX_SDK
  6. 清华大学《操作系统》(二十):死锁和进程通信
  7. metinfo mysql_Metinfo 5.3.17 前台SQL注入漏洞
  8. jquery 上传图片 java_jquery 异步提交表单 上传图片小例子
  9. 求[100,9999]区间的超级素数,c语言编程,程序中含数组,2010计算机等级考试二级C语言预测题...
  10. django项目如何连接前端_Django项目中前端序列化参数获取
  11. 操作系统 第一章 计算机系统概述
  12. Harmony OS — RadioButton RadioContainer单选按钮单选按钮组
  13. jQuery:节点操作、事件操作
  14. paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同
  15. (转)AI泡沫已现:资金多而项目缺,周期长而营收难
  16. 计算激光雷达各点的仰角并分析其线数——根据lidar文档垂直角公式计算自己的激光雷达参数/以aloam为例子
  17. ChatGPT 被玩挂了,我换成了微信官方对话机器人,简直了....
  18. STM32 USB HID的GET_REPORT 与 SET_REPORT请求
  19. 什么因素影响无刷马达绕线机的精度
  20. 医咖会SPSS免费教程学习笔记—R*C卡方检验

热门文章

  1. DRAM、NAND Flash、Nor Flash、EEPROM的区别和应用领域
  2. [笨叔点滴6] 叔,这个git咋玩啊?
  3. 教育培训机构怎么做推广?有什么好建议?
  4. 设计水杯,门锁的测试用例
  5. 中介兴风 深圳楼市起浪
  6. 电脑上如何操作Android手机
  7. 电脑操作手机scrcpy软件
  8. proftpd ldap mysql_安装proftpd+ldap报错
  9. discard是什么意思啊(discard是什么意思翻译)
  10. 破解验证码利器及使用利器