[时间序列分析][5]--非平稳时间序列模型与差分

非平稳时间序列模型

通过差分平稳化

差分是什么

  1. 由 Cramer 分解定理 : 时间序列 = 确定性影响 + 随机性影响 , 而确定性影响又可以由多项式决定 , 而对多项式求 n 次差分 , 既能变成常数
  2. 差分在连续情况下可以理解为导数
    下面我们来看一个例子
f[x_] := x^2 + 3*x + 3;
data = Table[f[i], {i, 0, 10, .1}];
(*原始图像*)
ListPlot[data, AxesOrigin -> {0, 0}, PlotLabel -> "原始图像"]
(*进行第一次差分*)
temp = Differences[data];
(*第一次差分后的图像*)
ListPlot[temp, PlotLabel -> "第一次差分"]
(*进行第二次差分*)
ListPlot[Differences[temp], PlotLabel -> "第二次差分"]

可以得到如下的图形

我们可以看到做两次差分后的图形是一条直线,即可以将非平稳的时间序列变成平稳的。我们后面会举一个更好的例子,这个例子先让大家看一下差分是什么,差分和求导的联系。

是否要做差分–单位根检验

单位根检验原理 : 对时间序列 data 执行假设检验,其中零假设 Subscript[H, 0] 为满足 AR 模型的时间序列在相应的传递函数的分母中有一个单位根,而置换假设 Subscript[H, a] 则相反.

在 mathematica 的函数为 UnitRootTest

该函数返回的是 p-value , 若 p-value 越小,则越拒绝原假设,即 p-value 越小,越不需要进行差分

做多少次差分

  1. v 足够多次的差分运算可以充分地提取原序列中的非平稳确定性信息
  2. v 但过度的差分会造成有用信息的浪费

一个例子

我们看一个实际的例子
- 首先通过累加生成一组随机数

sample = RandomFunction[ARIMAProcess[{-.1}, 2, {.2}, .1], {1, 20^2}];
temp = sample[[2]][[1, 1]];
ListPlot[sample]

  • 单位根检验– 判断是否要做差分
UnitRootTest[temp, Automatic, "HypothesisTestData"]["TestDataTable"]


可以看到 p 值很大,即我们需要做差分。

  • 第一次差分
ListPlot@Differences[temp]

做完一次差分后数据还是非平稳的
- 第二次差分

ListPlot@Differences[temp, 2]

可以看到再做了两次差分之后,数据就已经把趋势去掉了,就可以用做完差分后的数据去做分析了

  • 再次做单位根检验
UnitRootTest[Differences[temp, 2], Automatic, "HypothesisTestData"]["TestDataTable"]

可以看到做完两次差分后再做单位根检验 p 值就很小了,即不需要再做单位根检验了。

ARIMA 模型

现在我们有了差分这个工具,于是我们继续优化我们之前的 ARMA 模型,改进后的模型称为 ARIMA 模型。

ARIMA(p,d,q)–p 表示自回归 (AR) 的系数,d 表示差分的阶数,q 表示滑动平均 (MA) 的系数

在 mathematica 中,我们可以直接调用ARIMA来拟合数据。

随机游动

讲一个和这个有点关系的,又挺有意思的一个问题。

模型产生典故
§Karl Pearson(1905) 在《自然》杂志上提问:假如有个醉汉醉得非常严重,完全丧失方向感,把他放在荒郊野外,一段时间之后再去找他,在什么地方找到他的概率最大呢?

  • 首先生成一组随机游走的数据
data = Accumulate[RandomReal[{-1, 1}, 100]];
ListLinePlot[data]

  • 对数据进行一阶差分
ListLinePlot[Differences[data]]

可以看到做完一阶差分之后数据就已经平稳了。于是我们想到了对差分后的数据检验一下是否是白噪声。我们知道,这些数据是随机生成的,那么检验出来的结果应该就是白噪声。我们下面看一下是不是白噪声。

  • 白噪声检验
ListPlot[Table[AutocorrelationTest[Differences[data], i], {i, 1, 10}], Filling -> Axis]

从图中,我们可以看到 p 值较大,则数据是白噪声。(p 值已经大于. 5 了)

  • 最后我们解决一下上面的问题,在哪里找到醉汉的概率最大。我们采取模拟的办法,模拟 1000 次,统计醉汉第 100 步的位置。
Histogram@Table[Total[RandomReal[{-1, 1}, {100}]], {1000}]

得到下面的图像

我们可以看到还是在零点附近找到醉汉的概率最大。大家可以推导一下具体的概率的表达式。

疏系数模型–中间有项可以是 0

什么是疏系数模型

  1. ARIMA(p,d,q) 模型是指 d 阶差分后自相关最高阶数为 p,移动平均最高阶数为 q 的模型,通常它包含 p+q 个独立的未知系数
  2. 如果该模型中有部分自相关系数部分移动平滑系数,即原模型中有部分系数省缺了,那么该模型称为疏系数模型。

如何判断是疏系数模型

我们可以通过自相关图和偏自相关图来判别是否是稀疏模型
我们来看下面的一个例子,下面是数据–1917 年-1975 年美国 23 岁妇女每万人生育率序列

  • 数据
{{1917., 183.1}, {1918., 183.9}, {1919., 163.1}, {1920., 
  179.5}, {1921., 181.4}, {1922., 173.4}, {1923., 167.6}, {1924., 
  177.4}, {1925., 171.7}, {1926., 170.1}, {1927., 163.7}, {1928., 
  151.9}, {1929., 145.4}, {1930., 145.}, {1931., 138.9}, {1932., 
  131.5}, {1933., 125.7}, {1934., 129.5}, {1935., 129.6}, {1936., 
  129.5}, {1937., 132.2}, {1938., 134.1}, {1939., 132.1}, {1940., 
  137.4}, {1941., 148.1}, {1942., 174.1}, {1943., 174.7}, {1944., 
  156.7}, {1945., 143.3}, {1946., 189.7}, {1947., 212.}, {1948., 
  200.4}, {1949., 201.8}, {1950., 200.7}, {1951., 215.6}, {1952., 
  222.5}, {1953., 231.5}, {1954., 237.9}, {1955., 244.}, {1956., 
  259.4}, {1957., 268.8}, {1958., 264.3}, {1959., 264.5}, {1960., 
  268.1}, {1961., 264.}, {1962., 252.8}, {1963., 240.}, {1964., 
  229.1}, {1965., 204.8}, {1966., 193.3}, {1967., 179.}, {1968., 
  178.1}, {1969., 181.1}, {1970., 165.6}, {1971., 159.8}, {1972., 
  136.1}, {1973., 126.3}, {1974., 123.3}, {1975., 118.5}}

我们看一下时序图


可以看到数据不是平稳的,我们做一下单位根检验
- 单位根检验

可以看到 p 值 > 0.5,而且从图上看也不平稳,故做一阶差分。

  • 做一阶差分
ListLinePlot[Differences[data[[All, 2]]], PlotMarkers -> {"\[FilledDiamond]", 7}]

对做了差分后的数据做单位根检验

可以看到 p 值为 10^-6 次方,故不需要再做差分

  • 求自相关图和偏自相关图


我们可以从自相关图和偏自相关图中看出疏系数模型。如在这里,模型为 ARIMA ((1, 4, 5), 1, 0),从自相关图中可以看出滞后 1,4,5 比较大,则第一第二个自相关系数为 0。其余同理。

2017/4/22

推广

最近在做一下微信公众号

欢迎大家关注我的公众号: prettymath

不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!


AR模型的定义
谢谢大家支持

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Python中进行时间序列分析时,差分是一种常用的方法。差分可以通过计算当前观测值与前一个观测值之间的差异来消除时间序列中的趋势和季节性。这有助于将平稳时间序列转化为平稳时间序列,使得模型更容易处理。 在Python中,你可以使用pandas库中的diff()函数来进行差分操作。diff()函数通过计算相邻元素之间的差异来实现差分。你可以指定差分的阶数,即计算当前观测值与前几个观测值之间的差异。 以下是一个示例代码,展示如何在Python中进行时间序列差分: ```python import pandas as pd # 假设你的时间序列数据存储在一个名为df的DataFrame中,其中包含一个名为'values'的列 # 进行一阶差分 df['diff1'] = df['values'].diff() # 进行二阶差分 df['diff2'] = df['values'].diff().diff() # 进行更高阶的差分 # df['diff3'] = df['values'].diff().diff().diff() # 输出差分后的时间序列数据 print(df) ``` 通过使用diff()函数,你可以很容易地对时间序列进行一阶、二阶甚至更高阶的差分操作。差分后的时间序列数据可以用于进一步的建模和分析。 参考资料: Time Series Analysis in Python – A Comprehensive Guide with Examples 时间序列是在规律性时间间隔上记录的观测值序列。本指南将带你了解在Python中分析给定时间序列的特征的全过程。 https://www.machinelearningplus.com/time-series/time-series-analysis-python/<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [独家 | Python时间序列分析:一项基于案例的全面指南](https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/118004499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值