数据序列相关性-ACF,PACF和CCF

2023-10-30

引言

最近写论文关于预测的特征选择遇到一些问题,想把自己查询学习到的东西整理记录一下,理一理头绪,希望能加深自己对这些东西的理解。首先介绍引入几个概念:自相关函数(autocorrelation function,ACF)、偏自相关函数(partial autocorrelation,PACF)和互相关函数(cross-correlation function,CCF)。接下来介绍每个指标的计算方法和用途:

1. ACF

顾名思义,自相关函数是针对单个时间序列的,对于时间序列\{x_t\},滞后k阶的自协方差函数(autocovariance function,ACVF)为[1]

c_k = \frac{1}{n}\sum_{t=1}^{n-k} \left(x_t-\bar{x}\right) \left(x_{t+k}-\bar{x}\right)

c_0 = \frac{1}{n}\sum_{t=1}^{n} \left(x_t-\bar{x}\right) ^2

ACF被定义为:

acf_k = \frac{c_k}{c_0} = \text{Cor}(x_t,x_{t+k})

我理解的也等同于序列\{x_t\}\{x_{t+k}\}的pearson相关系数。置信区间一般使用下式进行计算[2]
\pm z_{1-\alpha/2} \sqrt{\frac{1}{N} (1 + 2 \sum_{i=1}^{k}{x_{i}^2})}

下面是一个简单的计算程序,是对statsmodels模块的源代码进行简化得到的[3]

from scipy.stats import norm
import numpy as np

def acf(x,nlags=40, alpha=None):
    # Calculate the autocorrelation function. 
    nobs = len(x)
    avf = acovf(x,nlag = nlags)
    acf = avf[:nlags + 1] / avf[0]
    if alpha is not None:
        varacf = np.ones(nlags + 1) / nobs
        varacf[0] = 0
        varacf[1] = 1. / nobs
        varacf[2:] *= 1 + 2 * np.cumsum(acf[1:-1]**2)
        interval = norm.ppf(1 - alpha / 2.) * np.sqrt(varacf)
        confint = np.array(lzip(acf - interval, acf + interval))
        return acf, confint
    else:
        return acf
def acovf(x,nlag=None):
    # Estimate autocovariances.
    xo = x - x.mean()
    n = len(x)
    lag_len = nlag
    if nlag is None:
        lag_len = n - 1
    elif nlag > n - 1:
        raise ValueError('nlag must be smaller than nobs - 1')
    acov = np.empty(lag_len + 1)
    acov[0] = xo.dot(xo)
    for i in range(lag_len):
            acov[i + 1] = xo[i + 1:].dot(xo[:-(i + 1)])
    return  acov

理解了原理可以这样。

import pandas as pd
import matplotlib.pyplot as plt

from statsmodels.tsa.stattools import acf
from statsmodels.graphics.tsaplots import plot_acf

x = pd.read_excel('resample.xls',index_col=0,date_parse=True)

acf_x, interval = acf(x=x,nlags=10,alpha=0.05)
print('ACF:\n',acf_x)
print('ACF95%置信区间下界:\n',interval[:,0]-acf_x)
print('ACF95%置信区间上界:\n',interval[:,1]-acf_x)


plot_acf(x=x,lags=10,alpha=0.05)
plt.show()

输出结果:

ACF:
 [1.         0.97339745 0.95013662 0.93091665 0.91399405 0.89897186
 0.88282934 0.86933546 0.85708885 0.84621534 0.83720026]
ACF95%置信区间下界:
 [ 0.         -0.03625835 -0.06169254 -0.07861061 -0.09196861 -0.10322176
 -0.11304703 -0.12177398 -0.12967655 -0.13692158 -0.14363264]
ACF95%置信区间上界:
 [0.         0.03625835 0.06169254 0.07861061 0.09196861 0.10322176
 0.11304703 0.12177398 0.12967655 0.13692158 0.14363264]

acf

[1] https://nwfsc-timeseries.github.io/atsa-labs/sec-tslab-correlation-within-and-among-time-series.html : Book, Applied Time Series Analysis for Fisheries and Environmental Sciences

[2] https://www.statsmodels.org/stable/_modules/statsmodels/tsa/stattools.html#acf : Python modular, statsmodels

[3] https://www.itl.nist.gov/div898/handbook/eda/section3/autocopl.htm : Engineering statistics handbook

2. PACF

偏自相关函数也是针对单个时间序列的,关于其和ACF的区别,[4] 进行了一般性的易于理解的解释,我在这里根据自己的理解进行简要翻译一下。

偏自相关函数是序列\{x_t\}与滞后k阶的序列\{x_{t-k}\}的线性相关性,移除\{x_{t-1},x_{t-2},\dots,x_{t-(k-1)}\}的线性依赖,计算公式为:

pacf_k = \begin{cases} \text{Cor}(x_1,x_0)=r_1 & \text{if } k = 1;\\ \text{Cor}(x_k-x_k^{k-1},x_0-x_0^{k-1}) & \text{if } k \geq 2; \end{cases}

滞后1阶的pacf与滞后1阶的acf相等,不存在滞后0阶的pacf。

import pandas as pd
import matplotlib.pyplot as plt

from statsmodels.tsa.stattools import pacf
from statsmodels.graphics.tsaplots import plot_pacf

x = pd.read_excel('resample.xls',index_col=0,date_parse=True)

pacf_x, interval = pacf(x=x,nlags=10,alpha=0.05)
print('PACF:\n',pacf_x)
print('PACF95%置信区间下界:\n',interval[:,0]-pacf_x)
print('PACF95%置信区间上界:\n',interval[:,1]-pacf_x)


plot_pacf(x=x,lags=10,alpha=0.05)
plt.savefig('acf1.jpg',dpi=200)
plt.show()
PACF:
 [ 1.          0.97373069  0.05083912  0.07012207  0.04486007  0.04104969
 -0.01595041  0.0505279   0.02666616  0.03388021  0.04459499]
PACF95%置信区间下界:
 [ 0.         -0.03625835 -0.03625835 -0.03625835 -0.03625835 -0.03625835
 -0.03625835 -0.03625835 -0.03625835 -0.03625835 -0.03625835]
PACF95%置信区间上界:
 [0.         0.03625835 0.03625835 0.03625835 0.03625835 0.03625835
 0.03625835 0.03625835 0.03625835 0.03625835 0.03625835]

pacf

 

3. CCF

交叉相关系数是针对两个时间序列的,对于时间序列\{x_t\}\{y_t\},先计算互协方差函数:
g_k^{xy} = \frac{1}{n}\sum_{t=1}^{n-k} \left(y_t-\bar{y}\right) \left(x_{t+k}-\bar{x}\right)

CCF的定义类似ACF:

r_k^{xy} = \frac{g_k^{xy}}{\sqrt{\text{SD}_x\text{SD}_y}}

其中,{SD}_x, {SD}_y分别为\{x_t\},\{y_t\}的标准差。同时,应该注意的是r_k^{xy} \neq r_{-k}^{xy}r_k^{xy} = r_{-k}^{yx}。其中,y是解释变量,x是预测因子。CCF的95%的置信区间计算公式定义为[1]:

-\frac{1}{n} \pm \frac{2}{\sqrt{n}}

其中n是用于计算互相关系数的样本数量。

import pandas as pd

from statsmodels.tsa.stattools import ccf

x = pd.read_excel('resample.xls',index_col=0,date_parse=True)
ccf_x = ccf(x=x.values.ravel(),y=x.values.ravel())
print('CCF:\n',ccf_x[:10])
输出是:
CCF:
 [1.         0.97373069 0.95078739 0.9318734  0.91524696 0.90051278
 0.88464586 0.87142306 0.85944187 0.8488298 ]

附录:

1. 计算ccf,acf和pcf的置信区间的时候,和数据序列的长度有关系,长度取多少的时候比较合适?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据序列相关性-ACF,PACF和CCF 的相关文章

  • 操作数无法与形状 (128,) (0,) 错误一起广播

    我正在尝试实现面部识别登录系统 但出现错误 操作数无法与形状 128 0 一起广播 我不知道什么或如何解决它 这是我已实现的 view py 和 FaceDetector py 以及我从服务器收到的错误 errors Traceback m
  • PyList_SetItem 与 PyList_SETITEM

    据我所知 PyList SetItem 和 PyList SETITEM 之间的区别在于 PyList SetItem 会降低它覆盖的列表项的引用计数 而 PyList SETITEM 不会 我有什么理由不应该一直使用 PyList Set
  • 为什么我不能使用“exclude”从 python 轮子中排除“tests”目录?

    考虑以下包结构 与以下setup py内容 from setuptools import setup find packages setup name dfl client packages find packages exclude te
  • DataFrame 在函数内部修改

    我面临一个我以前从未观察到的函数内数据帧修改的问题 有没有一种方法可以处理这个问题 以便初始数据帧不被修改 def test df df tt np nan return df dff pd DataFrame data 现在 当我打印时d
  • Python:记录垃圾收集器

    我有一个 python 应用程序 有一些性能问题 我想将垃圾收集器的事件 特别是何时调用 添加到我的日志中 是否可以 thanks http docs python org library gc html gc set debug http
  • Python,将迭代函数变成递归函数

    我创建了一个输出 4 3 2 1 0 1 2 3 4 的迭代函数 def bounce2 n s n for i in range n print n n n 1 if n lt 0 for i in range s 1 print n n
  • 如何在 ReportLab 段落中插入回车符?

    有没有办法在 ReportLab 的段落中插入回车符 我试图将 n 连接到我的段落字符串 但这不起作用 Title Paragraph Title n Page myStyle 我想要这样做 因为我将名称放入单元格中 并且想要控制单元格中的
  • 字典中的列表,Python 中的循环

    我有以下代码 TYPES hotmail type hotmail lookup mixed dkim no signatures S Return Path email protected cdn cgi l email protecti
  • 如何找到列表S的所有分区为k个子集(可以为空)?

    我有一个唯一元素列表 比方说 1 2 我想将其拆分为 k 2 个子列表 现在我想要所有可能的子列表 1 2 1 2 2 1 1 2 我想分成 1 1 2 我怎样才能用 Python 3 做到这一点 更新 我的目标是获取 N 个唯一数字列表的
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • Python 正则表达式部分匹配或“hitEnd”

    我正在编写一个扫描器 因此我将任意字符串与正则表达式规则列表进行匹配 如果我可以模拟 Java hitEnd 功能 不仅知道正则表达式何时不匹配 还知道何时匹配 这将非常有用 can t匹配 当正则表达式匹配器在决定拒绝输入之前到达输入末尾
  • 如何使用循环将十进制转换为二进制?

    我想编写一个程序 将十进制数 0 到 9 转换为二进制数 我可以编写如何使用重复除法将十进制数转换为二进制数的代码 但是 我在创建一个以二进制格式打印十进制数字 0 到 9 的循环时遇到了麻烦 这是我的代码 number 0 remaind
  • 如何使用 Python 多处理避免在分叉进程中加载​​父模块

    当您创建一个Pool使用Python的进程multiprocessing 这些进程将分叉 父进程中的全局变量将显示在子进程中 如下面的问题所述 如何限制多处理进程的范围 https stackoverflow com questions 2
  • 如何从 Python 中指定运行程序的输入文件?

    我正在编写一个外部脚本 以通过笔记本电脑上的 Python mrjob 模块 而不是在 Amazon Elastic Compute Cloud 或任何大型集群上 运行 mapreduce 作业 我读自mrjob文档 http packag
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • Python 视频框架

    我正在寻找一个 Python 框架 它将使我能够播放视频并在该视频上绘图 用于标记目的 我尝试过 Pyglet 但这似乎效果不是特别好 在现有视频上绘图时 会出现闪烁 即使使用双缓冲和所有这些好东西 而且似乎没有办法在每帧回调期间获取视频中
  • 为什么 bot.get_channel() 会产生 NoneType?

    我正在制作一个 Discord 机器人来处理公告命令 当使用该命令时 我希望机器人在特定通道中发送一条消息 并向用户发送一条消息以表明该命令已发送 但是 我无法将消息发送到频道 我尝试了这段代码 import discord import
  • 从另一个 python 脚本获取返回信息

    我在 Linux 上 我有一个 python 脚本 我想从另一个 python 脚本调用它 我不想将其作为模块导入 为了一层安全性 现在为了学术练习 因为我想弄清楚这一点 我实际上想让一个脚本使用 os system 或另一个类似的函数 并
  • 在 Python 的 Textmate 中突出显示尾随空格?

    我想做类似的事情this http remysharp com 2008 03 30 trailing white space in textmate Textmate 提示 这样当我在 Python 中编写代码时 尾随空白总是以某种方式突
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03

随机推荐

  • 使用 EasyExcel 读取和下载 excel 文件

    前言 EasyExcel是阿里巴巴开源的一个excel处理框架 以使用简单 节省内存著称 EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中 而是从磁盘上一行行读取数据 逐个解析 Easy
  • Java基础(面向对象,继承,抽象类,接口,多态)

    文章目录 JAVA基础 面向对象 笔记整理 JAVA基础 面向对象 笔记整理 面向对象概述 1 面向对象的思想来源生活 2 任何的对象从两个方面描述 静态属性 动态属性 3 创建一个类 其实就创建了一个模板 4 创建了一个类就是创建了一个新
  • AVS、MPEG-2、H.264 标准文档

    几年前 做过一些 AVS H 264 的编解码工作 收集了一点标准文档及开源代码 这些我都分享在前一个博客 http sep blog chinaunix net 由于该博客的文件分享都失效了 因此有不少童鞋找到这里联系上我 为了方便大家
  • vue中配置别名

    在根目录创建名为 jsconfig json 的文件 compilerOptions baseUrl paths src exclude node modules dist
  • 深度解析StringBuilder

    深度解析StringBuilder 基本介绍 1 StringBuilder 是一个可变的字符序列 此类提供一个与StringBuffer兼容的API 但不保证同步 StringBuilder 不是线程安全的 此类被设计用作StringBu
  • stable diffusion实践操作-图片生文字到图片

    本文专门开一节写 文字图片相关的内容 在看之前 可以同步关注 stable diffusion实践操作 正文 1 png 图片提取信息 SD可以从png图片中提取信息 然后在来生成图片 1 1 保存png 到liblib网站 下载png图片
  • IDEA在Web项目部署时没有Artifact选项的解决方法

    1 现象 使用Intellij IDEA配置Web项目时 如下图所示 选择Deployment后点击 没有出现Artifact选项 2 解决方法 1 在Intellij IDEA开发菜单栏中 选择 File gt Project Struc
  • python requests post和get请求,并把结果写入json文件中

    今天在分析网页的时候 发现需要利用requests请求 得到数据 然后这会经常用到 虽然简单 但是容易忘记 所以我这里记录一下我用的python requests的demo文件 post请求 import requests json hea
  • zabbix数据库添加主从同步

    zabbix数据库正常运行的情况下 做mysql主从同步添加从库操作 一 在从库主机上安装mysql 注 版本与主库master一致 1 1 创建用户 groupadd mysql useradd r g mysql mysql 1 2 上
  • 服务器系列和酷睿系列,至强cpu与酷睿两个系列之间有什么区别?

    很多朋友选购英特尔处理器时 会纠结于酷睿与至强两个系列之间就 不知如何选择 标致左酷睿 右至强 酷睿系列CPU如i3 i5 i7是我们一般消费者最为熟悉的 它也是针对大部分家用桌面级消费者开发的中高端处理器 当然也包括低端的G系列的赛扬处理
  • (第一章)嵌入式linux之常用汇编指令

    1 处理器内部数据传输指令 数据传输指令分为 一般寄存器间的数据传输或者 特殊寄存器与一般寄存器间的数据传输 数据传输常用的指令有三个 MOV MRS 和 MSR 用法示例 1 MOV 指令 MOV R0 R1 将寄存器 R1 中的数据传递
  • 基于百度飞桨PaddlePaddle和PARL复现PPO强化学习算法

    文章目录 一 PPO训练效果展示 Mujoco HalfCheetah v2 二 策略优化算法发展回顾 三 PPO 算法论文阅读 1 Introduction 2 Background Policy Optimization 2 1 Pol
  • R语言使用RMySQL连接及读写Mysql数据库

    简单说下安装过程 一般不会有问题 重点是RMySQL的使用方式 系统环境说明 Redhat系统 Linux 460 42 6 32 431 29 2 el6 x86 64 系统编码 LANG zh CN UTF 8 中文UTF 8格式 my
  • Access Token是做什么的

    我们在访问很多大公司的开放 api 的时候 都会发现这些 api 要求传递一个 access token 参数 这个参数是什么呢 需要去哪里获取这个 access token 呢 access token 是在 Oauth2 0 协议中 客
  • ag-Grid的基本用法一(表格列的定义)

    最近在研究基于angular2 的表格的用法 发现一种非常好用的表格 就是ag grid ag grid不仅对angular1 x有支持 还支持react vue等目前主流的前端框架 这里我们只是对angular2 中的ag grid进行讲
  • 朴素贝叶斯分类器:R语言实现

    span style font family none background color rgb 255 255 255 span span style font family none background color rgb 255 2
  • flask中request.args和request.form区别

    app route ajaxget1 def ajax test get server name request args get server name server ip request args get server ip print
  • 前端的反单引号语法之`${}`

    es6中新增的字符串方法 可以配合反单引号完成拼接字符串的功能 1 反单引号怎么打出来 将输入法调整为英文输入法 单击键盘上数字键1左边的按键 2 用法 step1 定义需要拼接进去的字符串变量 step2 将字符串变量用 包起来 再写到需
  • c语言打开文本有什么作用,c语言文件打开方式有哪些

    c语言文件打开方式有哪些 ANSI C规定文件打开用函数fopen 关闭为fclose 1 调用方式通常为 FILE fp fp fopen 文件名 打开方式 2 参数说明 文件名 形如 myfile dat F data myfile d
  • 数据序列相关性-ACF,PACF和CCF

    引言 最近写论文关于预测的特征选择遇到一些问题 想把自己查询学习到的东西整理记录一下 理一理头绪 希望能加深自己对这些东西的理解 首先介绍引入几个概念 自相关函数 autocorrelation function ACF 偏自相关函数 pa