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
,而不是 2Dnp.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()
该比较通过 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()
>>> 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()
>>> res.pvalue 0.0097 # may vary
此外,尽管它们的随机特性,但这样计算出来的 p 值可以用来精确地控制错误拒绝零假设的发生率 [4]。