statsmodels - 使用 statsmodels.formula.api 中的 ols 只有一个常数项?
问题描述
我想向学生展示在回归模型中仅使用常数时会发生什么。我将一个模型指定为价格~年龄,用于 OLS 模型的二手车价格作为年龄函数加上一个常数。现在我想删除年龄变量,只保留常数。我该怎么做呢?
解决方案
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%)
推荐阅读
- jersey - 将大型 HSSFWorkbook 写入 ServletOutputStream
- r - 将 R 中的表与 R 中的 2 个公共列合并
- javascript - Angular 属性数据返回为空
- javascript - 将网络摄像头设备连接到 PC
- flutter - Flutter:“GameNameEnum”类型的值不能分配给“GameNameEnum”类型的变量
- node.js - 获取匹配文档的总数并在满足特定条件的子集中进行计数
- text-classification - 如何在 BertForSequenceClassification 之上添加额外的密集层?
- google-sheets - 使用带有符号 ' 的单词查询和导入范围(例如 = James 'Lee)
- docker - 为什么气流尝试在 ubuntu 服务器上使用 sudo 运行任务然后失败?
- python - python中的命令行参数运行两个脚本之一