Стандартные ошибки для коэффициентов регрессии

Я сделал многомерную регрессию, используя sklearn.линейная модель.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 ответов


на основе этот вопрос статистика и Википедия, Я:

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)

однако моя линейная алгебра и статистика довольно бедны, поэтому я могу пропустить что-то важное. Другим вариантом может быть загрузка оценки дисперсии.


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


этот код был протестирован с данными. Они правы.

найти матрицу 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.

квадратных сумме

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-статистика с использованием, линейная.intercept_ для одной переменной)

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

я обнаружил, что принятый ответ имел некоторые математические сбои, которые в общей сложности потребовали бы изменений за пределами рекомендуемый этикет для изменения сообщений. Итак, вот решение для вычисления стандартной оценки ошибки для коэффициентов, полученных с помощью линейной модели (используя беспристрастную оценку, как предложено здесь):

# 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 таким образом, соответствовать перехватить срок. Кроме того, нам нужно вычислить среднюю квадратную ошибку (MSE), как в ANOVA. То есть нам нужно разделить сумму квадратов ошибок (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]))

на пример из документации показывает, как получить среднюю квадратную ошибку и объяснить оценку дисперсии:

# 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))

это то, что вам нужно?