多元回归系数的标准误差

时间:2014-01-05 19:34:18

标签: python scikit-learn linear-regression

我使用sklearn.linear_model.LinearRegression进行了多元回归并获得了回归系数:

    import numpy as np
    from sklearn import linear_model
    clf = linear_model.LinearRegression()
    TST = np.vstack([x1,x2,x3,x4])
    TST = TST.transpose()
    clf.fit (TST,y)
    clf.coef_

现在,我需要这些相同系数的标准误差。我怎样才能做到这一点? 非常感谢。

5 个答案:

答案 0 :(得分:4)

基于this stats questionwikipedia,我最好的猜测是:

MSE = np.mean((y - clf.predict(TST).T)**2)
var_est = MSE * np.diag(np.linalg.pinv(np.dot(TST.T,TST)))
SE_est = np.sqrt(var_est)

然而,我的线性代数和统计数据都很差,所以我可能会遗漏一些重要的东西。另一个选择可能是引导方差估计。

答案 1 :(得分:1)

MSE = np.mean((y - clf.predict(TST).T)**2)
var_est = MSE * np.diag(np.linalg.pinv(np.dot(TST.T,TST)))
SE_est = np.sqrt(var_est)

我猜这个答案并不完全正确。 特别是,如果我没有错,根据你的代码,sklearn会添加常量项,以便默认计算你的系数。

然后,您需要在矩阵TST中包含一列。然后,代码是正确的,它会给你一个包含所有SE的数组

答案 2 :(得分:0)

这些代码已经过数据测试。他们是对的。

找到每个数据集的X矩阵,n是数据集的长度,m是变量数

X, n, m=arrays(data) 
y=***.reshape((n,1))
linear = linear_model.LinearRegression()
linear.fit(X, y , n_jobs=-1) ## delete n_jobs=-1, if it's one variable only.

sum square

s=np.sum((linear.predict(X) - y) ** 2)/(n-(m-1)-1) 

标准差,方差 - 协方差矩阵对角线的平方根(sigular向量分解)

sd_alpha=np.sqrt(s*(np.diag(np.linalg.pinv(np.dot(X.T,X))))) 

(t-statistics使用,linear.intercept_为一个变量)

t_stat_alpha=linear.intercept_[0]/sd_alpha[0]  #( use linear.intercept_ for one variable_

答案 3 :(得分:0)

我发现接受的答案有一些数学故障,总共要求编辑超出recommended etiquette for modifying posts。因此,这里有一个计算通过线性模型获得的系数的标准误差估计的解决方案(使用建议here的无偏估计):

# preparation
X = np.concatenate((np.ones(TST.shape[0], 1)), TST), axis=1)
y_hat = clf.predict(TST).T
m, n = X.shape

# computation
MSE = np.sum((y_hat - y)**2)/(m - n)
coef_var_est = MSE * np.diag(np.linalg.pinv(np.dot(X.T,X)))
coef_SE_est = np.sqrt(var_est)

请注意,我们必须向TST添加一列,因为原始帖子使用的linear_model.LinearRegression符合拦截术语。此外,我们需要计算ANOVA中的均方误差(MSE)。也就是说,我们需要将误差平方和(SSE)除以误差的自由度,即df_error = df_observations - df_features。

结果数组coef_SE_est包含截距的标准误差估计值以及coef_SE_est[0]coef_SE_est[1:]中的所有其他系数。要打印出来,你可以使用

print('intercept: coef={:.4f} / std_err={:.4f}'.format(clf.intercept_[0], coef_SE_est[0]))
for i, coef in enumerate(clf.coef_[0,:]):
    print('x{}: coef={:.4f} / std_err={:.4f}'.format(i+1, coef, coef_SE_est[i+1]))

答案 4 :(得分:-1)

example from the documentation显示如何获得均方误差并解释方差分数:

# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)

# The coefficients
print('Coefficients: \n', regr.coef_)

# The mean square error
print("Residual sum of squares: %.2f"
      % np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))

# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))

这是否涵盖了您的需求?