scipy.stats.

theilslopes#

scipy.stats.theilslopes(y, x=None, alpha=0.95, method='separate', *, axis=None, nan_policy='propagate', keepdims=False)[source]#

计算一组点 (x, y) 的 Theil-Sen 估计量。

theilslopes 实现了一种稳健线性回归方法。 它计算成对值之间所有斜率的中值作为斜率。

参数:
yarray_like

因变量。

xarray_like 或 None,可选

自变量。 如果为 None,则使用 arange(len(y)) 代替。

alphafloat,可选

介于 0 和 1 之间的置信度。 默认值为 95% 置信度。 请注意,alpha 围绕 0.5 对称,即 0.1 和 0.9 都被解释为“找到 90% 的置信区间”。

method{‘joint’, ‘separate’}, optional

用于计算截距估计的方法。 支持以下方法,

  • ‘joint’: 使用 np.median(y - slope * x) 作为截距。

  • ‘separate’: 使用 np.median(y) - slope * np.median(x)

    作为截距。

默认为 ‘separate’。

1.8.0 版本中新增。

axisint 或 None,默认值:None

如果是一个整数,则为沿着计算统计量的输入的轴。输入的每个轴切片(例如,行)的统计量将出现在输出的相应元素中。如果 None,则在计算统计量之前将输入展平。

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

定义如何处理输入 NaN。

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

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

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

keepdimsbool,默认值:False

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

返回:
resultTheilslopesResult 实例

返回值是一个具有以下属性的对象

slopefloat

Theil 斜率。

interceptfloat

Theil 线的截距。

low_slopefloat

slope 的置信区间的下限。

high_slopefloat

slope 的置信区间的上限。

参见

siegelslopes

一种使用重复中值的类似技术

注释

theilslopes 的实现遵循 [1]。 截距未在 [1] 中定义,此处将其定义为 median(y) - slope*median(x),这在 [3] 中给出。 文献中存在截距的其他定义,例如 median(y - slope*x)[4] 中。 可以通过参数 method 来确定计算截距的方法。 不提供截距的置信区间,因为 [1] 中未解决此问题。

为了与 SciPy 的旧版本兼容,返回值的作用类似于长度为 4 的 namedtuple,其字段为 slopeinterceptlow_slopehigh_slope,因此可以继续编写

slope, intercept, low_slope, high_slope = theilslopes(y, x)

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

参考文献

[1] (1,2,3)

P.K. Sen, “Estimates of the regression coefficient based on Kendall’s tau”, J. Am. Stat. Assoc., Vol. 63, pp. 1379-1389, 1968.

[2]

H. Theil, “A rank-invariant method of linear and polynomial regression analysis I, II and III”, Nederl. Akad. Wetensch., Proc. 53:, pp. 386-392, pp. 521-525, pp. 1397-1412, 1950.

[3]

W.L. Conover, “Practical nonparametric statistics”, 2nd ed., John Wiley and Sons, New York, pp. 493.

示例

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(-5, 5, num=150)
>>> y = x + np.random.normal(size=x.size)
>>> y[11:15] += 10  # add outliers
>>> y[-5:] -= 7

计算斜率、截距和 90% 的置信区间。 为了进行比较,还可以使用 linregress 计算最小二乘拟合

>>> res = stats.theilslopes(y, x, 0.90, method='separate')
>>> lsq_res = stats.linregress(x, y)

绘制结果。 Theil-Sen 回归线以红色显示,虚线红色线说明了斜率的置信区间(请注意,虚线红色线不是回归的置信区间,因为不包括截距的置信区间)。 绿线显示最小二乘拟合以进行比较。

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.plot(x, y, 'b.')
>>> ax.plot(x, res[1] + res[0] * x, 'r-')
>>> ax.plot(x, res[1] + res[2] * x, 'r--')
>>> ax.plot(x, res[1] + res[3] * x, 'r--')
>>> ax.plot(x, lsq_res[1] + lsq_res[0] * x, 'g-')
>>> plt.show()
../../_images/scipy-stats-theilslopes-1.png