Линейная подгонка данных XY с известной ошибкой на стороне Y с использованием statsmodels WLS - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь адаптировать 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

Сюжет:

Plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...