theilslopes#
- scipy.stats.theilslopes(y, x=None, alpha=0.95, method='separate')[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’},可选
用于计算截距估计的方法。支持以下方法:
‘joint’:使用 np.median(y - slope * x) 作为截距。
- ‘separate’:使用 np.median(y) - slope * np.median(x)
作为截距。
默认值为 'separate'。
在版本 1.8.0 中添加。
- 返回值::
- result
TheilslopesResult
实例 返回值是一个具有以下属性的对象
- slopefloat
Theil 斜率。
- interceptfloat
Theil 直线的截距。
- low_slopefloat
slope 置信区间的下限。
- high_slopefloat
slope 置信区间的上限。
- result
另请参阅
siegelslopes
使用重复中位数的类似技术
注释
theilslopes
的实现遵循 [1]。截距在 [1] 中没有定义,这里它被定义为median(y) - slope*median(x)
,这在 [3] 中给出。其他截距定义存在于文献中,例如 [4] 中的median(y - slope*x)
。计算截距的方法可以通过参数method
确定。不提供截距的置信区间,因为这个问题在 [1] 中没有解决。为了与旧版本的 SciPy 保持兼容性,返回值的行为类似于长度为 4 的
namedtuple
,具有字段slope
、intercept
、low_slope
和high_slope
,因此您可以继续编写slope, intercept, low_slope, high_slope = theilslopes(y, x)
参考文献
[2]H. Theil,“线性与多项式回归分析的秩不变方法 I、II 和 III”,Nederl. Akad. Wetensch.,Proc. 53:,第 386-392 页,第 521-525 页,第 1397-1412 页,1950 年。
[3]W.L. Conover,“实用非参数统计”,第 2 版,John Wiley and Sons,纽约,第 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()