fligner#
- scipy.stats.fligner(*samples, center='median', proportiontocut=0.05, axis=0, nan_policy='propagate', keepdims=False)[source]#
执行 Fligner-Killeen 检验以检验方差相等。
Fligner 检验检验所有输入样本来自方差相等的总体这一零假设。当多个总体相同时,Fligner-Killeen 检验不受分布约束 [2]。
- 参数:
- sample1, sample2, …array_like
样本数据的数组。长度不一定要相同。
- center{‘mean’, ‘median’, ‘trimmed’}, 可选
控制在计算检验统计信息中使用数据的哪个函数的关键字参数。默认值为“median”。
- proportiontocut浮点数,可选
当center 为“trimmed”时,给出从每端截取的数据点数的比例。(请参阅
scipy.stats.trim_mean
。)默认值为 0.05。- axisint 或 None,默认值:0
如果为 int,则沿着其对输入计算统计量的输入轴。每个输入轴切片(如行)的统计量将显示在输出的相应元素中。如果
None
,则在计算统计量之前将会对输入进行展开。- nan_policy{‘propagate’, ‘omit’, ‘raise’}
定义如何处理 Nan 输入。
propagate
:如果 axis 切片(如行)中存在 NaN,则沿着该切片计算统计量,那么输出的相应条目将为 NaN。omit
:执行计算时,将省略 NaN。如果在沿着其计算统计量的 axis 切片中剩余数据不足,那么输出的相应条目将为 NaN。raise
:如果存在 NaN,则会引发ValueError
。
- keepdims布尔值,默认值:False
如果将此设置为 True,则缩小的轴将作为大小为一的维度保留在结果中。使用此选项,结果将针对输入数组正确广播。
- 返回:
- statisticfloat
测试统计量。
- pvaluefloat
用于假设检验的 p 值。
注意
与 Levene 的检验相同,Fligner 的检验有三个变体,它们在检验中所使用的中心趋势度量上有所不同。有关更多信息,请参阅
levene
。Conover 等人(1981 年)通过大量的模拟检验了现有的许多参数检验和非参数检验,并且他们得出结论:Fligner 和 Killeen(1976 年)以及 Levene(1960 年)提出的检验在偏离正态性和功效方面具有明显的优势 [3]。
从 SciPy 1.9 开始,
np.matrix
输入(不建议用于新代码)在计算执行之前将转换为np.ndarray
。在这种情况下,输出将是标量或适当形状的np.ndarray
,而不是 2Dnp.matrix
。同样,虽然掩码数组的掩码元素被忽略,但输出将是标量或np.ndarray
,而不是带有mask=False
的掩码数组。参考文献
[1]Park, C. and Lindsay, B. G. (1999). 基于二次推理函数的稳健尺度估计和假设检验。技术报告 #99-03,宾夕法尼亚州立大学似然研究中心。 https://cecas.clemson.edu/~cspark/cv/paper/qif/draftqif2.pdf
[2]Fligner, M.A. and Killeen, T.J. (1976)。无分布的两样本尺度检验。‘美国统计协会杂志’。71(353), 210-213。
[3]Park, C. and Lindsay, B. G. (1999)。基于二次推理函数的稳健尺度估计和假设检验。技术报告 #99-03,宾夕法尼亚州立大学似然研究中心。
[4]Conover, W. J., Johnson, M. E. and Johnson M. M. (1981)。方差同质性检验的比较研究,并将其应用于美国大陆架竞标数据。技术测量学,23(4), 351-361。
[5]C.I. BLISS (1952),生物测定的统计:与维生素特别相关,第 499-503 页,DOI:10.1016/C2013-0-12584-6。
[6]B. Phipson 和 G. K. Smyth.“置换 P 值永远不应该为零:在置换随机抽取时计算精确 P 值”。《统计在遗传学和分子生物学中的应用》9.1 (2010)。
[7]Ludbrook, J., & Dudley, H. (1998)。为什么置换检验优于生物医学研究中的 t 和 F 检验。《美国统计学家》,52(2),127-132。
示例
在 [5] 中,研究了维生素 C 对豚鼠牙齿生长的影响。在对照研究中,60 名受试者被分为小剂量、中剂量和大剂量组,分别接受 0.5、1.0 和 2.0 毫克维生素 C 的每日剂量。42 天后,测量牙齿的生长情况。
下面的
small_dose
、medium_dose
和large_dose
数组记录了三组牙齿生长的测量值,单位为微米。>>> import numpy as np >>> small_dose = np.array([ ... 4.2, 11.5, 7.3, 5.8, 6.4, 10, 11.2, 11.2, 5.2, 7, ... 15.2, 21.5, 17.6, 9.7, 14.5, 10, 8.2, 9.4, 16.5, 9.7 ... ]) >>> medium_dose = np.array([ ... 16.5, 16.5, 15.2, 17.3, 22.5, 17.3, 13.6, 14.5, 18.8, 15.5, ... 19.7, 23.3, 23.6, 26.4, 20, 25.2, 25.8, 21.2, 14.5, 27.3 ... ]) >>> large_dose = np.array([ ... 23.6, 18.5, 33.9, 25.5, 26.4, 32.5, 26.7, 21.5, 23.3, 29.5, ... 25.5, 26.4, 22.4, 24.5, 24.8, 30.9, 26.4, 27.3, 29.4, 23 ... ])
fligner
统计量对样本之间方差的差异很敏感。>>> from scipy import stats >>> res = stats.fligner(small_dose, medium_dose, large_dose) >>> res.statistic 1.3878943408857916
当方差差异较大时,统计量往往较高。
我们可以通过将统计量的观测值与零分布进行比较,对组之间的方差是否相等进行检验:零假设下推导出的统计量值的分布,即三个组的总体方差相等。
对于此检验,零分布遵循卡方分布,如下所示。
>>> import matplotlib.pyplot as plt >>> k = 3 # number of samples >>> dist = stats.chi2(df=k-1) >>> val = np.linspace(0, 8, 100) >>> pdf = dist.pdf(val) >>> fig, ax = plt.subplots(figsize=(8, 5)) >>> def plot(ax): # we'll reuse this ... ax.plot(val, pdf, color='C0') ... ax.set_title("Fligner Test Null Distribution") ... ax.set_xlabel("statistic") ... ax.set_ylabel("probability density") ... ax.set_xlim(0, 8) ... ax.set_ylim(0, 0.5) >>> plot(ax) >>> plt.show()
比较通过 p 值量化:零分布中大于或等于观察到的统计量值的部分比例。
>>> fig, ax = plt.subplots(figsize=(8, 5)) >>> plot(ax) >>> pvalue = dist.sf(res.statistic) >>> annotation = (f'p-value={pvalue:.4f}\n(shaded area)') >>> props = dict(facecolor='black', width=1, headwidth=5, headlength=8) >>> _ = ax.annotate(annotation, (1.5, 0.22), (2.25, 0.3), arrowprops=props) >>> i = val >= res.statistic >>> ax.fill_between(val[i], y1=0, y2=pdf[i], color='C0') >>> plt.show()
>>> res.pvalue 0.49960016501182125
如果 p 值“很小”,即从具有相同方差的分布中抽样数据的概率很低,从而产生了统计量的极值,这可以被用作反对零假设,支持备选假设的证据:组方差不相等。注意
反之则不然;即,该检验不用于为零假设提供证据。
将被视为“小”的值的阈值是一个选择,它应在分析数据前做出 [6],同时考虑产生假阳性(错误地拒绝零假设)和假阴性(未能拒绝错误的零假设)的风险。
小 p 值并不是大量效应的证据;相反,它们只能提供“显著”效应的证据,这意味着它们发生在零假设下的可能性很小。
请注意,卡方分布提供了零分布的渐进近似。对于小样本,进行置换检验可能更为合适:在三个样本均来自同一总体的零假设下,每个测量值在三个样本中的任何一个中被观测到的可能性都相等。因此,我们可以通过计算在将观测值随机划分为三个样本的多次随机生成分区中统计量,形成随机的零分布。
>>> def statistic(*samples): ... return stats.fligner(*samples).statistic >>> ref = stats.permutation_test( ... (small_dose, medium_dose, large_dose), statistic, ... permutation_type='independent', alternative='greater' ... ) >>> fig, ax = plt.subplots(figsize=(8, 5)) >>> plot(ax) >>> bins = np.linspace(0, 8, 25) >>> ax.hist( ... ref.null_distribution, bins=bins, density=True, facecolor="C1" ... ) >>> ax.legend(['aymptotic approximation\n(many observations)', ... 'randomized null distribution']) >>> plot(ax) >>> plt.show()
>>> ref.pvalue # randomized test p-value 0.4332 # may vary
请注意,此处计算出的 p 值与上述
fligner
返回的渐进近似存在明显差异。根据置换检验严格得出的统计推断受到限制;不过,在许多情况下,这可能是首选的方法 [7]。以下是另一个零假设会被拒绝的通用示例。
检验列表 a、b 和 c 是否来自具有相等方差的总体。
>>> a = [8.88, 9.12, 9.04, 8.98, 9.00, 9.08, 9.01, 8.85, 9.06, 8.99] >>> b = [8.88, 8.95, 9.29, 9.44, 9.15, 9.58, 8.36, 9.18, 8.67, 9.05] >>> c = [8.95, 9.12, 8.95, 8.85, 9.03, 8.84, 9.07, 8.98, 8.86, 8.98] >>> stat, p = stats.fligner(a, b, c) >>> p 0.00450826080004775
较小的 p 值表明这些总体不具有相等方差。
这并不奇怪,原因在于b 的样本方差明显大于 a 和 c
>>> [np.var(x, ddof=1) for x in [a, b, c]] [0.007054444444444413, 0.13073888888888888, 0.008890000000000002]