пакет statsmodels
может быть проще в использовании, чем относительно низкоуровневая функция lstsq
, которая есть в Numpy.Ваш вопрос просто оценивается:
y_i = x_i*a + sigma_i
, поэтому x=0
всегда будет на y=0
.возможно, вы ожидаете, что ваш код оценивает:
y_i = a_0 + x_i*a_1 + sigma_i
т.е. a_0
- это перехват, а a_1
- это коэффициент x
.
, для использования которого statsmodels
потребуетсявытащить больше пакетов, но имеет гораздо более простой интерфейс :
import statsmodels.formula.api as smf
import pandas as pd
df = pd.DataFrame(dict(x=x, y=y))
fit = smf.ols('y ~ x', df).fit()
fit.summary()
выведет:
coef std err t P>|t| [0.025 0.975]
Intercept 2.4528 1.960 1.251 0.251 -2.183 7.088
x 0.0303 0.065 0.468 0.654 -0.123 0.183
, и вы можете получитьx
, где y=0
через:
-fit.params[0] / fit.params[1]
, давая приблизительно -81
.если вы действительно хотите исправить перехват как ноль, вы бы добавили + 0
к формуле:
fit = smf.ols('y ~ x + 0', df).fit()
этот интерфейс противоречит правилу Python "явный лучше, чем неявный", но копирует "R""языковой стиль формула с и (по моему опыту) большинство регрессий все равно хотят оценить перехват.