R语言实现时间序列之8种平稳化方法

R语言实现——8种方法平稳法

选取R语言自带数据集中1959-1997年每月大气co2浓度作为数据,plot(co2),观察图像可以发现这个数据是具有趋势和周期的,并且是方差齐次的,所以可以考虑使用平稳化方法来使之平稳化。

 

 

  1. 差分+季节性差分

S<-diff(co2)%一阶差分 

Plot(S)


diff(S,d,1)%d步差分

当d取12时得到如下图

 

    通过观察时序图看发现没有明显的趋势和周期来,可以初步判断该时间序列为平稳时间序列

  1. 季节差分+差分

s<-diff(co2,12,1)

Plot(s)

plot(diff(s))

    通过观察时序图看发现没有明显的趋势和周期来,可以初步判断该时间序列为平稳时间序列

    结论:通过观察第一种和第二种平稳化方法得到的数据和时序图可以发现两种方法得到的结果是一致的,这是符合数学逻辑上的推理。

3.季节指数+差分

    在该方法下,生成存储矩阵,将数据导入存储矩阵中进行相应的运算。

首先,利用季节指数去掉该时间序列数据的周期性,代码如下:

> data(package='datasets')
> c<-as.matrix(co2)%将数据以矩阵形式表达
> a<-matrix(1,39,12)%将数据导入矩阵中
> for (i in 1:nrow(c))
+ if(i%%12==0)
+ a[i/12,12]<-c[i,1]
> for (i in 1:nrow(c))
+ for (j in 1:11)
+ if (i%%12==j)
+ a[(i+(12-i%%12))/12,j]<-c[i,1]
> b<-matrix(1,39,2)%生成b存储矩阵,存储计算后得到的年平均值和季节指数
> for (i in 1:39)
+ b[i,1]<-mean(a[i,])
> for (i in 1:39)
+ b[i,2]<-b[i,1]/mean(a)
> plot(b[,2])%对季节指数进行画图

> d<-matrix(1,39,12)%对残差进行分析

> for (i in 1:39)+ for (j in 1:12)+ d[i,j]<-a[i,j]-b[i,1]

> plot(d)%画图,观察利用季节指数去除周期的效果

    结果:从图中可以看出,都在0附近波动,说明去除周期性效果较好。

    其次,进行1阶差分运算,去除线性趋势,代码如下:> diff(d)

    结果:差分后,数据在0附近波动,说明去除趋势效果较好

4.差分+季节指数

    该方法与上一方法颠倒顺序,方法相似。首先,进行1阶差分去掉该时间序列数据的趋势,代码如下:

> diff(a)

 

    结果:从图中可以看出,数据在0附近波动,说明差分情况较好。

    其次,对差分后的数据利用季节指数进行运算,去除周期性,代码如下:

> f<-diff(a)
> b1<-matrix(1,39,12)
> for (i in 1:39)
+ b> b1<-matrix(1,39,2)
> for (i in 1:38)
+ b1[i,1]<-mean(f[i,])
> for (i in 1:38)
+ b1[i,2]<-b1[i,1]/mean(f)
>g<-matrix(1,38,12)
> for (i in 1:38)
+ for (j in 1:12)
+ g[i,j]<-f[i,j]-b1[i,1]> plot(g)

    原理与方法3相同,不再赘述。

    结果:从图中可以看出,数据在0附近波动,去除周期性结果较好。

    从方法3和方法4中可以看出,平稳化使用的方法是相同的,都是使用的差分和季节指数,但是,顺序不同,得到的结果有一定的差别。
    其中的难点主要在于用代码实现自动计算季节指数,如果用Excel等工具会简单一些,但不够常规化,故我们在用R语言实现了计算季节指数是比较通用的。

    通过拟合去掉趋势效果不好,故针对本例子暂不考虑拟合法和其他方法结合平稳化。 

感谢合作者(GX T).

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R语言可以用于实现时间序列分析。时间序列分析的过程可以分为数据预处理和趋势预测两个主要部分。 1. 数据预处理: - 读入数据:使用R语言的read.csv()函数或read.table()函数读取时间序列数据文件。 - 定义日期:将数据中的日期列转换为R语言中的日期格式,可以使用as.Date()函数。 - 平稳性判断:通过绘制时间序列图和自相关图来观察数据的平稳性。可以使用plot()函数和acf()函数。 - 季节分解:对于具有季节性的时间序列,可以使用decompose()函数进行季节分解,得到趋势、季节和随机成分。 2. 趋势预测: - 模型选择:根据数据的特点选择合适的时间序列模型,常见的模型包括ARIMA模型、指数平滑模型和季节性模型等。 - 模型拟合:使用选定的模型对数据进行拟合,可以使用arima()函数、ets()函数等。 - 预测:根据拟合的模型进行预测,可以使用forecast()函数。 下面是一个示例代码,演示了如何使用R语言进行时间序列分析: ```R # 读入数据 data <- read.csv("data.csv") # 定义日期 data$date <- as.Date(data$date) # 平稳性判断 plot(data$date, data$value, type = "l", xlab = "Date", ylab = "Value") acf(data$value) # 季节分解 decomposed <- decompose(data$value) trend <- decomposed$trend seasonal <- decomposed$seasonal random <- decomposed$random # 模型选择 model <- auto.arima(data$value) # 模型拟合 fit <- arima(data$value, order = model$arma) # 预测 forecast <- forecast(fit, h = 10) # 输出预测结果 print(forecast) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值