我使用statsmodels公式的多项式回归与nupy多项式系数不匹配。
链接到数据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系数结果:
array([4.17939013e-05,-6.09338454e + 01,2.22098809e + 07])
Statsmodels系数结果:
x ** 2:7.468e-07
x:-0.5466
拦截:-1.486e-06
当我向Excel中的数据添加二次趋势线时,Excel结果与numpy系数一致。但是,如果我向Excel趋势线添加1的截距,则x ** 2和x的系数等于statsmodels系数,但是excel截距变为1,其中statsmodels截距为-1.486e-06。
如果通过减去1从statsmodels公式中删除截距,它所做的就是从statsmodels结果中完全删除截距,但系数保持不变。
如何获取统计模型以显示与numpy polyfit和Excel相同的系数结果?
如果基础数据不在零附近的小范围内,多项式的缩放比例将变得非常差。结果,计算在数值上变得不稳定,结果可能受到数值噪声的支配。
http://jpktd.blogspot.com/2012/03/numerical-accuracy-in-linear-least.html着眼于NIST测试用例,其多项式的缩放比例非常差,许多统计数据包无法产生数值稳定的解决方案。
Numpy的多项式拟合可以在创建多项式基函数之前在内部重新缩放变量。
诸如statsmodels中的OLS之类的通用回归模型没有必要的信息来重新缩放基础变量以提高数值稳定性。此外,缩放和处理多重共线性度由用户决定。在这种情况下,OLS摘要应该已打印警告。