scipy.stats.

f_oneway#

scipy.stats.f_oneway(*samples, axis=0, equal_var=True, nan_policy='propagate', keepdims=False)[source]#

执行单因素方差分析。

单因素方差分析检验两个或多个组是否具有相同的总体均值的零假设。 该检验应用于来自两个或多个组的样本,这些组的大小可能不同。

参数:
sample1, sample2, …array_like

每个组的样本测量值。 必须至少有两个参数。 如果数组是多维的,则数组的所有维度必须相同,但 axis 除外。

axisint 或 None,默认值: 0

如果为 int,则为计算统计量的输入轴。 输入的每个轴切片(例如,行)的统计量将显示在输出的相应元素中。 如果为 None,则在计算统计量之前将平铺输入。

equal_var: bool, 可选

如果为 True(默认值),则执行标准单因素方差分析检验,该检验假定总体方差相等 [2]。 如果为 False,则执行 Welch 方差分析检验,该检验不假定总体方差相等 [4]

1.15.0 版本中新增。

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

定义如何处理输入 NaN。

  • propagate: 如果在计算统计量的轴切片(例如,行)中存在 NaN,则输出的相应条目将为 NaN。

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

  • raise: 如果存在 NaN,则将引发 ValueError

keepdimsbool,默认值: False

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

返回:
statisticfloat

检验的计算出的 F 统计量。

pvaluefloat

来自 F 分布的关联 p 值。

警告:
ConstantInputWarning

如果每个输入数组中的所有值都相同,则发出。 在这种情况下,F 统计量是无穷大或未定义,因此返回 np.infnp.nan

RuntimeWarning

如果任何输入数组的长度为 0,或者所有输入数组的长度都为 1,则发出。 在这些情况下,F 统计量和 p 值返回 np.nan

注释

ANOVA 检验具有重要的假设,必须满足这些假设才能使关联的 p 值有效。

  1. 样本是独立的。

  2. 每个样本都来自正态分布的总体。

  3. 各组的总体标准偏差都相等。 这种属性称为同方差性。

如果这些假设对于给定的数据集不成立,仍然可以使用 Kruskal-Wallis H 检验 (scipy.stats.kruskal) 或 Alexander-Govern 检验 (scipy.stats.alexandergovern),尽管会损失一些功效。

每组的长度必须至少为 1,并且必须至少有一组的长度大于 1。 如果不满足这些条件,则会生成警告并返回 (np.nan, np.nan)。

如果每组中的所有值都相同,并且存在至少两组具有不同的值,则该函数会生成警告并返回 (np.inf, 0)。

如果所有组中的所有值都相同,则该函数会生成警告并返回 (np.nan, np.nan)。

该算法来自 Heiman [2],第 394-7 页。

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

参考文献

[1]

R. Lowry,“推论统计的概念和应用”,第 14 章,2014 年,http://vassarstats.net/textbook/

[2] (1,2)

G.W. Heiman,“理解研究方法和统计:心理学的综合介绍”,Houghton, Mifflin and Company, 2001。

[3]

G.H. McDonald,“生物统计手册”,单因素方差分析。 http://www.biostathandbook.com/onewayanova.html

[4]

B. L. Welch,“关于比较几个平均值:一种替代方法”,Biometrika,第 38 卷,第 3/4 期,第 330-336 页,1951 年,doi: 10.2307/2332579。

示例

>>> import numpy as np
>>> from scipy.stats import f_oneway

以下是一些关于贻贝 Mytilus trossulus 中外展肌前疤痕长度(通过除以长度进行标准化)的测量数据 [3],来自五个地点:俄勒冈州蒂拉穆克;俄勒冈州纽波特;阿拉斯加州彼得堡;俄罗斯马加丹;以及芬兰的特瓦尔明内,这些数据来自 McDonald 等人 (1991) 中使用的一个更大的数据集。

>>> tillamook = [0.0571, 0.0813, 0.0831, 0.0976, 0.0817, 0.0859, 0.0735,
...              0.0659, 0.0923, 0.0836]
>>> newport = [0.0873, 0.0662, 0.0672, 0.0819, 0.0749, 0.0649, 0.0835,
...            0.0725]
>>> petersburg = [0.0974, 0.1352, 0.0817, 0.1016, 0.0968, 0.1064, 0.105]
>>> magadan = [0.1033, 0.0915, 0.0781, 0.0685, 0.0677, 0.0697, 0.0764,
...            0.0689]
>>> tvarminne = [0.0703, 0.1026, 0.0956, 0.0973, 0.1039, 0.1045]
>>> f_oneway(tillamook, newport, petersburg, magadan, tvarminne)
F_onewayResult(statistic=7.121019471642447, pvalue=0.0002812242314534544)

f_oneway 接受多维输入数组。 当输入是多维的并且未给出 axis 时,测试将沿输入数组的第一个轴执行。 对于以下数据,测试将执行三次,每列一次。

>>> a = np.array([[9.87, 9.03, 6.81],
...               [7.18, 8.35, 7.00],
...               [8.39, 7.58, 7.68],
...               [7.45, 6.33, 9.35],
...               [6.41, 7.10, 9.33],
...               [8.00, 8.24, 8.44]])
>>> b = np.array([[6.35, 7.30, 7.16],
...               [6.65, 6.68, 7.63],
...               [5.72, 7.73, 6.72],
...               [7.01, 9.19, 7.41],
...               [7.75, 7.87, 8.30],
...               [6.90, 7.97, 6.97]])
>>> c = np.array([[3.31, 8.77, 1.01],
...               [8.25, 3.24, 3.62],
...               [6.32, 8.81, 5.19],
...               [7.48, 8.83, 8.91],
...               [8.59, 6.01, 6.07],
...               [3.07, 9.72, 7.48]])
>>> F = f_oneway(a, b, c)
>>> F.statistic
array([1.75676344, 0.03701228, 3.76439349])
>>> F.pvalue
array([0.20630784, 0.96375203, 0.04733157])

如果 equal_var 为 False,则将执行 Welch 方差分析。