时间序列分析中的自相关

什么是自相关以及为什么它在时间序列分析中是有用的。

在时间序列分析中,我们经常通过对过去的理解来预测未来。为了使这个过程成功,我们必须彻底了解我们的时间序列,找到这个时间序列中包含的信息。

自相关就是其中一种分析的方法,他可以检测时间系列中的某些特征,为我们的数据选择最优的预测模型。

在这篇简短的文章中,我想回顾一下:什么是自相关,为什么它是有用的,并介绍如何将它应用到Python中的一个简单数据集。

什么是自相关?

自相关就是数据与自身的相关性。我们不是测量两个随机变量之间的相关性,而是测量一个随机变量与自身变量之间的相关性。因此它被称为自相关。

相关性是指两个变量之间的相关性有多强。如果值为1,则变量完全正相关,-1则完全负相关,0则不相关。

对于时间序列,自相关是该时间序列在两个不同时间点上的相关性(也称为滞后)。也就是说我们是在用时间序列自身的某个滞后版本来预测它。

数学上讲自相关的计算方法为:

其中N是时间序列y的长度,k是时间序列的特定的滞后。当计算r_1时,我们计算y_t和y_{t-1}之间的相关性。

y_t和y_t之间的自相关性是1,因为它们是相同的。

为什么它有用?

使用自相关性来度量时间序列与其自身的滞后版本的相关性。这个计算让我们对系列的特征有了一些有趣的了解:

季节性:假设我们发现某些滞后的相关性通常高于其他数值。这意味着我们的数据中有一些季节性成分。例如,如果有每日数据,并且发现每个 7 滞后项的数值都高于其他滞后项,那么我们可能有一些每周的季节性。

趋势:如果最近滞后的相关性较高并且随着滞后的增加而缓慢下降,那么我们的数据中存在一些趋势。因此,我们需要进行一些差分以使时间序列平稳。

让我们用一个Python示例,来看看他到底是如何工作的

Python示例

我们将使用经典的航空客运量数据集:

https://www.kaggle.com/datasets/ashfakyeafi/air-passenger-data-for-time-series-analysis

 # Import packages
 import plotly.express as px
 import pandas as pd
 
 # Read in the data
 data = pd.read_csv('AirPassengers.csv')
 
 # Plot the data
 fig = px.line(data, x='Month', y='#Passengers',
               labels=({'#Passengers': 'Passengers', 'Month': 'Date'}))
 
 fig.update_layout(template="simple_white", font=dict(size=18),
                   title_text='Airline Passengers', width=650,
                   title_x=0.5, height=400)

可视化可以看到有明显的上升趋势和年度季节性(按月索引的数据点)。

这里可以使用statsmodels包中的plot_acf函数来绘制时间序列在不同延迟下的自相关图,这种类型的图被称为相关图:

 # Import packages
 from statsmodels.graphics.tsaplots import plot_acf
 import matplotlib.pyplot as plt
 
 # Plot autocorrelation
 plt.rc("figure", figsize=(11,5))
 plot_acf(data['#Passengers'], lags=48)
 plt.ylim(0,1)
 plt.xlabel('Lags', fontsize=18)
 plt.ylabel('Correlation', fontsize=18)
 plt.xticks(fontsize=18)
 plt.yticks(fontsize=18)
 plt.title('Autocorrelation Plot', fontsize=20)
 plt.tight_layout()
 plt.show()

这里我们需要注意到以下几点:

  • 在每12步的滞后中有一个明显的周期性模式。这是由于我们的数据是按月编制的,因此我们的数据具有每年的季节性。
  • 随着滞后量的增加,相关强度总体上呈缓慢下降趋势。这在我们的数据中指出了一个趋势,在建模时需要对其进行区分以使其稳定。
  • 蓝色区域表示哪些滞后在统计上显著。因此在对该数据建立预测模型时,下个月的预测可能只考虑前一个值的~15个,因为它们具有统计学意义。

在值0处的滞后与1的完全相关,因为我们将时间序列与它自身的副本相关联。

总结

在这篇文章中,我们描述了什么是自相关,以及我们如何使用它来检测时间序列中的季节性和趋势。自相关还有其他用途。例如,我们可以使用预测模型残差的自相关图来确定残差是否确实独立。如果残差的自相关不是几乎为零,那么拟合模型可能没有考虑到所有的信息,是可以改进的。

作者:Egor Howell

本文转载于网络 如有侵权请联系删除

相关文章

  • iOS小技能: 限制账号退出登陆后无法收到推送功能(递归设置和删除别名)

    前言问题:ios中极光推送退出登陆后还能收到推送的问题解决方式:以极光推送为例子,退出登陆时删除别名的即可设置和删除别名采用递归的方式,如果设置失败就继续重试I别名设置、查询及删除操作以极光推送为例子https://docs.jiguang.cn/jpush/client/iOS/ios_api/#apiios退出登陆时删除别名的即可1.1设置别名设备别名(递归的方式,如果设置失败就继续重试)判断返回对应的状态码:0为成功-(void)setAliaWithblock:(void(^)(idsender))blockWithAlis:(NSString*)alis1 { if(QCTSession.shareQCTSession.isemptySeeionLocaling){ return; } WEAKSELF NSMutableString*alis=[[NSMutableStringalloc]init]; NSString*uuid=[[[UIDevicecurrentDevice]identifierForVendor]UUIDString]; //NSStri

  • PHP date_date_set() 函数

    实例返回一个新的DateTime对象,设置一个新的日期,然后格式化该日期:<?php $date=date_create(); date_date_set($date,2020,10,15); echodate_format($date,"Y/m/d"); ?>复制定义和用法date_date_set()函数设置新的日期。语法date_date_set(object,year,month,day);复制参数描述object必需。规定由 date_create() 返回的DateTime对象。year必需。规定日期中的年。month必需。规定日期中的月。day必需。规定日期中的日。技术细节返回值:如果成功则返回一个新的DateTime对象,如果失败则返回FALSE。PHP版本:5.2+更新日志:从PHP5.3+开始,如果成功,返回值则从NULL变成DateTime。

  • 实战|记一次内网靶机渗透测试

    靶机环境-魔改的红日6,修改了bluecms源码;外网Web:192.168.140.131/192.168.111.128内网Web:192.168.111.80/10.10.10.80DC:10.10.10.100x01外网web首先来到外网web:可以看到开放了80访问看看可以看到是bluecms1.6。这个cms很多漏洞,网上下载一套看看。1.1代码审计全文搜索下$_GET来到ad_js.php$ad_id=!empty($_GET['ad_id'])?trim($_GET['ad_id']):'';if(empty($ad_id)){echo'Error!';exit();}$ad=$db->getone("SELECT*FROM".table('ad')."WHEREad_id=".$ad_id);if($ad['time_set']==0){$ad_content=$ad['content'

  • 可解释分类算法的正确性评价

    近年来,可解释人工智能引起了人们的广泛关注,特征归因算法得到了越来越广泛的应用。然而,对于这些算法的有效性分析很少,因为在现有的数据集中没有“基本事实”来验证它们的正确性。在这项工作中,我们开发了一种方法,通过创建具有已知扩展地面真值的数据集来定量评估XAI算法的正确性。为此,我们重点研究了二进制分类问题。字符串数据集是使用从语法派生的形式语言构造的。当且仅当满足某个属性时,字符串才是正的。当且仅当符号有助于实现属性时,在正字符串中用作解释基础真值的符号是解释的一部分。实验中使用了两种常用的特征属性解释方法:局部可解释模型不可知解释(LIME)和SHapley加法解释(SHAP),结果表明:(1)分类精度与解释精度呈正相关(2)SHAP提供了比LIME更准确的解释(3)解释准确度与数据集复杂度呈负相关。原文题目:EvaluatingtheCorrectnessofExplainableAIAlgorithmsforClassification原文:ExplainableAIhasattractedmuchresearchattentioninrecentyearswithfeature

  • 小特工具箱新增模块:大数据分析工具

    小特工具箱又新增一个功能:大数据分析工具,界面如下图所示。基于DevExpress组件中的PivotGridControl控件,以前没注意到这个控件,最近才开始使用,发现确实挺好用。做一般的数据分析,够用了。我们以分析豆瓣电影评论为例,春节档电影最大黑马要数贾玲的《你好,李焕英》,我们通过抓取能够得到这部电影的豆瓣电影评论,保存成JSON。因为这个工具目前是单表操作,所有我们要额外加工下,把评论时间拆分下,分成评论日期和评论小时,还要再加一个聚合字段(相当于销售订单中的发货数量,用于统计)。至此,要分析的数据我们就准备好了。下面打开这个模块,将生成好的JSON文件复制至文本框,点击按钮:加载数据。之后会切换到基础数据面板,可以直接生成DataTable数据和解析出栏目列。右侧可以选择BI分析时的列,比如我们只统计电影评论的每天有多少条,每小时有多少条。我们就可以选择这3列,注意:数据类型需改为Int型,不然是无法统计的。设置完这些后,点击按钮:智能分析,就会切换到最后一个面板。它的栏目有这些类型,即可做为行,也可作为列。怎么折腾都行,你高兴就好。最后补充下,这个工具的数据源,支持这些J

  • jQuery获取data-*属性值

    下面就详细介绍四种方法获取data-*属性的值<liid="getId"data-id="122"data-vice-id="11">获取id</li>复制需要获取的就是data-id和dtat-vice-id的值一:getAttribute()方法constgetId=document.getElementById('getId'); ////getAttribute()取值属性 console.log(getId.getAttribute("data-id"));//122 console.log(getId.getAttribute("data-vice-id"));//11 ////setAttribute()赋值属性 getId.setAttribute("data-id","48"); console.log(getId.getAttribute("data-id"));/

  • 掌握设计模式之适配器模式

    前言由于所在行业的需求,需要跟许多第三方系统进行接口对接,并且虽然每个系统大同小异,但每次对接开发都采用重写一套,独立维护,对接时间久了就开始考虑有什么方式能将这么多的三方系统接口接入现有系统时统一规范化,按照固定模式接入,带着这个疑惑我开始四处寻求答案。在近期参加的《HeadFirstDesignPatterns》技术读书营中,本着学习设计模式,提高编码设计能力为目的,我看到适配器模式之后,明白它就是解除我疑惑的那个答案,紧接深入学习研究,于是就有了这篇文章。那么这是个怎样的模式,以及如何使用的呢,接下来就让我们学习下吧。正文什么是适配器模式首先我们来看下维基百科的定义:Insoftwareengineering,theadapterpatternisasoftwaredesignpatternthatallowstheinterfaceofanexistingclasstobeusedasanotherinterface.Itisoftenusedtomakeexistingclassesworkwithotherswithoutmodifyingtheirsourcecode.大

  • 网络编程模式

    S1.传统的网络编程模式(单线程下的通信)S2改良后网络编程模式(多线程)S3继续改良后的网络编程模式(线程池)S4再次改良后的网络编程模式(NIO)(非阻塞的IO多路复用机制)1.OIO服务端代码2.NIO服务端代码S1.传统的网络编程模式(单线程下的通信)在单线程模式下,IO操作没完成的时候,无法返回,造成服务器线程阻塞,其他客户端不能连上服务端。在只有一个餐厅服务员的情况下,服务员接待了一位客人,客人到餐桌上坐下后,服务员等待客人点餐,此时又有一个客人来吃饭,但是已经没有服务员去接待了,因为这个服务员在等待第一个客人点餐,直到第一个客人点完餐后,服务员把菜单交给厨房,然后才能去接待第二个进来的客人。。。(这样的服务客人早就走了)那么我们来看看如何改进S2改良后网络编程模式(多线程)在S1中我们发现了一些问题,当IO阻塞的时候,服务端无法接受请求,因此S2改用了多线程模式在多线程模式下,只要有客户端连进来,我们都会为之创建一个线程专门去处理客户端的IO操作。当完成之后,线程就会自动销毁。但是这样会带来一个问题,就是线程的频繁的创建和销毁非常消耗服务器的资源。饭馆里的老板面对这种情况

  • TCP通信

    TCP通信1.前期回顾1.1IP地址IP地址标识电脑,端口标识程序1.2socket套接字一种通信手段套接字用完一定要关闭sendto两个参数内容为bytes类型的,IP是字符串,端口是数字recvfrom()括号里面加1024的倍数,表示接收长度绑定端口:bind()里面加元组,IP加端口IP为空表示绑定本机的所有ip,如果填了某一个IP表示绑定了某一张网卡,只能接受这一网卡的消息。但是127.0.0.1绑定后,只能是本机给本机发送消息(其他人是发送不了的,因为此IP表示的是自己的电脑)2.TCP2.1学习目标理解UDP与TCP两种套接字的不同点理解sendrecv函数的功能理解服务器中bindlistenaccpet函数的功能2.2重要的小点,无序,乱优秀的软件背后都有一个服务器,来支撑客户端的服务一般的服务器指的是硬件,编程里面的服务器指的是程序(软件),称为服务器应用程序客户端是享受服务的,服务器是提供服务的两种电话:总机(接受呼叫转接到分机)和分机(和客户进行通信)总机一般是不会停机的等待服务区:已经拨通,但是还没有被服务过的"listen(128)"代表

  • Redis服务器相关命令

    服务器相关命令1、ping测试连接是否存活2、echo在命令行打印一些内容3、select选择数据库。Redis数据库编号从0-15,我们可以选择任意一个数据库来进行数据的存取4、quit退出连接5、dbsize返回当前数据库中key的数目6、info获取服务器的信息和统计7、monitor实时转储收到的请求8、configget获取服务器配置信息比如configget*获取全部数据的配置信息9、flushdb删除当前选择数据库中的所有key10、flushall删除所有数据库中的所有key

  • java定义数组变量初始化为0_java中怎么数组初始化?

    大家好,又见面了,我是你们的朋友全栈君。展开全部//数组定义最方便的就是用for循环来做定义,数组下标是从e69da5e6ba9062616964757a686964616f313333656462620开始,到11的话就是12个数字。要输出的话可以用以//号注释掉的后面的一句if(i<12){System.out.println(x[i]);}当然也可以自己再写一个for循环语句来输出,不过我觉得这有点画蛇添足了publicclassshuzu{ /***@paramargs*/publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstubintx[]=newint[12];for(inti=0;i<=11;i++){ x[i]=i;//if(i<12){System.out.println(x[i]);}}}}.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组

  • 端口镜像技术白皮书

      1.概述端口镜像就是将被监控端口上的数据复制到指定的监控端口,对数据进行分析和监视。被监控的端口叫镜像端口,该端口的数据被复制到监控端口;监控端口也可称为采集端口,该端口将接收到的报文转发到数据监测设备,以便对报文进行监控和分析。值得注意的是镜像端口的总带宽不应超过采集端口的带宽。   端口镜像的方向分为三种:①入方向:仅对从镜像端口收到的报文进行镜像。②出方向:仅对从镜像端口发出的报文进行镜像。③双向:对从镜像端口收到和发出的报文都进行镜像。    1.1技术优点采集端口会与数据监测设备相连,用户利用这些数据监测设备来分析复制到采集端口的报文,进行网络监控和故障排除。端口镜像设置灵活,用户可以指定受监控的报文的方向,如只监控指定端口发送的报文。    2.端口镜像介绍    2.1SPANSPAN技术主要是用来监控交换机上的数据流,大体分为两种类型,本地SPAN和远程SPAN(RSPAN),实现方法上稍有不同。利用SPAN技术我们可以把交换机上某些想要被监控端口(镜像端口)的数据流复制一份,发送给连接在采集端口上的网络分析仪(NetworkAnalyzer)。    2.2端口镜

  • 如何运用领域驱动设计 - 工作单元

    目录概述直接看东西什么是工作单元如何实现工作单元懒的模式实现思路落地代码缺陷总结 新年伊始,祝大家喜乐如意,爱和幸福“鼠”不尽!♫.♪♬.♩♫ 概述 在上一篇《如何运用领域驱动设计-存储库》的文章中,我们讲述了有关仓储的概念和使用规范。仓储为聚合提供了持久化到本地的功能,但是在持久化的过程中,有时一个聚合根中的各个领域对象会分散到不同的数据库表里面;又或者是一个用例操作需要操作多个仓储;而这些操作都应该要么同时成功,要么同时失败,因此就需要为这一系列操作提供事务的支持,而事务管理就是由工作单元来提供的。在上一篇中,可能已经提到了工作单元,但是仅仅是一笔带过,现在我们就来详细的探究该如何更好的来实现工作单元。(文章的代码片段都使用的是C#,案例项目也是基于DotNetCore平台)。 直接看东西 在上一篇文章中,已经为大家提供了一个Github的Demo。如果已经下载过该Demo的同学,您现在直接进行Pull就可以获得最新的版本了;如果还没有下载该Demo的同学也可以戳下方的跳转链接获取。 GitHub地址,点击直达哟 在这里我们可以先来看一下,该项目的应用代码是什么样子: [Htt

  • C++求集合的交集差集

    标准库的<algorithm>头文件中提供了std::set_difference,std::set_intersection和std::set_union用来求两个集合的差集,交集和并集。 正好有个需求,需要求在实体类集合A中,但是不再实体类集合B中的元素,可以使用上述方法来实现。 首先,来看下上述几个方法的简单使用。 std::vector<int>v1{1,2,3,4,5,6,7,8}; std::vector<int>v2{5,7,9,10}; std::sort(v1.begin(),v1.end()); std::sort(v2.begin(),v2.end()); std::vector<int>v_intersection; std::set_intersection(v1.begin(),v1.end(), v2.begin(),v2.end(), std::back_inserter(v_intersection)); for(intn:v_intersection) std::cout<<n<&

  • Silver Cow Party

    SilverCowParty 给出一个n个点m条边的有向图,\(w[i][j]\)为i到j的边权,给出一个点X,询问从每个点出发到达X再回到起点的路径长度和最大值,\(n\leq1000,m\leq100000\)。 解 显然为单源最短路径的题目,考虑点为起点终点的取反,建反边,工具是bfs(边权为1),双端队列bfs(边权0,1),优先队列bfs(边权为正)。 显然从点X出发得到到达每一个点i的路径长度即该点i返回时路径长度,记做\(dis1[i]\),那么建反边以后,从X到达的点i的路径长度记做\(dis2[i]\)。 用优先队列bfs求出这两个数组后,取最大的\(dis1[i]+dis2[i]\)即可。 参考代码: #include<iostream> #include<cstdio> #include<cstring> #defineilinline #defineriregister #defineSize1050 #defineintmax1061109567 usingnamespacestd; template<classfre

  • Flutter使用SingleTickerProviderStateMixin报错

    最近在学习开发Flutter应用项目,在创建tabbar和tabview后,进行网络请求后显示顶部tab标签,设置TabController,并使class类实现SingleTickerProviderStateMixin,代码如下 class_TravelPageStateextendsState<TravelPage>withSingleTickerProviderStateMixin{ TabController_tabController; TravelTabModeltravelTabModel; List<TravelTab>tabs=[]; @override voidinitState(){ _tabController=TabController(length:0,vsync:this); TravelTabDao.fetch().then((TravelTabModelmodel){ print(model); _tabController=TabController(length:model.tabs.length,vsync:this);

  • Cocos2dx使用wxsqlite开源加密SQLite3数据库

    最近使用wxsqlite加密sqlite3数据库,刚开始折腾好几天,在xcode上一直编译不通过,后来在sqlite3.c找到配置,编译顺利通过,太激动了,哈哈,废话少说!总结一下android和ios平台。 wxsqlite3 wxSqlite3作为wxWidgets的扩展组件用C++语法对Sqlite3的API进行了封装,为Sqlite3的使用提供了方便,并顺带实现了加密。wxWidgets是一个著名的C++跨平台UI框架。支持两种加密算法,128位的rijndael算法(默认)和256位的AES算法。下载:http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/ 解压wxSqlite3压缩包,找到sqlite3/secure/src文件夹的文件复制到external/sqlite3/include目录下,并且只需编译sqlite3secure.c文件。 -->启用宏需要在sqlite3secure.c最上面添加宏,启用加密#defineSQLITE_HAS_CODEC//启用256位加密,如果不启用

  • 对结构体进行排序

    packagemain import( "fmt" "math/rand" "sort" ) typeHerostruct{ Namestring Ageint } typeHeroSlice[]Hero func(hsHeroSlice)Len()int{ returnlen(hs) } func(hsHeroSlice)Less(i,jint)bool{ returnhs[i].Age<hs[j].Age } func(hsHeroSlice)Swap(i,jint){ hs[i],hs[j]=hs[j],hs[i] } funcmain(){ //varintSlice=[]int{0,-1,10,87,-2} //要求对intSlice切片进行排序 //sort.Sort(intSlice) varheroesHeroSlice fori:=0;i<10;i++{ hero:=Hero{ Name:fmt.Sprintf("村长-%d",rand.Intn(100)), Age:rand.Intn(100), } heroes=append(her

  • 自己制作一个简单的操作系统二[CherryOS]

    自己制作一个简单的操作系统二[CherryOS] 我的上一篇博客 自己制作一个简单的操作系统一[环境搭建],详细介绍了制作所需的前期准备工作   一.一点说明   这个操作系统只是第一步,仅仅是开机显示一个hellocherryos,不够万物开头都是helloxxxx不是吗?(┗(´・∧・`)┛) 特别说明一下:我们需要在一个纯英文的路径里制作自己的操作系统. 为什么,为啥我也不知道;   我的路径是: 二.开始编写 1.使用一个文本编辑器在上述目录下新建一个文件,boot.sam 2.在boot.asm中写入以下汇编代码,汇编不会?去学啊!!! org07c00h;告诉编译器程序加载到7c00处 movax,cs movds,ax moves,ax callDispStr;调用显示字符串例程 jmp$;无限循环 DispStr: movax,BootMessage movbp,ax;ES:BP=串地址 movcx,16;CX=串长度 movax,01301h;AH=13,AL=01h movbx,000ch;页号为0(BH=0)

  • vue axios 请求 https 的特殊处理

    最近遇到自签发的CA证书,在前端axios请求https请求时,无法自动加载证书。 解决方法:将无法加载的请求在浏览器新窗口手动加载,选择继续连接。 重新加载,问题解决。 根本原因:因为自签发证书,浏览器不承认,不能自动加载。

  • unity抗锯齿(Antialiasing)

    目前知道的有两种方式,下面依次介绍 一、系统菜单设置法。 这样只能简单去锯齿,要想效果特别明显,看下面的脚本吧。 二、为摄像机挂上一个去锯齿的系统脚本 导入后Assets资源下多了一个包 找到这个脚本,挂在摄像机上即可,当然这种去锯齿技术对显卡有硬件要求。

相关推荐

推荐阅读