使用statsmodels.formula.api中的ols仅带有一个常数项?

时间:2018-10-21 03:14:49

标签: statsmodels least-squares

我想向学生展示在回归模型中仅使用常数时会发生什么。对于使用年龄乘以常数的函数的二手车价格的OLS模型,我为价格〜年龄指定了一个模型。现在,我想删除年龄变量,只保留常量。我该怎么做?

谢谢

沃尔特·帕茨科夫斯基

1 个答案:

答案 0 :(得分:2)

适合statsmodels的公式使用Patsy,它试图模仿R样式的模型规范。

由于您未指定数据源,因此我从 statsmodels OLS guide提供了一个可行的示例-财富可以解释彩票支出吗?

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%)