时间序列中非恒定方差的检测和处理,如果一个时间序列的方差随时间变化,那么它是异方差的。否则数据集是同方差的。异方差性影响时间序列建模。因此,检测和处理这种情况非常重要。让我们从一个视觉示例开始。下面的图1显示了航空公司乘客的时间序列。可以看出,整个序列的变化是不同的。该系列的后半部分方差较高。这也是一个比之前数据更大的数据横向跨度。方差的变化会对预测产生很大影响。它会影响模型的拟合度,从而影响预测性能。但仅凭人眼看到方差是不现实的,那么如何更系统地检测和处理异方差问题呢?要检测异方差性,您可以使用统计检验来检查时间序列是否为异方差性序列。这些包括以下内容。白色测试;Breusch-Pagan测试;Goldfeld-Quandt检验这些检验的主要输入是回归模型的残差(如普通最小二乘法)。零假设是残差以相等的方差分布。如果p值小于显着性水平,则假设被拒绝。这说明时间序列是异方差的,检验的显着性水平通常设置为0.05。Python库statsmodels实现了上述三个测试。下面的代码片段将它们封装在一个类中:importpandasaspdimportstatsmodels.stats.apiassmsfromstatsmodels.formula.apiimportolsTEST_NAMES=['White','Breusch-Pagan','Goldfeld-Quandt']FORMULA='value~time'classHeteroskedasticity:@staticmethoddefhet_tests(series:pd.Series,test:str)->float:"""异方差性测试:paramseries:单变量时间序列作为pd.Series:paramtest:表示测试的字符串。'white'、'goldfeldquandt'或'breuschpagan'之一:返回:p值作为浮点数。如果p值很高,我们接受零假设,即数据是同方差的“”“在TEST_NAMES中断言测试,“未知测试”系列=series.reset_index(drop=True).reset_index()series.columns=['time','value']series['time']+=1olsr=ols(公式,系列)。适合()如果测试=='白色':_,p_value,_,_=sms.het_white(olsr.resid,olsr.model.exog)eliftest=='Goldfeld-Quandt':_,p_value,_=sms.het_goldfeldquandt(olsr.resid,olsr.model.exog,alternative='two-sided')else:_,p_value,_,_=sms.het_breuschpagan(olsr.resid,olsr.model.exog)返回p_value@classmethoddefrun_all_tests(cls,series:pd.Series):test_results={k:cls.het_tests(series,k)forkinTEST_NAMES}returntest_results异方差类包含两个函数:het_tests函数应用特定测试(White、Breusch-Pagan或Goldfeld-Quandt),run_all_tests函数应用所有三个测试一次。一个测试。这些函数的输出是相应检验的p值。下面介绍如何将此代码应用于图1中的时间序列。frompmdarima.datasetsimportload_airpassengers#https://github.com/vcerqueira/blog/blob/main/src/heteroskedasticity.pyfromsrc.heteroskedasticityimportHeteroskedasticityseries=load_airpassengers(True)test_results=Heteroskedasticity.run_all_tests(series)#{{'Breusch-Pagan':4.55e-07,#'Goldfeld-Quandt':8.81e-13,#'White':4.34e-07}所有测试的p值都接近于零。所以我们可以拒绝原假设。这些实验为异方差的存在提供了令人信服的证据。为了再次证明我们的观点,我们可以可视化时间序列前半部分和后半部分的方差分布:这两个部分的方差分布是不同的。Goldfeld-Quandt检验使用这种类型的数据划分来检验异方差性。它检查两个数据子样本的残差方差是否不同。数据转换解决时间序列异方差性问题的常用方法是转换数据。对时间序列取对数有助于稳定其可变性。下面是与之前相同的时间序列,但采用对数缩放:该序列似乎是稳定的。我们重新测试新系列importnumpyasnptest_results=Heteroskedasticity.run_all_tests(np.log(series))#{'Breusch-Pagan':0.033,#'Goldfeld-Quandt':0.18,#'White':0.10}你可以看到这次p值更大。只有一项检验(Breusch-Pagan)拒绝了原假设(此处假设显着性水平为0.05)。恢复对数尺度变换我们使用对数变换后的数据进行预测,预测结果仍然需要恢复到原来的尺度。这是通过逆变换完成的,在对数情况下,您应该使用指数变换。所以我们完整的预测过程是这样的:变换数据,稳定方差;拟合预测模型;获得预测并将其恢复到原始比例。代码如下:importnumpyasnpfrompmdarima.datasetsimportload_airpassengersfrompmdarima.arimaimportauto_arimafromsklearn.model_selectionimporttrain_test_splitseries=load_airpassengers(True)#留下最后12个点用于测试train,test=train_test_split=2,shuffle=False)#稳定训练中的方差log_train=np.log(train)#建立一个arima模型,m是季节周期(每月)mod=auto_arima(log_train,seasonal=True,m=12)#得到logforecastslog_forecasts=mod.predict(12)#revertingtheforecastsforecasts=np.exp(log_forecasts)将本文的要点总结如下:如果方差不是常量,则时间序列是异方差的;可以使用统计检验来检验一个时间序列是否是异方差的。这些测试包括White、Breusch-Pagan、Goldfeld-Quandt测试;对数变换用于稳定方差;预测值需要恢复到原始值。https://avoid.overfit.cn/post/0be132e2b6b04a12b6c22f90853ea7be作者:VitorCerqueira
