jarque_bera#
- scipy.stats.jarque_bera(x, *, axis=None, nan_policy='propagate', keepdims=False)[源代码][源代码]#
对样本数据执行 Jarque-Bera 拟合优度检验。
Jarque-Bera 检验测试样本数据是否具有与正态分布相匹配的偏度和峰度。
请注意,此测试仅适用于足够大的数据样本数(>2000),因为测试统计量渐近地具有2个自由度的卡方分布。
- 参数:
- xarray_like
随机变量的观测值。
- 轴int 或 None, 默认: None
如果是一个整数,表示输入数据中要计算统计量的轴。输入数据的每个轴切片(例如行)的统计量将出现在输出的相应元素中。如果为
None
,则在计算统计量之前会将输入数据展平。- nan_policy{‘propagate’, ‘omit’, ‘raise’}
定义如何处理输入的 NaN。
propagate
: 如果在计算统计量的轴切片(例如行)中存在 NaN,则输出的相应条目将为 NaN。omit
: 在执行计算时,NaN 将被省略。如果在计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。raise
: 如果存在 NaN,将引发ValueError
。
- keepdimsbool, 默认值: 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). 正态性的方差分析检验(完整样本)。《生物统计学》, 52(3/4), 591-611.
[3]B. Phipson and G. K. Smyth. “Permutation P-values Should Never Be Zero: Calculating Exact P-values When Permutations Are Randomly Drawn.” Statistical Applications in Genetics and Molecular Biology 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检验,对于非常大的样本,零分布是具有两个自由度的卡方分布。
>>> 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]。