TextBook:《时间序列分析——基于R》王燕
yield<-c(15.2,16.9,15.3,14.9,15.7,15.1,16.7)
yield<-ts(yield,start = 1884)
plot(yield,main='1884-1890年英格兰和威尔士地区小麦平均亩产量时序图',xlab = "年份",ylab="亩产量") # main:a main title for the plot
接下来研究 ‘plot’ 参数的影响。
plot(yield,type="p") # 散点图
plot(yield,type = "o") # 点线图
plot(yield,type = "o",pch=17) # 点线图,其中点用17代替,详见参数pch的解释
plot(yield,lty=2) # 连线参数设置为2,参见参数lty的解释
plot(yield,lwd=2) # 线宽度设置,2表示为默认宽度的2倍
plot(yield,xlim = c(1886,1890)) # 指定坐标轴范围,输出横轴范围为1886到1890
plot(yield,ylim=c(15,16)) # 指定坐标轴范围,输出纵轴范围为15到16
plot(yield)
abline(v=1887,lty=2) # 添加参照线为一条垂直线
plot(yield)
abline(v=c(1885,1889),lty=2) #添加参照线为多条垂直参照线
plot(yield)
abline(h=c(15.5,16.5),lty=2) # 添加参照先为多条水平线
acf(yield) # 绘制序列自相关图
# 1. 明显递增的时间序列
# 这是1964年-1999年的中国纱年产量序列
sha<-read.table("file4.csv",sep=",",header = T)
output<-ts(sha$output,start=1964)
plot(output)
很明显,此时间序列具有明显递增的趋势,故一定不是平稳时间序列。
# 2. 呈现规则周期性、呈现明显逐年递增趋势
# 这是1962年1月至1975年12月平均每头奶牛月产奶量序列
a<-read.table("file5.csv",sep=",",header = T)
milk<-ts(a$milk,start = c(1962,1),frequency = 12)
plot(milk)
很明显,此时间序列具有规则的周期性、明显递增的趋势,故一定不是平稳时间序列。
# 3. 时序图似乎可认为是平稳序列
# 这是1949年-1998年北京市最高气温序列
b<-read.table("file6.csv",sep=",",header = T)
temp<-ts(b$temp,start = 1949)
plot(temp)
平稳序列的自相关系数 \(\hat{\rho_k}\) 会很快地衰减为 0,而非平稳序列的自相关系数 \(\hat{\rho_k}\) 衰减向 0 的速度会非常慢。
# 1.
acf(output,lag=25)
序列的自相关系数递减到0的速度非常慢,自相关图上明显呈现三角对称性,这是具有单调趋势的非平稳序列的一种典型自相关图的趋势。
# 2.
acf(milk)
序列的自相关系数一直都大于 0 ,这是具有单调趋势序列的典型特征,
同时自相关图呈现明显的正弦波动规律,这是具有周期变化的非平稳序列的典型特征。
# 3.
acf(temp)
序列的自相关系数一直都很小,始终控制在2倍标准差的范围之内,可认为是随机性非常强的平稳时间序列具有的自相关图特征。
序列平稳的前提下,并非所有的平稳序列都值得建模,只有序列值之间具有密切的相关关系、历史数据对未来的发展具有一定影响的序列才值得建模,用于预测未来的发展。
若序列之间没有任何相关性,即意味着该序列为“没有记忆”的序列,过去的行为对未来没有任何影响,此时序列称为纯随机性序列,又称白噪声序列(white noise),记作 \(X_t \sim WN(\mu,\sigma^2)\) 。
统计角度而言,纯随机序列并没有任何分析的价值。
#随机生成1000个服从标准正态分布的白噪声序列观察值,并绘制时间序列图
white_noise<-rnorm(1000)
white_noise<-ts(white_noise)
plot(white_noise)
acf(white_noise)
纯随机序列的序列值之间应当没有任何相关关系。
假设检验
\[H_0:\rho_0=\rho_1=...=\rho_m=0 \quad v.s.\quad H_1: \exists k \leq m \quad s.t. \quad \rho_k \neq 0,\quad \forall m \geq 1\]
Q 统计量:大样本场合下检验效果很好,小样本场合下不太精确。 \[Q=n\sum_{k=1}^m \hat{\rho_k}^2 \dot{\sim} \chi^2(m)\]
LB 统计量:修正 Q 统计量,各种场合下的统计量其实指的是 LB 统计量。 \[LB=n(n+2)\sum_{k=1}^m (\frac{\hat{\rho_k}^2}{n-k}) \dot{\sim} \chi^2(m)\]
Box.test(white_noise,lag = 6) # 默认情况下为 Q 统计量
##
## Box-Pierce test
##
## data: white_noise
## X-squared = 5.8224, df = 6, p-value = 0.4434
Box.test(white_noise,lag = 12)
##
## Box-Pierce test
##
## data: white_noise
## X-squared = 14.325, df = 12, p-value = 0.2805
# 为一次得到多个白噪声检验的结果,编写一个循环命令
for(i in 1:2) print(Box.test(white_noise,lag=6*i)) # 输出6、12阶延迟的结果
##
## Box-Pierce test
##
## data: white_noise
## X-squared = 5.8224, df = 6, p-value = 0.4434
##
##
## Box-Pierce test
##
## data: white_noise
## X-squared = 14.325, df = 12, p-value = 0.2805
由于p值较大,故不能拒绝纯随机性的假设,即我们可以认为该序列并没有任何统计规律可循,故停止对该序列的统计分析。
由于平稳序列通常具有短期相关性,若一个平稳序列短期lag序列值之间都不存在显著的相关关系,通常长期lag之间就更不会存在显著的相关关系了。
# 检验 3. 的白噪声序列
for(i in 1:2)print(Box.test(temp,lag=6*i))
##
## Box-Pierce test
##
## data: temp
## X-squared = 5.0166, df = 6, p-value = 0.5417
##
##
## Box-Pierce test
##
## data: temp
## X-squared = 5.8565, df = 12, p-value = 0.9231
同上分析,我们认为北京市最高气温的变动为纯随机性变动,说明我们很难根据历史信息预测未来年份的最高气温。至此对该序列的分析结束。
这是1950年-1998年北京市城乡居民定期储蓄所占比例序列,下面对其进行平稳性与纯随机性检验
c<-read.table("file7.csv",sep=",",header = T)
prop<-ts(c$prop,start = 1950)
plot(prop)
由时间序列图可知,北京市城乡居民的定期储蓄始终占储蓄存款余额的 80% 左右,波动比较平稳。
acf(prop)
样本自相关图中,延迟 7 阶后,自相关系数均落入 2 倍标准差之内,且自相关系数向 0 衰减的速度非常快,延迟 8 阶后自相关系数在 0 值附近波动。我们可以认为这是一个典型的短期相关的样本自相关图。
由前,我们认为该序列为平稳序列。
下面进行纯随机性检验。
for(i in 1:2) print(Box.test(prop,lag=6*i))
##
## Box-Pierce test
##
## data: prop
## X-squared = 68.724, df = 6, p-value = 7.467e-13
##
##
## Box-Pierce test
##
## data: prop
## X-squared = 74.74, df = 12, p-value = 4.115e-11
纯随机性检验显示,p值较小,故拒绝原假设,即我们认为该序列并非为白噪声序列。
此时我们应当对该序列进行统计分析。
a1 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
b1 <-ts(a1)
plot(b1)
由时序图可知,此序列有明显的递增趋势,故一定不是平稳序列。
acf(b1)
上述自相关图表明,随着延迟数(lag)k的增加,平稳序列的自相关系数 \(\hat{\rho_k}\) 会很快的衰减到0,然而这个序列并不是,且在相关图上显示出明显的倒三角对称性,故序列具有单调趋势,且非平稳。
a2=c(t(read.table('D:/New_Folder/Study_Programming/R_Programme/R-Time-Series/Homework/1st_homework/test 2.2.txt',header=FALSE)))
b2 <-ts(a2,frequency=12,start=c(1975,1))
plot(b2)
由时间序列图可知,此时间序列数据具有逐年递增趋势,且呈现出规则的周期性,显然不为平稳的时间序列。
acf(b2,lag=24)
如上为样本自相关图,由图可知,该序列具有单调趋势,且由于图中呈现出明显的正弦波动规律,故此序列为具有周期变化规律的非平稳序列。
a3=c(t(read.table('D:/New_Folder/Study_Programming/R_Programme/R-Time-Series/Homework/1st_homework/test 2.3.txt',header=FALSE)))
b3 <-ts(a3,frequency=12,start=c(1945,1))
c3=acf(b3,lag=24)
c3
##
## Autocorrelations of series 'b3', by lag
##
## 0.0000 0.0833 0.1667 0.2500 0.3333 0.4167 0.5000 0.5833 0.6667 0.7500 0.8333
## 1.000 0.013 0.042 -0.043 -0.179 -0.251 -0.094 -0.068 -0.072 0.014 0.109
## 0.9167 1.0000 1.0833 1.1667 1.2500 1.3333 1.4167 1.5000 1.5833 1.6667 1.7500
## 0.217 0.316 -0.025 0.075 -0.141 -0.204 -0.245 0.066 -0.139 -0.034 0.206
## 1.8333 1.9167 2.0000
## -0.010 0.080 0.118
如上为k=1,2,…,24的样本自相关系数值,与样本自相关图,由图可知,该序列随着延迟数(lag)k的增加,平稳序列的自相关系数 \(\hat{\rho_k}\) 会很快的衰减到0,且落在横带内部,故可以判断为平稳序列。
for(i in 1:12) print(Box.test(b3,lag=i))
##
## Box-Pierce test
##
## data: b3
## X-squared = 0.011742, df = 1, p-value = 0.9137
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 0.13635, df = 2, p-value = 0.9341
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 0.2709, df = 3, p-value = 0.9654
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 2.5699, df = 4, p-value = 0.6322
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 7.1168, df = 5, p-value = 0.2121
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 7.7505, df = 6, p-value = 0.257
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 8.0812, df = 7, p-value = 0.3255
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 8.4542, df = 8, p-value = 0.3904
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 8.4681, df = 9, p-value = 0.4877
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 9.3306, df = 10, p-value = 0.501
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 12.73, df = 11, p-value = 0.3113
##
##
## Box-Pierce test
##
## data: b3
## X-squared = 19.914, df = 12, p-value = 0.06873
在滞后1-12期中,由于p-value>\(\alpha\)=0.05,故不能拒绝该序列纯随机的假设,我们可以认为此序列为white noise,具有纯随机性。
a4<-c(0.02,0.05,0.1,-0.02,0.05,0.01,0.12,-0.06,0.08,-0.05,0.02,-0.05)
barplot(a4)
计算LB统计量,
\[LB=n(n+2)\sum_{k=1}^{m} (\frac{\hat{\rho_k^2}}{n-k})\] 其中n=100,m=12
LBStatistics = function(n,m,series){
sums=0
for(i in 1:m){
sums=sums+series[i]**2/(n-i)
}
LB=sums*n*(n+2)
return(LB)
}
LBStatistics(n=100,m=12,a4)
## [1] 4.989531
LB统计量对应的分位点为0.9634,p-value=0.0363<\(\alpha\)=0.05,
故拒绝原假设,即序列不能视为纯随机序列。
a5=read.table('D:/New_Folder/Study_Programming/R_Programme/R-Time-Series/Homework/1st_homework/test 2.5.txt',header=FALSE)
a5_1=c(t(t(a5[2:nrow(a5),2:ncol(a5)])))
a5_1<-as.numeric(a5_1)
#用read.csv()命令读取后为数据框格式,两次使用t()命令后转化为矩阵格式,但其中的数字成为字符格式,电脑上显示均带有""号。
b5=ts(a5_1,frequency=12,start=2000)
plot(b5)
acf(b5)
由时间序列图可知,此时间序列数据呈现出规则的周期性。
由样本自相关图可知,此序列为具有周期变化规律的非平稳序列。
for(i in 1:12) print(Box.test(b5,lag=i))
##
## Box-Pierce test
##
## data: b5
## X-squared = 26.249, df = 1, p-value = 3.001e-07
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 36.276, df = 2, p-value = 1.327e-08
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 36.592, df = 3, p-value = 5.612e-08
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 41.509, df = 4, p-value = 2.108e-08
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 59.889, df = 5, p-value = 1.281e-11
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 84.84, df = 6, p-value = 3.331e-16
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 103.85, df = 7, p-value < 2.2e-16
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 109.39, df = 8, p-value < 2.2e-16
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 109.39, df = 9, p-value < 2.2e-16
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 114.74, df = 10, p-value < 2.2e-16
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 130.87, df = 11, p-value < 2.2e-16
##
##
## Box-Pierce test
##
## data: b5
## X-squared = 156.51, df = 12, p-value < 2.2e-16
在滞后1-12期中,由于p-value<\(\alpha\)=0.05,故拒绝该序列纯随机的假设,我们可以认为此序列不具有纯随机性,可以进行分析。
a6=scan('D:/New_Folder/Study_Programming/R_Programme/R-Time-Series/Homework/1st_homework/test 2.6.txt')
b6=ts(a6,frequency=12,start=1969)
b6
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1969 10 15 10 10 12 10 7 7 10 14 8 17
## 1970 14 18 3 9 11 10 6 12 14 10 25 29
## 1971 33 33 12 19 16 19 19 12 34 15 36 29
## 1972 26 21 17 19 13 20 24 12 6 14 6 12
## 1973 9 11 17 12 8 14 14 12 5 8 10 3
## 1974 16 8 8 7 12 6 10 8 10 5
acf(b6)
由样本自相关图可知,此序列不具有平稳性。
下面用ADF检验来检验序列的平稳性。
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
adf.test(b6)
##
## Augmented Dickey-Fuller Test
##
## data: b6
## Dickey-Fuller = -2.168, Lag order = 4, p-value = 0.5069
## alternative hypothesis: stationary
由于p-value>\(\alpha\)=0.05,故不拒绝原假设(原假设认为时间序列是非平稳的),即可认为序列不是平稳的。
for(i in 1:12) print(Box.test(b6,lag=i))
##
## Box-Pierce test
##
## data: b6
## X-squared = 17.921, df = 1, p-value = 2.303e-05
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 38.22, df = 2, p-value = 5.019e-09
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 47.99, df = 3, p-value = 2.14e-10
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 53.906, df = 4, p-value = 5.505e-11
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 58.56, df = 5, p-value = 2.41e-11
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 60.084, df = 6, p-value = 4.327e-11
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 65.174, df = 7, p-value = 1.388e-11
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 67.6, df = 8, p-value = 1.474e-11
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 69.808, df = 9, p-value = 1.66e-11
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 74.482, df = 10, p-value = 6e-12
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 77.482, df = 11, p-value = 4.519e-12
##
##
## Box-Pierce test
##
## data: b6
## X-squared = 81.066, df = 12, p-value = 2.583e-12
在滞后1-12期中,由于p-value<\(\alpha\)=0.05,故拒绝该序列纯随机的假设,我们可以认为此序列不具有纯随机性。
a6_2=diff(a6)
b6_2=ts(a6_2,frequency=12)
b6_2
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1 5 -5 0 2 -2 -3 0 3 4 -6 9 -3
## 2 4 -15 6 2 -1 -4 6 2 -4 15 4 4
## 3 0 -21 7 -3 3 0 -7 22 -19 21 -7 -3
## 4 -5 -4 2 -6 7 4 -12 -6 8 -8 6 -3
## 5 2 6 -5 -4 6 0 -2 -7 3 2 -7 13
## 6 -8 0 -1 5 -6 4 -2 2 -5
acf(b6_2)
adf.test(b6_2)
## Warning in adf.test(b6_2): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: b6_2
## Dickey-Fuller = -4.3625, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
检验可知,序列是平稳的。
for(i in 1:12) print(Box.test(b6_2,lag=i))
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 19.342, df = 1, p-value = 1.093e-05
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 21.965, df = 2, p-value = 1.699e-05
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 22.412, df = 3, p-value = 5.355e-05
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 22.654, df = 4, p-value = 0.0001485
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 23.242, df = 5, p-value = 0.0003035
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 27.755, df = 6, p-value = 0.0001045
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 30.96, df = 7, p-value = 6.324e-05
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 31.345, df = 8, p-value = 0.000122
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 31.682, df = 9, p-value = 0.0002259
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 32.38, df = 10, p-value = 0.000346
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 32.539, df = 11, p-value = 0.0006247
##
##
## Box-Pierce test
##
## data: b6_2
## X-squared = 33.288, df = 12, p-value = 0.0008727
在滞后1-12期中,由于p-value<\(\alpha\)=0.05,故拒绝该序列纯随机的假设,我们可以认为此序列不具有纯随机性。