【问题标题】:SARIMAX residualsSARIMAX 残差
【发布时间】:2020-03-25 01:44:28
【问题描述】:

所以我想问一下是否有人在python 中使用过sarimax 函数

当使用具有差异或季节性差异的模型时,残差似乎有点奇怪。

model2 = SARIMAX(np.log(train["S4236SM144NCEN"]), order=(4, 0, 0), seasonal_order=(1, 1, 0, 12) );
model_results2 = model2.fit(maxiter = 500);
print(model_results2.summary());

然后绘制标准化残差:

model_results2.plot_diagnostics(figsize = (12, 7), lags=20);

这些残差(上面的代码)是我想应该的,但是在做的时候

model_results2.resid.plot()

而这些仅使用函数.resid.plot() 的残差具有非常奇怪的轨迹。

所以我所做的是在进行季节性差异时从第 13 次观察中获取残差,使用代码:

resid2 = pd.DataFrame(model_results2.resid.iloc[12:])
resid2.plot()

从这段代码中绘制残差时,它们看起来与使用 .plot_diagnostic() 时完全相同 - 所以我想这是正确的。

我的问题是我应该使用什么残差对象来测试自相关、拱效应、正态性...,因为使用来自同一模型的 2 个不同残差对象将导致完全不同的残差。诊断。

name = ['Statistic', 'p-value']
lzip(name, acorr_ljungbox(model_results2.resid, lags = 12))

name = ['Lagrange multiplier statistic', 'p-value',
       'F-TEST', 'F-p-value']
diag = het_arch(model_results2.resid, maxlag=12)
lzip(name, diag)

与从第 13 次观察得到的结果完全不同:

name = ['Statistic', 'p-value']
lzip(name, acorr_ljungbox(model_results2.resid.iloc[13:], lags = 12))

name = ['Lagrange multiplier statistic', 'p-value',
       'F-TEST', 'F-p-value']
diag = het_arch(model_results2.resid.iloc[13:], maxlag=12)
lzip(name, diag)

数据下载代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='ticks', context='poster')
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
import seaborn as sns
#plt.style.use("ggplot")
import pandas_datareader.data as web
import pandas as pd
import statsmodels.api as sm
import scipy
import statsmodels.stats.api as sms
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import datetime

start = datetime.datetime(1992, 1, 1)
end = datetime.datetime(2019, 10, 1)
df = web.DataReader(["TOTALSA", "S4236SM144NCEN"], "fred", start, end)
df.columns = ['TOTALSA', "S4236SM144NCEN"]
df.head()

train = df3.iloc[:len(df) - 12*2]
test = df3.iloc[len(df) - 12*2:]
df_train_test = pd.concat([test["S4236SM144NCEN"], train["S4236SM144NCEN"]], axis = 1)
df_train_test.columns = ["TEST", "TRAIN"]

有人遇到过这个问题吗?

【问题讨论】:

    标签: python time-series statsmodels arima


    【解决方案1】:

    您必须使用学生化残差。 model_results2.resid 未学生化。 看看这个例子:https://stackoverflow.com/a/63938424/14294235

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2021-07-26
      • 2018-06-04
      • 2020-01-23
      • 2018-08-17
      • 1970-01-01
      相关资源
      最近更新 更多