时间序列中非恒定方差的检测与处理,如果一个时间序列的方差随时间变化,那么它就是异方差的。否则数据集是同方差的。

异方差性影响时间序列建模。因此检测和处理这种情况非常重要。

让我们从一个可视化的例子开始。

下面的图1显示了航空公司乘客的时间序列。可以看到在整个序列中变化是不同的。在该系列的后一部分方差更高。这也是数据水平跨度比前面的数据大。

方差的变化对预测会产生很大的影响。它会影响模型的拟合从而影响预测性能。但是只靠人眼查看方差是不现实的,所以如何更系统地检测和处理异方差问题呢?

检测异方差性

你可以使用统计检验来检查时间序列是否为异方差序列。其中包括以下内容。

White 检验;

Breusch-Pagan检验;

Goldfeld-Quandt检验

这些检验的主要输入是回归模型的残差(如普通最小二乘法)。零假设是残差的分布方差相等。如果p值小于显著性水平,则拒绝该假设。这就说明时间序列是异方差的,检验显著性水平通常设置为0.05。

Python库statsmodels实现了上述三个测试。下面的代码片段将它们封装在一个类中:

 import pandas as pdimport statsmodels.stats.api as smsfrom statsmodels.formula.api import olsTEST_NAMES = ['White', 'Breusch-Pagan', 'Goldfeld-Quandt']FORMULA = 'value ~ time'class Heteroskedasticity:@staticmethoddef het_tests(series: pd.Series, test: str) -> float:"""Testing for heteroskedasticity:param series: Univariate time series as pd.Series:param test: String denoting the test. One of 'white','goldfeldquandt', or 'breuschpagan':return: p-value as a float.If the p-value is high, we accept the null hypothesis that the data is homoskedastic"""assert test in TEST_NAMES, 'Unknown test'series = series.reset_index(drop=True).reset_index()series.columns = ['time', 'value']series['time'] += 1olsr = ols(FORMULA, series).fit()if test == 'White':_, p_value, _, _ = sms.het_white(olsr.resid, olsr.model.exog)elif test == '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)return p_value@classmethoddef run_all_tests(cls, series: pd.Series):test_results = {k: cls.het_tests(series, k) for k in TEST_NAMES}return test_results

异方差类包含两个函数:het_tests函数应用特定的检验(White、Breusch-Pagan或Goldfeld-Quandt)。run_all_tests函数一次性应用所有三个检验。这些函数的输出是相应测试的p值。

下面介绍如何将此代码应用于图1中的时间序列。

 from pmdarima.datasets import load_airpassengers# https://github.com/vcerqueira/blog/blob/main/src/heteroskedasticity.pyfrom src.heteroskedasticity import Heteroskedasticityseries = 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检验就是使用这种类型的数据分折来检验异方差性。它检查两个数据子样本的残差方差是否不同。

数据转换

解决时间序列异方差问题的一个常用方法是对数据进行变换。对时间序列取对数有助于稳定其可变性。

下面是与之前相同的时间序列,但对其进行了对数缩放:

序列看起来很稳定。我们对新的序列重新进行检验

 import numpy as nptest_results = Heteroskedasticity.run_all_tests(np.log(series))# {'Breusch-Pagan': 0.033,# 'Goldfeld-Quandt': 0.18,# 'White': 0.10}

可以看到这次的p值更大。只有一个检验(Breusch-Pagan)拒绝了零假设(这里假设显著性水平为0.05)。

恢复对数缩放转换

我们使用对数变换后的数据进行预测,预测结果还是需要还原到原始尺度的。这是通过逆变换来完成的,在对数的情况下,你应该使用指数变换。

所以我们的完整预测过程的如下:

对数据进行变换,使方差稳定;

拟合预测模型;

获得预测结果,并将其恢复到原始尺度。

代码如下:

 import numpy as npfrom pmdarima.datasets import load_airpassengersfrom pmdarima.arima import auto_arimafrom sklearn.model_selection import train_test_splitseries = load_airpassengers(True)# leaving the last 12 points for testingtrain, test = train_test_split(series, test_size=12, shuffle=False)# stabilizing the variance in the trainlog_train = np.log(train)# building an arima model, m is the seasonal period (monthly)mod = auto_arima(log_train, seasonal=True, m=12)# getting the log forecastslog_forecasts = mod.predict(12)# reverting the forecastsforecasts = np.exp(log_forecasts)

总结

本文的重点内容总结如下:

  • 如果方差不是恒定的则时间序列是异方差的;
  • 可以使用统计检验来检验一个时间序列是否为异方差序列。这些测试包括White,Breusch-Pagan,Goldfeld-Quandt检验;
  • 使用对数变换来稳定方差;
  • 预测值需要还原到原始值。

https://avoid.overfit.cn/post/0be132e2b6b04a12b6c22f90853ea7be

作者:Vitor Cerqueira

如何检测时间序列中的异方差(Heteroskedasticity)相关推荐

  1. r语言找不到cochrane函数_R语言——伍德里奇计量经济导论案例实践 第十二章 时间序列的序列相关和异方差问题...

    在上一章节的复习笔记中,我们介绍了时间序列比较常见的AR模型和随机游走序列.在对时间序列进行回归时,我们和横截面数据一样做了很多假设,但是上一章内容没有回答如何解决误差项之间的序列相关性 (seria ...

  2. matlab怀特检验,(求助)Eviews中的怀特检验,怎样确定存在异方差?

    请问各位路过的朋友,Eviews中做完回归后,用怀特检验进行异方差检验,怎样确定存在异方差?下面是截图,麻烦帮忙看下有没有异方差的存在.谢~~谢谢!! Heteroskedasticity Test: ...

  3. r语言boxcox异方差_如何检测异方差并纠正它?

    线性回归一个重要的假设就是残差没有异方差性.简单来说就是残差的方差不会随着响应变量的拟合值而增加.在本篇文章,我会解释为什么检测异方差性是重要的?如何检测模型的异方差性?如果存在,如何通过R代码来纠正 ...

  4. 命令不识别_互助问答138期:GMM命令代码中如何识别年份国家及异方差检验问题...

    老师您好,有两个关于系统GMM的问题想请教一下:(1)在所学的教程里,系统GMM没有引入时间,我目前是分行业分国家的时间为T年的面板数据,请问时间应该放入xtdpdsys的命令中的哪个位置?代码是写作 ...

  5. matlab条件异方差模型,求ARFIMA模型中参数d估计的MATLAB程序

    最新课程-Stata 2015暑期研讨班: Stata暑期研讨初级班[2015年7月3日-6日,四天,北京] 课程详情:http://www.peixun.net/view/307_detail.ht ...

  6. 广义最小二乘法的基本思想是什么_解决异方差问题的方法可行广义最小二乘法fgls法.ppt...

    解决异方差问题的方法可行广义最小二乘法fgls法 第五章 模型的建立与估计中的问题及对策;本章内容第一节 误设定第二节 多重共线性第三节 异方差性第四节 自相关; OLS估计量令人满意的性质,是根据一 ...

  7. 大神们都是如何在时间序列中进行特征提取的?看完就懂了!

    作者 |Sharmistha Chatterjee 翻译 | 火火酱~,责编 | 晋兆雨 出品 | CSDN云计算 头图 | 付费下载于视觉中国 介绍 现在,对于各类机构而言,需要收集的数据越来越多, ...

  8. 异常检测时间序列_时间序列的无监督异常检测

    异常检测时间序列 To understand the normal behaviour of any flow on time axis and detect anomaly situations i ...

  9. 检验多重共线性matlab_异方差太难?检验通不过?横截面分析难题的十大暴击!...

    转载:计量与统计 横截面数据是在同一时间,不同统计单位相同统计指标组成的数据列.横截面数据不要求统计对象及其范围相同,但要求统计的时间相同.也就是说必须是同一时间截面上的数据. 在分析横截面数据时,应 ...

最新文章

  1. https 请求白屏_记一次HTTPS性能优化
  2. OpenGL函数库详解
  3. Swift Web 开发之 Vapor - 路由(二)
  4. 人类又双叒叕输了,就没人能管管这条“狗”吗?
  5. 服务器读取excel文件,作为服务器进程读取Excel文件
  6. Abbirb120型工业机器人_ABB IRB 120工业机器人.pdf
  7. 解决Maven的jar包冲突问题
  8. 西部数据中断与华为合作;苹果首次参加天猫 618;罗永浩第三次出质锤子股权 | 极客头条...
  9. PYTHON笔记 面向对象程序设计
  10. Ubuntu下EEUPDATE工具的使用方法
  11. 十代主板改win7_微星Z490装win7 Bios设置|微星Z490主板10代CPU装win7
  12. 金蝶凭证序时簿在哪_如何打开会计分录序时簿
  13. Docker API的
  14. 计算机开机慢怎么办,笔记本电脑开机很慢怎么办?五个小妙招来帮忙!
  15. KEPWAREOPC与西门子PLC以太网通讯
  16. 科技交流英语(2022秋)
  17. 马踏棋盘 (30 分)
  18. Shell学习总结-流编辑器sed
  19. stm32f103从安装MDK5到烧录第一个亮灯程序
  20. 使用OpenCV/Python进行双目测距

热门文章

  1. Java:String转char数组
  2. NXP JN5169 使用看门狗定时器
  3. HTML5 新增的结构元素——能用不代表用对了
  4. CDH6.3.1安装
  5. JAVA数据加密压缩传输给服务端(Gzip加AES)
  6. 关于Coursera
  7. coursera python_如何最高效且自由地收看Coursera
  8. Android在线工具
  9. int64_t 在 32 位环境下其实是 long long
  10. pyltp包下载及使用