首页 > 解决方案 > 使用 statsmodels.formula.api 中的 ols 只有一个常数项?

问题描述

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

标签: statsmodelsleast-squares

解决方案


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在公式中排除 with:

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


推荐阅读