Формула подгонки в statsmodels использует Patsy , которая пытается имитировать спецификации модели в R-стиле.
Поскольку вы не указали источник данных, я взял набор данных из statsmodels Руководство по OLS , чтобы предоставить работающий пример - может ли богатство объяснить расходы на лотерею:
import statsmodels.api as sm
import statsmodels.formula.api as smf
# load example and trim to a few features
df = sm.datasets.get_rdataset("Guerry", "HistData").data
df = df[['Lottery', 'Literacy', 'Wealth', 'Region']].dropna()
# fit with y=mx + c
model1 = smf.ols(formula='Lottery ~ Wealth', data=df).fit()
print(model1.summary())
# fit with y=c (only an intercept)
model2 = smf.ols(formula='Lottery ~ 1', data=df).fit()
print(model2.summary())
По вашему вопросу, модель, имеющая только перехват, является не чем иным, как средним значением, но, вероятно, вы заинтересованы в методах сравнения различных моделей, поэтому давайте сделаем быстрое сравнение, чтобы увидеть, дает ли более простая модель лучшее соответствие -одним из вариантов является f-тест:
f_val, p_val, _ = model1.compare_f_test(model2)
print(f_val, p_val, p_val<0.01)
Значение p ниже уровня значимости 1%, поэтому мы интерпретируем, что более сложная модель в этом случае «более правильная».
Для полноты, чтобы указать модель без пересечения (полезно, например, если мы уже центрировали данные), мы можем исключить с помощью -1
в формуле:
# y = mx
model3 = smf.ols(formula='Lottery ~ Wealth -1', data=df).fit()
print(model3.summary())
f_val, p_val, _ = model1.compare_f_test(model3)
print(f_val, p_val, p_val<0.01)
Опять же, p_val ниже 1%уровень значимости, включая пересечение и наклон, улучшает подгонку модели.(Здесь нет мульти-тестовой коррекции, но значения p составляют << 1%) </p>