scipy.stats.

siegelslopes#

scipy.stats.siegelslopes(y, x=None, method='hierarchical')[源代码][源代码]#

计算一组点 (x, y) 的 Siegel 估计量。

siegelslopes 实现了一种使用重复中位数(参见 [1])进行稳健线性回归的方法,以拟合点 (x, y) 的直线。该方法对异常值具有 50% 的渐近崩溃点。

参数:
yarray_like

因变量。

x类似数组或无,可选

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

方法{‘层次结构’, ‘分离’}

如果为 ‘hierarchical’,使用估计的斜率 slope 来估计截距(默认选项)。如果为 ‘separate’,则独立于估计的斜率来估计截距。详见注释。

返回:
结果 : SiegelslopesResult 实例SiegelslopesResult 实例

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

斜率浮动

回归线的斜率估计。

拦截浮动

回归线的截距估计值。

参见

theilslopes

一种类似的技术,无需重复中位数

注释

n = len(y),计算 m_j 为从点 (x[j], y[j]) 到所有其他 n-1 个点的斜率的中位数。slope 则是所有斜率 m_j 的中位数。在 [1] 中给出了两种估计截距的方法,可以通过参数 method 选择。层次化方法使用估计的斜率 slope,并将 intercept 计算为 y - slope*x 的中位数。另一种方法单独估计截距,如下所示:对于每个点 (x[j], y[j]),计算通过剩余点的所有 n-1 条线的截距,并取中位数 i_jintercept 是所有 i_j 的中位数。

该实现计算了大小为 n 的向量的 n 次中位数,这对于大型向量来说可能会很慢。有更高效的算法(参见 [2]),但这里没有实现。

为了与旧版本的 SciPy 兼容,返回值的行为类似于长度为 2 的 namedtuple,具有 slopeintercept 字段,因此可以继续编写:

slope, intercept = siegelslopes(y, x)

参考文献

[1] (1,2)

A. Siegel, “Robust Regression Using Repeated Medians”, Biometrika, Vol. 69, pp. 242-244, 1982.

[2]

A. Stein and M. Werman, “Finding the repeated median regression line”, Proceedings of the Third Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 409-413, 1992.

示例

>>> 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

计算斜率和截距。为了比较,也使用 linregress 计算最小二乘拟合:

>>> res = stats.siegelslopes(y, x)
>>> lsq_res = stats.linregress(x, y)

绘制结果。Siegel回归线以红色显示。绿色线显示了用于比较的最小二乘拟合。

>>> 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, lsq_res[1] + lsq_res[0] * x, 'g-')
>>> plt.show()
../../_images/scipy-stats-siegelslopes-1.png