scipy.stats.

jarque_bera#

scipy.stats.jarque_bera(x, *, axis=None, nan_policy='propagate', keepdims=False)[源代码]#

对样本数据执行 Jarque-Bera 拟合优度检验。

Jarque-Bera 检验测试样本数据是否具有与正态分布匹配的偏斜度和峰值。

请注意,此检验仅适用于大量数据样本(>2000), 因为检验统计量渐近地具有自由度为 2 的卡方分布。

参数:
xarray_like

随机变量的观测值。

axisint 或 None, 默认值: None

如果是一个 int,则为计算统计量时要用的输入轴。输入每一轴切片(例如行)的统计量将出现在输出对应元素中。如果为 None,则在计算统计量之前输入将被拉平。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定义如何处理输入 NaN。

  • 传播:如果 NaN 存在于沿其计算统计数据的轴切片(例如行)中,那么输出的相应条目将是 NaN。

  • 忽略:在执行计算时,NaN 将被忽略。如果沿其计算统计数据的轴切片中剩余的数据不足,则输出的相应条目将是 NaN。

  • 提高:如果存在 NaN,则会引发 ValueError

保留维度布尔值,默认:False

如果将其设置为 True,则减少的轴将作为大小为 1 的维度保留在结果中。使用此选项,该结果将针对输入数组正确广播。

返回:
结果显著性结果

具有以下特性的对象

统计浮点

检验统计量。

p 值 浮点

假设检验的 p 值。

笔记

从 SciPy 1.9 开始,np.matrix 输入(不建议用于新代码)在执行计算之前被转换为 np.ndarray。在这种情况下,输出将是标量或适当形状的 np.ndarray,而不是 2D np.matrix。类似地,虽然会忽略掩码数组的掩码元素,但输出将是标量或 np.ndarray,而不是掩码等于 mask=False 的掩码数组。

参考

[1]

Jarque,C. 和 Bera,A.(1980)“正态性、同方差性和回归残差序列独立性的有效检验”,6 计量经济学通报 255-259。

[2]

Shapiro,S. S.,和 Wilk,M. B.(1965)。正态性方差分析检验(完整样本)。Biometrika,52(3/4),591-611。

[3]

B. Phipson 和 G. K. Smyth。“置换 p 值永远不应为零:在置换随机抽取时计算精确的 p 值。”统计应用于遗传学和分子生物学 9.1 (2010)。

[4]

Panagiotakos,D. B.(2008)。p 值在生物医学研究中的价值。开放的心血管医学杂志,2,97。

示例

假设我们希望根据测量值推断,医学研究中成年男性人体重是否不遵循正态分布 [2]。体重(磅)记录在下面的数组 x 中。

>>> import numpy as np
>>> x = np.array([148, 154, 158, 160, 161, 162, 166, 170, 182, 195, 236])

Jarque-Bera 检验首先根据样本偏度和峰度计算一个统计数据。

>>> from scipy import stats
>>> res = stats.jarque_bera(x)
>>> res.statistic
6.982848237344646

由于正态分布具有为零的偏度和为零的(“过剩”或“费舍尔”)峰度,该统计量对于正态分布中抽取得到的样本,其值往往较小。

该检验通过观测的统计量与零分布进行比较来执行:零分布是统计量值在零假设下导出的,该零假设认为权重来自正态分布。对于 Jarque-Bera 检验,对于数量非常大的样本,零分布为自由度为 2 的卡方分布。

>>> import matplotlib.pyplot as plt
>>> dist = stats.chi2(df=2)
>>> jb_val = np.linspace(0, 11, 100)
>>> pdf = dist.pdf(jb_val)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> def jb_plot(ax):  # we'll reuse this
...     ax.plot(jb_val, pdf)
...     ax.set_title("Jarque-Bera Null Distribution")
...     ax.set_xlabel("statistic")
...     ax.set_ylabel("probability density")
>>> jb_plot(ax)
>>> plt.show()
../../_images/scipy-stats-jarque_bera-1_00_00.png

该比较通过 p 值来量化:零分布中大于或等于统计量观测值的值的比例。

>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> jb_plot(ax)
>>> pvalue = dist.sf(res.statistic)
>>> annotation = (f'p-value={pvalue:.6f}\n(shaded area)')
>>> props = dict(facecolor='black', width=1, headwidth=5, headlength=8)
>>> _ = ax.annotate(annotation, (7.5, 0.01), (8, 0.05), arrowprops=props)
>>> i = jb_val >= res.statistic  # indices of more extreme statistic values
>>> ax.fill_between(jb_val[i], y1=0, y2=pdf[i])
>>> ax.set_xlim(0, 11)
>>> ax.set_ylim(0, 0.3)
>>> plt.show()
../../_images/scipy-stats-jarque_bera-1_01_00.png
>>> res.pvalue
0.03045746622458189

如果 p 值“小”,即从产生该统计量极端值的正态分布总体中抽取数据的可能性很小,那么这可以作为反对零假设的证据,支持备择假设:权重并非来自正态分布。注意

  • 反之并非如此;也就是说,该检验不用于为零假设提供证据。

  • 将被视为“小”的阀值是在分析数据之前应该做出的选择,[3] 其中需要考虑假阳性(错误地拒绝零假设)和假阴性(未能拒绝错误的零假设)的风险。

请注意,卡方分布提供了零分布的渐近近似;它只对具有大量观测值的样本有效。对于像我们这样的小样本数,scipy.stats.monte_carlo_test 可提供更准确(尽管是随机的)的精确 p 值近似值。

>>> def statistic(x, axis):
...     # underlying calculation of the Jarque Bera statistic
...     s = stats.skew(x, axis=axis)
...     k = stats.kurtosis(x, axis=axis)
...     return x.shape[axis]/6 * (s**2 + k**2/4)
>>> res = stats.monte_carlo_test(x, stats.norm.rvs, statistic,
...                              alternative='greater')
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> jb_plot(ax)
>>> ax.hist(res.null_distribution, np.linspace(0, 10, 50),
...         density=True)
>>> ax.legend(['aymptotic approximation (many observations)',
...            'Monte Carlo approximation (11 observations)'])
>>> plt.show()
../../_images/scipy-stats-jarque_bera-1_02_00.png
>>> res.pvalue
0.0097  # may vary

此外,尽管它们的随机特性,但这样计算出来的 p 值可以用来精确地控制错误拒绝零假设的发生率 [4]