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

news2024/12/23 15:41:15

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

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

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

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

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

检测异方差性

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

White 检验;

Breusch-Pagan检验;

Goldfeld-Quandt检验

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

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

 import pandas as pd
 import statsmodels.stats.api as sms
 from statsmodels.formula.api import ols
 
 TEST_NAMES = ['White', 'Breusch-Pagan', 'Goldfeld-Quandt']
 FORMULA = 'value ~ time'
 
 
 class Heteroskedasticity:
 
     @staticmethod
     def 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'] += 1
 
         olsr = 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
 
     @classmethod
     def 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.py
 from src.heteroskedasticity import Heteroskedasticity
 
 series = 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 np
 
 test_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 np
 from pmdarima.datasets import load_airpassengers
 from pmdarima.arima import auto_arima
 from sklearn.model_selection import train_test_split
 
 series = load_airpassengers(True)
 
 # leaving the last 12 points for testing
 train, test = train_test_split(series, test_size=12, shuffle=False)
 # stabilizing the variance in the train
 log_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 forecasts
 log_forecasts = mod.predict(12)
 
 # reverting the forecasts
 forecasts = np.exp(log_forecasts)

总结

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

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

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

作者:Vitor Cerqueira

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zotero快速入门

文章目录一、前言二、下载和安装Zotero三、界面初识和基本操作3.1 创建分类3.2 文献导入3.2.1 自动导入3.2.2 手动导入3.3 内置pdf管理3.4 同步3.5 插件3.5.1 安装方法3.5.2 插件推荐四、与word/wps协同引用文献4.1 使用内置格式4.1.1 添加索引4.1.2 添加书目4.2 自定义格式4.2…

基于AD Event日志监测域内信息探测行为

01、简介当攻击者获得内网某台域内服务器的权限,就会以此为起始攻击点,尽可能地去收集域的信息,以获取域控权限作为内网的终极目标。例如,攻击者会在内网中收集域管理员用户列表和特定敏感用户的信息,通过定位域管理员…

【c++】STL--vector

前言 想必大家已经对string有所了解了,string是专门用于字符串的。今天讲到的vector则是表示可变大小数组的序列容器。就像数组一样,vectoer也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组…

从根本上理解Synchronized的加锁过程

伸手摘星,即使一无所获,亦不致满手污泥。 请关注公众号:星河之码 作为一个Java开发,对于Synchronized这个关键字并不会陌生,无论是并发编程,还是与面试官对线,Synchronized可以说是必不可少。 …

顶刊实证复现:金融投资行为与企业技术创新 -动机分析与经验证据(思路梳理+全数据源+python代码)

标题:金融投资行为与企业技术创新 ——动机分析与经验证据 参考文献 作者:段军山 庄旭东 数据概况 1、数据来源: 第三方数据库 2、样本:2009-2018 中国 A 股市场的上市公司科技数据和财务数据 3、数据处理: (1)由…

Filter和Listener学习笔记

1.什么是Filter 2.定义过滤器 (注意导的Filter的包来源是Javax.servlet) /* 定义一个过滤器的步骤:1. 自定义一个类实现Filter接口2. 把过滤器规则定义在doFilter方法里面3. 使用WebFilter注解配置过滤的路径*///过滤的路径 //WebFilter(&qu…

用拙劣的Python技术画出的圣诞树(勿喷)

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 一、前言 今天晚上,准备睡觉的我看见了CSDN有活动了,我就立马飞奔到电脑前面 这不,CSDN又举办了一场活动,看着令人心动的奖励和丰富的勋章,我的口水都从眼睛里流出来了(夸张),我准备创造一颗圣诞树,但是又想到我…

「设计模式」责任链模式

「设计模式」责任链模式 文章目录「设计模式」责任链模式一、概述二、结构三、案例实现四、优缺点五、应用场景六、模拟过滤器机制七、拓展八、小结一、概述 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予…

高频时序数据的储存与统计方案

文章目录问题背景解决办法第一步,梳理数据和计算要求第二步,确定存储和计算方案第三步,确定技术选型和方案第四步,实施优化方案后记问题背景 发电设备中常常会放置传感器(DCS)来采集数据以监控设备运转的状…

河海大学软件工程学硕考研复试经验贴

一、写在前面 想必看到这篇文章的学弟学妹都已经考完初试了,考得如何每个人心中各有千秋。无论如何,坚持将考研整个过程走下来的你们就已经是最棒的了,现在可以好好休息一下,静待考研成绩的公布了。 我写下这篇文章的目的主要是…

4.3.1、IPv4 地址概述

1、基本介绍 在 TCP/IP 体系中,IP 地址是一个最基本的概念,我们必须把它弄清楚。 IPv4 地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的 32 比特的标识符。 IP 地址由因特网名…

5.8 什么是学习博主?看两个博主案例【玩赚小红书】

先看大家看两个博主案例 ​ 学习博主,就是专门为用户提供学习方法的人。 学习方法在小红书的内容中属于干货价值,也就是用户们需要的东西,能为他们解决问题的内容,所以是比较受欢迎的,换言之,就是笔记数据…

Spark 3.0 - 15.ML PIC 快速迭代聚类理论与实战

目录 一.引言 二.PIC 理论 1.谱聚类 2.快速迭代聚类 三.PIC 实战 1.数据准备 2.构建 PIC 3.预测与展示 四.总结 一.引言 前面介绍了 K-means 聚类与高斯混合聚类,本文介绍另外一种聚类方法 Power Iteration Cluster 快速迭代聚类,简称 PIC。快…

【架构设计】你的类足够“专一”吗

前言 软件设计SOLID原则中有一个最基础的原则就是单一职责原则,我想绝大部分的程序员都知道,而且都理解它的意思,甚至觉得很简单。但是往往“看懂”和“会用”是两回事,而“用好”更是难上加难。好比我们项目,一开始一…

取代OpenFeign:Spring Framework 6全新声明式客户端@HttpExchange

本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;公号后台回复“…

【几种可调动对象,Function和bind;线程的调动方式举例】

1.可调动对象的调动方式 方法 1、函数指针调动 方法2 、类类型的括号的重载 调动可调动对象 #include<iostream> #include<functional> using namespace std; struct Foo {void operator()(int x){cout<<"Foo operator "<<x<<endl;}…

CSS3【定位的基本使用[静态定位\相对定位\绝对定位]、子绝父相、固定定位、元素的层级关系】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、定位1.1定位的基本介绍1.1.1 网页常见布局方式1.1.2 定位的常见应用场景1.2 定位的基本使用1.2.1 定位初体验1.2.2 使用定位的步骤1.2.3 静态定位1.2.4 小结1.2.…

使用 Docker Hub 完美地存储 Helm 图表实战

使用 Docker Hub 完美地存储 Helm 图表实战 Helm 是 Kubernetes 的包管理器。它是一个开源容器编排系统。它通过提供一种简单的方法来定义、安装和升级复杂的 Kubernetes 应用程序&#xff0c;帮助您管理 Kubernetes 应用程序。 使用 Helm&#xff0c;您可以将您的应用程序打包…

git教程

教程目录Git 教程Git 与 SVN 区别Git 与 SVN 区别点&#xff1a;Git 安装配置Linux 平台上安装Debian/UbuntuCentos/RedHatWindows 平台上安装Mac 平台上安装Git 配置用户信息文本编辑器##差异分析工具查看配置信息Git 工作流程Git 工作区、暂存区和版本库基本概念Git 创建仓库…

semargl 软件使用方法简介

文章目录前言一、semargl 软件使用简介1.semargl 软件简介2.准备演示软件操作所需的数据3.使用 semargl 获取频谱关系4.使用 semargl 获取特定频率模式的空间分布5.使用 semargl 获取自旋波的色散关系二、笔记05第三节内容的补充1.优化多进程读取磁化数据文件的代码2.新增获取特…