Как я могу найти значение p (значимость) каждого коэффициента?
lm = sklearn.linear_model.LinearRegression()
lm.fit(x,y)
python
numpy
statistics
scikit-learn
regression
elplatt
источник
источник
Ответы:
Это своего рода излишество, но давайте попробуем. Сначала давайте используем statsmodel, чтобы узнать, какими должны быть значения p
и мы получаем
Хорошо, давайте воспроизведем это. Это отчасти излишне, поскольку мы практически воспроизводим линейный регрессионный анализ с использованием матричной алгебры. Но какого черта.
И это дает нам.
Таким образом, мы можем воспроизвести значения из statsmodel.
источник
code
np.linalg.inv может иногда возвращать результат, даже если матрица необратима. Это может быть проблемой.nan
. Для меня это было потому, что мои данныеX
были выборкой, поэтому индекс был отключен. Это вызывает ошибки при звонкеpd.DataFrame.join()
. Я сделал это изменение одной строки, и теперь, похоже, работает:newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X.reset_index(drop=True)))
LinearRegression от scikit-learn не вычисляет эту информацию, но вы можете легко расширить класс, чтобы сделать это:
Украдена отсюда .
Вы должны взглянуть на statsmodels для этого вида статистического анализа в Python.
источник
РЕДАКТИРОВАТЬ: Возможно, не правильный способ сделать это, см. Комментарии
Вы можете использовать sklearn.feature_selection.f_regression.
нажмите здесь, чтобы перейти на страницу scikit-learn
источник
Код в ответе elyase https://stackoverflow.com/a/27928411/4240413 на самом деле не работает. Обратите внимание, что sse является скаляром, и затем он пытается перебрать его. Следующий код является модифицированной версией. Не удивительно чистый, но я думаю, что это работает более или менее.
источник
Простой способ получить значения p - использовать регрессию statsmodels:
Вы получаете серию p-значений, которыми вы можете манипулировать (например, выбирая порядок, который вы хотите сохранить, оценивая каждое p-значение):
источник
p_value находится среди f статистики. если вы хотите получить значение, просто используйте несколько строк кода:
источник
В ответе @JARH может быть ошибка в случае многовариантной регрессии. (У меня недостаточно репутации, чтобы комментировать.)
В следующей строке:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-1))) for i in ts_b]
,Т-значения следует распределение хи-квадрат степени
len(newX)-1
вместо следующего распределения хи-квадрат степениlen(newX)-len(newX.columns)-1
.Так что это должно быть:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX.columns)-1))) for i in ts_b]
(См. T-значения для регрессии OLS для более подробной информации)
источник
Вы можете использовать scipy для p-значения. Этот код взят из документации scipy.
источник
Для однострочника вы можете использовать функцию pingouin.linear_regression ( отказ от ответственности: я являюсь создателем Pingouin ), которая работает с однофакторной / многовариантной регрессией с использованием массивов NumPy или Pandas DataFrame, например:
Выходные данные представляют собой фрейм данных с бета-коэффициентами, стандартными ошибками, T-значениями, p-значениями и доверительными интервалами для каждого предиктора, а также R ^ 2 и скорректированные R ^ 2 соответствия.
источник