我在使用Statmodel的SARIMAX函数对我拥有的数据系列进行季节性调整时遇到了一些麻烦。代码在下面,但是通常我的过程是在数据上测试各种SARIMA参数,选择具有最低AIC的参数,运行模型,然后获取拟合值。问题在于,对于某些数据集,拟合值(经过季节性调整)基本上就像我的原始数据从一个周期向后移动。我在这里有什么明显的错误吗?
def seasonal_fit(data_to_fit, column_name):
# finding sarima parameters
p = d = q = range(0, 2)
pdq = list(itertools.product(p, d, q))
seasonal_pdq = [(x[0], x[1], x[2], 12)
for x in list(itertools.product(p, d, q))]
param_dict = []
keys = ['Parameters', 'Seasonal Parameters', 'AIC']
for param in pdq:
for param_seasonal in seasonal_pdq:
try:
mod = sm.tsa.statespace.SARIMAX(data_to_fit, order=param,
seasonal_order=param_seasonal, enforce_stationarity=False, enforce_invertibility=False)
# , enforce_stationarity=False, enforce_invertibility=False)
results = mod.fit()
insert = [param, param_seasonal, results.aic]
param_dict.append(dict(zip(keys, insert)))
except:
continue
param_dict = pd.DataFrame(param_dict)
best_fit = param_dict.loc[param_dict['AIC'].idxmin()]
mod = sm.tsa.statespace.SARIMAX(data_to_fit,
order=(
best_fit['Parameters'][0], best_fit['Parameters'][1], best_fit['Parameters'][2]),
seasonal_order=(best_fit['Seasonal Parameters'][0], best_fit['Seasonal Parameters']
[1], best_fit['Seasonal Parameters'][2], best_fit['Seasonal Parameters'][3]), enforce_stationarity=False, enforce_invertibility=False)
results = mod.fit()
pdb.set_trace()
fitted_values = pd.DataFrame(results.fittedvalues)
[如果有人偶然发现了这个问题,我经过一番搜索后找到了答案。这是来源之一(https://stats.stackexchange.com/questions/330928/time-series-prediction-shifted)。基本上-ARIMA本质上是滞后的,并使用先验来预测。您肯定会看到曲线向右移动了x个周期,其中x是发生的差异数。当您尝试实现一些您不完全理解的事情时,如果发生一些奇怪的事情,所学到的教训就不会感到惊讶...