Я пытаюсь воспроизвести функциональность Statsmodels функция взвешивания наименьших квадратов (WLS) с обычный метод наименьших квадратов (OLS) (т. е. 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
Здесь явно что-то не так! Кто-нибудь может указать здесь на мои недостатки? Я скучаю по формуле патси?
x
одинаковы! Как вы ожидаете подогнать линию к этим данным? - person Warren Weckesser   schedule 25.05.2018np.average(y, weights=weight)/3
дает0.21441370223978917
, что согласуется сnumpy_model
. - person Warren Weckesser   schedule 25.05.2018numpy_R²
? Кроме того, вы сказали, что делите наx
, однако вы только что разделили на моду вектора x (т.е. мода = наиболее повторяющееся число). Не могли бы вы немного пояснить свои расчеты? - person Code Doggo   schedule 25.05.20180.643241...
, тогда как при использовании Numpy я получаю0.2144137...
. Модели не согласуются, поэтому я предполагаю, что неправильно вычисляюnumpy_model
? - person Code Doggo   schedule 25.05.2018patsy_equation
у меня естьC(x)
. Я рассматриваю свои значенияx
как категориальные, а не как числовые переменные. Если я просто поставлюx
вместоC(x)
, то получу ту же модель. Вы хоть представляете, что происходит с переходом от числового к категориальному? Что еще более важно, как меняется математика? - person Code Doggo   schedule 25.05.2018Aw
- это просто вектор, 4 x 1 ?? Также веса иногда ~ сигма, иногда ~ 1/сигма; попробовать веса все 1. - person denis   schedule 30.03.20201/weight
, чтобы это начало работать. Кроме того, как указано в моем предыдущем комментарии, я использовал неправильный patsy_equation. Я рассматривал значения как категориальные, тогда как должен был рассматривать их как непрерывные числовые значения. - person Code Doggo   schedule 30.03.2020