Я пытаюсь адаптировать statsmodels для линейного подбора данных с известной ошибкой. Пример данных приведен ниже - в основном это три списка: независимая переменная X
, зависимая переменная Y
и ошибка для каждого измерения зависимой переменной err
. Кроме того, в этом случае я знаю, что мои данные проходят через 0.
X = [-1000, -800, -600, -500, -300, -200, -100, 0, 100, 200, 300, 500, 600, 800, 1000]
Y = [24.8, 20., 14.2, 11.2, 7.6, 4.6, 2., 0., -1.8, -5.4, -7.6, -11.2, -15., -19.4, -24.4]
err = [2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]
Подбор базовых наименьших квадратов c может быть достигнут с помощью класса OLS statsmodels. Это, однако, в моем понимании предполагает, что мои Y
значения являются точными. На самом деле я знаю, что они измеряются с ошибкой + -2. Итак, я использовал эту ошибку, чтобы построить список с весами, подходящими для класса WLS. Результат, однако, был одинаковым для обоих методов, как для установленных значений наклона, так и для ошибки наклона. Что я делаю неправильно? Я чувствую, что здесь делаю какую-то концептуальную ошибку, но не могу понять, какую именно.
Я предоставляю код, который использовал ниже:
import statsmodels.api as sm
import numpy as np
import matplotlib.pyplot as plt
X = [-1000, -800, -600, -500, -300, -200, -100, 0, 100, 200, 300, 500, 600, 800, 1000]
Y = [24.8, 20., 14.2, 11.2, 7.6, 4.6, 2., 0., -1.8, -5.4, -7.6, -11.2, -15., -19.4, -24.4]
err = [2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]
X, Y, err = np.array(X), np.array(Y), np.array(err)
fit_OLS = sm.OLS(Y, X).fit()
print('OLS: fitted slope is %f, standard error is %f' % (fit_OLS.params[0], fit_OLS.bse[0]))
fit_WLS = sm.WLS(Y, X, weights=1. / (err ** 2)).fit()
print('WLS: fitted slope is %f, standard error is %f' % (fit_WLS.params[0], fit_WLS.bse[0]))
plt.plot(X, Y, 'ok', label='Data')
plt.plot(X, fit_OLS.fittedvalues, 'r-', label='OLS')
plt.plot(X, fit_WLS.fittedvalues, 'b--', label='WLS')
plt.legend()
plt.grid()
plt.show()
И вывод. Консоль:
OLS: fitted slope is -0.024347, standard error is 0.000239
WLS: fitted slope is -0.024347, standard error is 0.000239
Сюжет: