используя ols из statsmodels.formula.api только с постоянным членом? - PullRequest
0 голосов
/ 21 октября 2018

Я хотел бы показать студентам, что происходит, когда в регрессионной модели используется только константа.Я определил одну модель как цену ~ возраст для модели OLS цены подержанных автомобилей как функцию возраста плюс константа.Теперь я хотел бы отбросить переменную возраста и просто иметь постоянную.Как мне это сделать?

Спасибо,

Уолт Пачковски

1 Ответ

0 голосов
/ 21 октября 2018

Формула подгонки в 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>

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