scipy.stats.mstats.

linregress#

scipy.stats.mstats.linregress(x, y=None)[source]#

計算兩組量測值的線性最小平方法迴歸。

參數:
x, yarray_like

兩組量測值。兩個陣列應具有相同的長度 N。如果僅提供 x (且 y=None),則它必須是二維陣列,其中一個維度的長度為 2。然後透過沿長度為 2 的維度分割陣列來找到兩組量測值。在 y=Nonex 是 2xN 陣列的情況下,linregress(x) 等效於 linregress(x[0], x[1])

回傳值:
resultLinregressResult 實例

回傳值是一個具有以下屬性的物件

slopefloat

迴歸線的斜率。

interceptfloat

迴歸線的截距。

rvaluefloat

皮爾森相關係數。rvalue 的平方等於判定係數。

pvaluefloat

假設檢定的 p 值,其虛無假設是斜率為零,使用 Wald 檢定和檢定統計量的 t 分佈。有關替代假設,請參閱上面的 alternative

stderrfloat

在殘差常態性的假設下,估計斜率(梯度)的標準誤。

intercept_stderrfloat

在殘差常態性的假設下,估計截距的標準誤。

另請參閱

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