tl;dr
虽然scikit-learn不能计算,但是您可以使用一些线性代数手动计算。下面是您的示例代码。
此外,这里有一个带有此代码的jupyter笔记本:https://gist.github.com/grisaitis/cf481034bb413a14d3ea851dab201d31
what and why
您的估计标准误差只是您估计方差的平方根。您的估计方差是多少?如果假设您的模型具有高斯误差,则为:
Var(beta_hat) = inverse(X.T @ X) * sigma_squared_hat
然后,beta_hat[i]
的标准误差为Var(beta_hat)[i, i] ** 0.5
。
您只需要计算sigma_squared_hat
。这是您模型的高斯误差的估计值。这不是先验已知的,但可以用残差的样本方差进行估计。
此外,您需要在数据矩阵中添加拦截项。Scikit-learn使用LinearRegression
类自动执行此操作。因此,如果要手动计算,则需要将其添加到X矩阵或数据帧中。
how
从您的代码开始,
show your scikit-learn results
print(model.intercept_)
print(model.coef_)
[-0.28671532]
[[ 0.17501115 -0.6928708 0.22336584]]
用线性代数实现这个问题
N = len(X)
p = len(X.columns) + 1
X_with_intercept = np.empty(shape=(N, p), dtype=np.float)
X_with_intercept[:, 0] = 1
X_with_intercept[:, 1:p] = X.values
beta_hat = np.linalg.inv(X_with_intercept.T @ X_with_intercept) @ X_with_intercept.T @ y.values
print(beta_hat)
[[-0.28671532]
[ 0.17501115]
[-0.6928708 ]
[ 0.22336584]]
计算参数估计的标准误差
y_hat = model.predict(X)
residuals = y.values - y_hat
residual_sum_of_squares = residuals.T @ residuals
sigma_squared_hat = residual_sum_of_squares[0, 0] / (N - p)
var_beta_hat = np.linalg.inv(X_with_intercept.T @ X_with_intercept) * sigma_squared_hat
for p_ in range(p):
standard_error = var_beta_hat[p_, p_] ** 0.5
print(f"SE(beta_hat[{p_}]): {standard_error}")
SE(beta_hat[0]): 0.2468580488280805
SE(beta_hat[1]): 0.2965501221823944
SE(beta_hat[2]): 0.3518847753610169
SE(beta_hat[3]): 0.3250760291745124
使用statsmodels
进行确认
import statsmodels.api as sm
ols = sm.OLS(y.values, X_with_intercept)
ols_result = ols.fit()
ols_result.summary()
...
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.2867 0.247 -1.161 0.290 -0.891 0.317
x1 0.1750 0.297 0.590 0.577 -0.551 0.901
x2 -0.6929 0.352 -1.969 0.096 -1.554 0.168
x3 0.2234 0.325 0.687 0.518 -0.572 1.019
==============================================================================
太好了,完成了!
sigma_squared_hat = residual_sum_of_squares [0,0] /(N-p)
处报错无效的标量变量索引
。residual_sum_of_squares
计算结果为numpy.float64
。我漏掉了什么? - Bharat