scipy.stats.linregress

scipy.stats.linregress(x, y=None, alternative='two-sided')[源代码]

计算两组测量值的线性最小二乘回归。

参数
x, yarray_like

两套尺寸。两个数组的长度应该相同。要是 x 已给出(和 y=None ),则它一定是一个二维数组,其中一维的长度为2。然后,通过沿长度-2维拆分该数组来找到两组测量值。在以下情况下 y=Nonex 是2x2阵列, linregress(x) 相当于 linregress(x[0], x[1])

alternative{‘双面’,‘少’,‘大’},可选

定义了另一种假设。默认值为“双面”。以下选项可用:

  • ‘双边’:回归线的斜率非零

  • ‘Less’:回归线的斜率小于零

  • ‘较大’:回归线的斜率大于零

1.7.0 新版功能.

退货
结果LinregressResult 实例LinregressResult实例

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

坡度浮动

回归线的坡度。

拦截浮动

回归线的截距。

右值浮动

皮尔逊相关系数。的正方形 rvalue 等于决定系数。

p值浮动

假设检验的p值,其零假设是斜率为零,使用带有检验统计量t分布的Wald检验。看见 alternative 以上可供选择的假设。

标准错误浮动

在残差正态假设下,估计斜率(坡度)的标准误差。

intercept_stderr浮动

在残差正态假设下,估计截距的标准误差。

参见

scipy.optimize.curve_fit

使用非线性最小二乘法来拟合函数以适应数据。

scipy.optimize.leastsq

最小化一组方程的平方和。

注意事项

缺少的值被认为是成对的:如果 x 中的相应值 y 戴着面具。

为了与旧版本的SciPy兼容,返回值的作用类似于 namedtuple 长度为5,带字段 slopeinterceptrvaluepvaluestderr ,所以人们可以继续写::

slope, intercept, r, p, se = linregress(x, y)

然而,对于这种风格,拦截的标准误差是不可用的。要访问所有计算值(包括截取的标准误差),请将返回值用作具有属性的对象,例如:

result = linregress(x, y)
print(result.intercept, result.intercept_stderr)

示例

>>> import matplotlib.pyplot as plt
>>> from scipy import stats
>>> rng = np.random.default_rng()

生成一些数据:

>>> x = rng.random(10)
>>> y = 1.6*x + rng.random(10)

执行线性回归:

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

确定系数(R平方):

>>> print(f"R-squared: {res.rvalue**2:.6f}")
R-squared: 0.717533

将数据与拟合的直线一起绘制:

>>> plt.plot(x, y, 'o', label='original data')
>>> plt.plot(x, res.intercept + res.slope*x, 'r', label='fitted line')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-stats-linregress-1_00_00.png

计算坡度和截距的95%置信区间:

>>> # Two-sided inverse Students t-distribution
>>> # p - probability, df - degrees of freedom
>>> from scipy.stats import t
>>> tinv = lambda p, df: abs(t.ppf(p/2, df))
>>> ts = tinv(0.05, len(x)-2)
>>> print(f"slope (95%): {res.slope:.6f} +/- {ts*res.stderr:.6f}")
slope (95%): 1.453392 +/- 0.743465
>>> print(f"intercept (95%): {res.intercept:.6f}"
...       f" +/- {ts*res.intercept_stderr:.6f}")
intercept (95%): 0.616950 +/- 0.544475