Я пытаюсь повторить функциональность функции наименьших квадратов (WLS) Statsmodels с помощью функции обычных наименьших квадратов (OLS) компании Numpy (т.е. Numpy относится к OLS как к «наименьшему»квадраты ").
Другими словами, я хочу вычислить WLS в Numpy.Я использовал этот пост Stackoverflow в качестве ссылки, но возникают совершенно разные значения R² при переходе от Statsmodel к Numpy.
Возьмем следующий пример кода, который повторяет это:
import numpy as np
import statsmodels.formula.api as smf
import pandas as pd
# Test Data
patsy_equation = "y ~ C(x) - 1" # Use minus one to get ride of hidden intercept of "+ 1"
weight = np.array([0.37, 0.37, 0.53, 0.754])
y = np.array([0.23, 0.55, 0.66, 0.88])
x = np.array([3, 3, 3, 3])
d = {"x": x.tolist(), "y": y.tolist()}
data_df = pd.DataFrame(data=d)
# Weighted Least Squares from Statsmodel API
statsmodel_model = smf.wls(formula=patsy_equation, weights=weight, data=data_df)
statsmodel_r2 = statsmodel_model.fit().rsquared
# Weighted Least Squares from Numpy API
Aw = x.reshape((-1, 1)) * np.sqrt(weight[:, np.newaxis]) # Multiply two column vectors
Bw = y * np.sqrt(weight)
numpy_model, numpy_resid = np.linalg.lstsq(Aw, Bw, rcond=None)[:2]
numpy_r2 = 1 - numpy_resid / (Bw.size * Bw.var())
print("Statsmodels R²: " + str(statsmodel_r2))
print("Numpy R²: " + str(numpy_r2[0]))
После запуска такого кода я получаю следующие результаты:
Statsmodels R²: 2.220446049250313e-16
Numpy R²: 0.475486515775414
Очевидно, что здесь что-то не так!Кто-нибудь может указать на мои недостатки здесь?Я скучаю по пониманию формул?