Как экстраполировать простую линейную регрессию и получать ошибки для коэффициентов в Python? - PullRequest
0 голосов
/ 23 сентября 2019

Вот мои примеры данных:

x = np.array([19.0, 47.0, 34.6, 23.2, 33.5, 28.2,34.8, 15.8, 23.8])
y = np.array([6.12,3.55, 2.67, 2.81, 5.34, 3.75,3.43, 1.44, 0.84])
pl.scatter(x,y, facecolors='b', edgecolors='b', s=24)
x = x[:,np.newaxis]
a, _, _, _ = np.linalg.lstsq(x, y)
pl.plot(x, a*x, 'r-')
pl.xlim(0,50)
pl.ylim(0,7)

Resulting plot with linear fit

На графике видно, что линейное приближение не достигает y = 0.Как я могу найти значение x (т.е. экстраполировать данные), при котором y = 0?И есть ли способ заставить распространять ошибки, чтобы получить ошибки для коэффициента?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

пакет 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""языковой стиль формула с и (по моему опыту) большинство регрессий все равно хотят оценить перехват.

0 голосов
/ 23 сентября 2019

Чтобы экстраполировать, вам просто нужно пройти, чтобы построить более длинный массив y.

Просто вставьте 0 в массив после подгонки строки.

y = np.insert(y, 0, 0)

И затем перейдите к графику:

pl.plot(y/a, y, 'r-')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...