时间序列分析Nile案例(基于R)

时间序列分析Nile案例(基于R)

时间序列分析Nile案例

在 R 的 datasets 包中,包含一个 Nile 的数据集,该数据是一个时间序列数据,主要记录了 1971 年-1970 年尼罗河每年的流量,请对其进行分析:

数据预处理

数据概况:

> Nile
Time Series:
Start = 1871 
End = 1970 
Frequency = 1 
  [1] 1120 1160  963 1210 1160 1160  813 1230 1370 1140  995  935 1110  994 1020  960 1180  799  958 1140 1100 1210 1150 1250 1260 1220
 [27] 1030 1100  774  840  874  694  940  833  701  916  692 1020 1050  969  831  726  456  824  702 1120 1100  832  764  821  768  845
 [53]  864  862  698  845  744  796 1040  759  781  865  845  944  984  897  822 1010  771  676  649  846  812  742  801 1040  860  874
 [79]  848  890  744  749  838 1050  918  986  797  923  975  815 1020  906  901 1170  912  746  919  718  714  740

该数据集中,数据集包含100个样本数据,时间跨度从1871年到1970年。

  1. 导入需要的包 ,导入需要的包;
library(dplyr)
library(tidyr)
library(zoo)
library(tseries)
library(ggfortify)
library(gridExtra)
library(forecast)
  1. 绘制相应时序图 ,绘制相应时序图,观察序列,以初步判断类型。
#以R自带的时间序列Nile(尼罗河的流量)为例
data(Nile)
Nile=Nile
#画出时序图和自相关图
autoplot(Nile)+ggtitle("尼罗河流量变化趋势")
plot(Nile,type="l",xlab="时间",ylab="尼罗河流量")
Box.test(Nile,type ="Ljung-Box")
## p-value =4.214-07 说明该序列非随机数据,即不为白噪声

运行结果:

> Box.test(Nile,type ="Ljung-Box")

	Box-Ljung test

data:  Nile
X-squared = 25.594, df = 1, p-value = 4.214e-07

可发现L B检验中P-value=4.214-07<0.05,故该序列非白噪声序列。有值得挖掘的信息。
在这里插入图片描述
3. 绘制自相关图和偏自相关图,以确定模型参数

p1 <- autoplot(acf(Nile,lag.max = 40,plot = F))+
  ggtitle("Nile序列自相关图")
p2 <- autoplot(pacf(Nile,lag.max = 40,plot = F))+
  ggtitle("Nile序列偏自相关图")
gridExtra::grid.arrange(p1,p2,nrow=2)

运行结果:
在这里插入图片描述
可发现自相关图快速地收敛,偏自相关图也是1阶截尾,且可发现,存在一定的周期性。可利用auto.arima()函数自动确定最优模型。
4. 利用auto.arima()函数确定模型参数

auto.arima(Nile)#自动创建最优模型

结果如下:

> auto.arima(Nile)#自动创建最优模型
Series: Nile 
ARIMA(1,1,1) 

Coefficients:
         ar1      ma1
      0.2544  -0.8741
s.e.  0.1194   0.0605

sigma^2 estimated as 20177:  log likelihood=-630.63
AIC=1267.25   AICc=1267.51   BIC=1275.04

可发现,最优模型为ARIMA(1,1,1)。

  1. 对该序列用ARIMA(1,1,1)进行拟合:
ARIMA <- arima(Nile, c(1, 1, 1))
summary(ARIMA)
Box.test(ARIMA$residuals,type ="Ljung-Box")
## p-value = 0.7431,此时,模型的残差已经是白噪声数据,数据中的信息已经充分的提取出来了

结果如下:

> summary(ARIMA)

Call:
arima(x = Nile, order = c(1, 1, 1))

Coefficients:
         ar1      ma1
      0.2544  -0.8741
s.e.  0.1194   0.0605

sigma^2 estimated as 19769:  log likelihood = -630.63,  aic = 1267.25

Training set error measures:
                    ME     RMSE      MAE       MPE     MAPE     MASE        ACF1
Training set -16.06603 139.8986 109.9998 -4.005967 12.78745 0.825499 -0.03228482
> Box.test(ARIMA$residuals,type ="Ljung-Box")

	Box-Ljung test

data:  ARIMA$residuals
X-squared = 0.10739, df = 1, p-value = 0.7431

模型拟合后,对残差进行了白噪声检验,可发现P-value=0.7431>0.05,故残差是白噪声,即可说明,模型拟合良好。

### 对Nile数据集进行平稳性检验 对于时间序列分析中的平稳性检验,ADF (Augmented Dickey-Fuller) 测试是一种常用方法。该测试可以用于检测给定的时间序列是否存在单位根,从而判断其是否为平稳过程。 在R环境中执行ADF测试并展示结果如下: ```r library(tseries) adf.test(Nile, alternative="stationary", k=0)[^1] ``` 上述命令通过`tseries`库调用了`adf.test()`函数来对Nile数据集进行了ADF测试。参数设置中指定了备择假设(`alternative`)为"stationary"(即认为序列是平稳的),以及滞后阶数(`k`)设为了零表示不考虑额外延迟项的影响。 如果p-value小于显著水平(通常取0.05),则拒绝存在单位根这一原假设,意味着此时间序列为平稳;反之,则接受原假设表明它不是平稳序列。 除了ADF测试之外,还可以利用KPSS(Kwiatkowski–Phillips–Schmidt–Shin)测试来进行另一种形式上的平稳性评估,在某些情况下两者可能会给出不同的结论。以下是使用KPSS测试的例子: ```r kpss.test(Nile, null="Level") ``` 这里选择了以水平作为零假设的形式(null="Level"),这意呸着当无法拒绝零假设时,说明时间序列围绕常数值波动而保持稳定状态。同样地,依据返回的结果里所含有的P值大小决定能否推翻关于非平稳性的断言。 #### 使用Python实现相同功能 同样的操作也可以借助Python完成,下面给出了相应的代码片段: ```python from statsmodels.tsa.stattools import adfuller, kpss import pandas as pd nile_data = pd.read_csv('path_to_nile_dataset.csv') # 需要先下载好Nile数据集文件 result_adf = adfuller(nile_data['flow'], autolag='AIC') print(f'ADF Statistic: {result_adf[0]}') print(f'p-value: {result_adf[1]}') result_kpss = kpss(nile_data['flow']) print(f'KPSS Statistic: {result_kpss[0]}') print(f'p-value: {result_kpss[1]}') ``` 这段脚本首先导入了必要的统计工具包,并读入了本地存储的Nile流量数据表单。接着分别应用了ADFuller和KPSS两种算法计算对应的统计量及其伴随概率(p-values),最后打印出来供进一步解释之用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值