Взвешенные наименьшие квадраты в Statsmodels vs. Numpy? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь повторить функциональность функции наименьших квадратов (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

Очевидно, что здесь что-то не так!Кто-нибудь может указать на мои недостатки здесь?Я скучаю по пониманию формул?

...