如何进行线性回归并获得标准差 (Python)
How to do Linear Regression and get Standard Deviation (Python)
我有一个非常简单的问题,但不知何故我还没有找到解决方案:
我有两条曲线,A1 = [1,2,3] A2 = [4,5,6]
我想用线性回归将这些曲线拟合到另一条曲线 B1 = [4,5,3] 所以 B1 = aA1 + bA2
这可以使用 sklearn LinearRegression 轻松完成 - 但 sklearn 不会为您提供拟合参数的标准偏差。
我试过使用 statsmodels...但不知何故我无法正确设置格式
import numpy as np
import statsmodels.api as sm
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([4, 5, 3])
ols = sm.OLS(a, b)
错误:ValueError:endog 和 exog 矩阵大小不同
假设您有一个数据矩阵 X
,其中每一行都是一个观察值和一个列向量 y
,OLS 解决方案由
给出
beta_hat = (X'X)^(-1)*X'*y
其中 X'
是 X
的转置,X^(-1)
是其逆。
系数的方差为
Var(beta)= s^2*(X'*X)
其中 s^2
是数据的估计方差。
有了它,您可以使用任何 linalg 工具,例如 numpy 来轻松进行计算
如果你的公式是B1 = aA1 + bA2
,那么数组b是你的内生的,数组a是你的外生的。你需要转置你的外生:
ols = sm.OLS(b, a.T)
res = ols.fit()
res.summary()
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.250
Model: OLS Adj. R-squared: -0.500
Method: Least Squares F-statistic: 0.3333
Date: Sat, 14 Aug 2021 Prob (F-statistic): 0.667
Time: 05:48:08 Log-Likelihood: -3.2171
No. Observations: 3 AIC: 10.43
Df Residuals: 1 BIC: 8.631
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
x1 -2.1667 1.462 -1.481 0.378 -20.749 16.416
x2 1.6667 0.624 2.673 0.228 -6.257 9.590
==============================================================================
Omnibus: nan Durbin-Watson: 3.000
Prob(Omnibus): nan Jarque-Bera (JB): 0.531
Skew: 0.707 Prob(JB): 0.767
Kurtosis: 1.500 Cond. No. 12.3
==============================================================================
来自 sklearn:
from sklearn.linear_model import LinearRegression
reg = LinearRegression(fit_intercept=False).fit(a.T,b)
reg.coef_
array([-2.16666667, 1.66666667])
我有一个非常简单的问题,但不知何故我还没有找到解决方案:
我有两条曲线,A1 = [1,2,3] A2 = [4,5,6]
我想用线性回归将这些曲线拟合到另一条曲线 B1 = [4,5,3] 所以 B1 = aA1 + bA2
这可以使用 sklearn LinearRegression 轻松完成 - 但 sklearn 不会为您提供拟合参数的标准偏差。
我试过使用 statsmodels...但不知何故我无法正确设置格式
import numpy as np
import statsmodels.api as sm
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([4, 5, 3])
ols = sm.OLS(a, b)
错误:ValueError:endog 和 exog 矩阵大小不同
假设您有一个数据矩阵 X
,其中每一行都是一个观察值和一个列向量 y
,OLS 解决方案由
beta_hat = (X'X)^(-1)*X'*y
其中 X'
是 X
的转置,X^(-1)
是其逆。
系数的方差为
Var(beta)= s^2*(X'*X)
其中 s^2
是数据的估计方差。
有了它,您可以使用任何 linalg 工具,例如 numpy 来轻松进行计算
如果你的公式是B1 = aA1 + bA2
,那么数组b是你的内生的,数组a是你的外生的。你需要转置你的外生:
ols = sm.OLS(b, a.T)
res = ols.fit()
res.summary()
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.250
Model: OLS Adj. R-squared: -0.500
Method: Least Squares F-statistic: 0.3333
Date: Sat, 14 Aug 2021 Prob (F-statistic): 0.667
Time: 05:48:08 Log-Likelihood: -3.2171
No. Observations: 3 AIC: 10.43
Df Residuals: 1 BIC: 8.631
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
x1 -2.1667 1.462 -1.481 0.378 -20.749 16.416
x2 1.6667 0.624 2.673 0.228 -6.257 9.590
==============================================================================
Omnibus: nan Durbin-Watson: 3.000
Prob(Omnibus): nan Jarque-Bera (JB): 0.531
Skew: 0.707 Prob(JB): 0.767
Kurtosis: 1.500 Cond. No. 12.3
==============================================================================
来自 sklearn:
from sklearn.linear_model import LinearRegression
reg = LinearRegression(fit_intercept=False).fit(a.T,b)
reg.coef_
array([-2.16666667, 1.66666667])