siegelslopes#
- scipy.stats.siegelslopes(y, x=None, method='hierarchical')[source]#
针对一组点 (x, y) 计算 Siegel 估计量。
siegelslopes
实现了一种使用重复中位数进行稳健线性回归的方法(请参见 [1]),以便将一条线拟合到点 (x, y)。该方法对渐近击穿点为 50% 的异常值具有很强的鲁棒性。- 参数:
- yarray_like
因变量。
- xarray_like 或 None,可选
自变量。如果为 None,则改用
arange(len(y))
。- method{‘hierarchical’, ‘separate’}
如果为“hierarchical”,使用估计的斜率
slope
估算截距(默认选项)。如果为“separate”,估计与估计斜率无关的截距。有关详细信息,请参见备注。
- 返回:
- result
SiegelslopesResult
实例 返回值是一个具有以下属性的对象
- slopefloat
回归线斜率的估计值。
- interceptfloat
回归线截距的估计值。
- result
另请参阅
theilslopes
没有重复中值的类似技术
注释
使用
n = len(y)
,将从点(x[j], y[j])
到所有其他 n-1 个点的斜率的中值计算为m_j
。则slope
是所有斜率m_j
的中值。在 [1] 中提供了估算截距的两种方法,可以通过参数method
进行选择。分层方法使用估算的斜率slope
并将intercept
计算为y - slope*x
的中值。另一种方法分别估算截距,如下所示:对于每个点(x[j], y[j])
,计算通过剩余点的所有 n-1 条线的截距,并取中值i_j
。intercept
是i_j
的中值。该实现将大小为 n 的向量的中值计算重复 n 次,这对于大向量来说速度可能会很慢。还有一些更有效的算法(参见 [2]),但这里未实现。
为与旧版本 SciPy 兼容,返回值表现得像长度为 2 的
namedtuple
,其字段为slope
和intercept
,因此可以继续编写slope, intercept = siegelslopes(y, x)
参考文献
[2]A. Stein 和 M. Werman,"寻找重复的中值回归线",第三届 ACM-SIAM 离散算法研讨会论文集,第 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()