scipy.stats.mstats.

linregress#

scipy.stats.mstats.linregress(x, y=None)[源代码]#

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

参数:
x, y类数组

两组测量值。两个数组应具有相同的长度 N。如果仅给出了 x (且 y=None),则它必须是一个双维数组,其中一个维度的长度为 2。然后通过沿长度为 2 的维度拆分数组来找到两组测量值。当 y=Nonex 为 2xN 数组时,linregress(x) 等效于 linregress(x[0], x[1])

返回:
resultLinregressResult 实例

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

slope浮点

回归线的斜率。

intercept浮点

回归线的截距。

rvalue浮点

Pearson 相关系数。rvalue 的平方等于决定系数。

pvalue浮点

采用 t 分布的检验统计量,使用 Wald 检验的 p 值,用于检验零假设(即斜率为零)的假设检验。请参阅上述 alternative 以了解备用假设。

stderr浮点数

在残差正态性假设下,对估计的斜率(梯度)进行标准误差分析。

intercept_stderr浮点数

在残差正态性假设下,对估计截距进行标准误差分析。

另外请参阅

scipy.optimize.curve_fit

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

scipy.optimize.leastsq

最小化一系列方程式的平方和。

注释

成对考虑缺失值:如果 x 中存在缺失值,则 y 中的相应值将被屏蔽。

为了与旧版本的 SciPy 兼容,返回值将表现为长度为 5 的 namedtuple,其字段为 slopeinterceptrvaluepvaluestderr,因此可以继续编写

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

然而,采用这种样式时,不能使用截距的标准误差。要访问所有计算值(包括截距的标准误差),请将返回值用作具有属性的对象,例如

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

示例

>>> import numpy as np
>>> 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.mstats.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-mstats-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