python - StatsModels 公式多项式回归与 numpy polyfit 系数不匹配
问题描述
我使用 statsmodels 公式的多项式回归与 nupy polyfit 系数不匹配。
链接到数据https://drive.google.com/file/d/1fQuCoCF_TeXzZuUFyKaHCbD1zle2f1MF/view?usp=sharing
下面是我的代码
import numpy as np
import pandas as pd
import scipy
import statsmodels.formula.api as smf
data = pd.read_csv('sp500.csv')
data['Date_Ordinal'] = pd.to_datetime(data['Date']).apply(lambda date: date.toordinal())
x = data['Date_Ordinal']
y = data['Value']
np.polyfit(x,y,2)
model = smf.ols(formula='y ~ x + I(x**2)', data = data).fit()
model.summary()
Numpy polyfit 系数结果:
数组([4.17939013e-05,-6.09338454e+01,2.22098809e+07])
Statsmodels 系数结果:
x**2: 7.468e-07
x:-0.5466
拦截:-1.486e-06
当我向 Excel 中的数据添加二次趋势线时,Excel 结果与 numpy 系数一致。但是,如果我将截距 1 添加到 Excel 趋势线,x**2 和 x 的系数等于 statsmodels 系数,但 excel 截距变为 1,而 statsmodels 截距为 -1.486e-06。
如果通过减去 1 从 statsmodels 公式中删除截距,它所做的只是从 statsmodels 结果中完全删除截距,但系数保持不变。
如何让 statsmodels 显示与 numpy polyfit 和 Excel 相同的系数结果?
解决方案
如果基础数据不在零附近的小范围内,多项式可能会变得非常糟糕。结果,计算在数值上变得不稳定,并且结果可能受数值噪声支配。
http://jpktd.blogspot.com/2012/03/numerical-accuracy-in-linear-least.html 着眼于 NIST 测试用例,其中多项式的缩放比例非常差,许多统计数据包无法产生数值稳定的解决方案。
Numpy 的多项式拟合可以在创建多项式基函数之前在内部重新缩放变量。
像 statsmodels 中的 OLS 等通用回归模型没有必要的信息来重新调整基础变量以提高数值稳定性。此外,缩放和处理多重共线性由用户决定。在这种情况下,OLS 摘要应该打印一个警告。
推荐阅读
- php - 如何解决在 PHP 网页中打印为“�”的撇号/引号?
- amazon-web-services - 基于搜索表达式创建 CloudWatch 警报
- excel - Excel 2003:平均每 N 行
- racket - Racket 的子进程找不到文件
- python - 在 .csv 文件中复制数据以更改其格式
- sql-server - 为什么每次通话时 SYSDATETIME() 都没有改变?
- perl - 在 Perl 上使用 GMP 计算 pi 时出现分段错误
- node.js - Doc.data() 不返回所需的文档,尽管 doc.id 将 id 返回到该文档
- database - 为什么 psql 返回只有 3 位小数的 float4 数字
- django - 如何在 Django 模板中输出乘法表达式?