scipy.stats.
linregress#
- scipy.stats.linregress(x, y=None, alternative='two-sided')[源代码]#
针对两组测量值计算线性最小二乘回归。
- 参数:
- x, yarray_like
两组测量值。两个数组应该有相同的长度 N。如果仅给出了 x (并且
y=None
),那么它必须是一个二维数组,其中一个维度具有长度 2。然后,通过沿长度为 2 的维度分割数组来找到两组测量值。当y=None
且 x 是一个 2xN 数组时,linregress(x)
等于linregress(x[0], x[1])
。自版本 1.14.0 起弃用:从一个参数 x 推断两组测量值不再建议使用,SciPy 1.16.0 中将导致错误;这些集合必须分别指定为 x 和 y。
- alternative{‘two-sided’, ‘less’, ‘greater’},可选
定义备择假设。默认值为‘two-sided’。可用的选项如下
“双向”:回归直线的斜率不为零
“小于”:回归直线的斜率小于零
“大于”:回归直线的斜率大于零
在 1.7.0 版本中添加。
- 返回:
- result
LinregressResult
实例 返回值是一个具有以下属性的对象
- 斜率浮点型
回归直线的斜率。
- 截距浮点型
回归直线的截距。
- rvalue浮点型
皮尔逊相关系数。
rvalue
的平方等于确定系数。- pvalue浮点型
对于原假设为斜率为零的假设检验的 P 值,使用 t 分布检验统计量进行 Wald 检验。另请参阅上文的替代方案以获取备选假设。
- stderr浮点型
根据残差正态性假设,估计的斜率(梯度)的标准误。
- intercept_stderr浮点型
根据残差正态性假设,估计的截距的标准误。
- result
另请参见
scipy.optimize.curve_fit
使用非线性最小二乘法使函数拟合数据。
scipy.optimize.leastsq
最小化一组方程的平方和。
备注
为了与 SciPy 的较旧版本兼容,返回值的行为就像是一个长度为 5 的
命名元组
,其字段为slope
、intercept
、rvalue
、pvalue
和stderr
,因此可以继续编写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.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()
计算斜率和截距的 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