时间序列分析作业 2
时间序列Problem 1
生成数据
1 | model = ARMAProcess[{0.1, 0.12}, {-0.6, 0.7}, 1]; |
用不同阶数 ARMA 模型进行拟合并计算 AIC, BIC
1 | results = |
求最小阶数
1 | Position[aic, Min[aic]] |
均为 ARMA(2,2)
模型最合适.
重复以上过程 100 次, 并求阶数平均值标准差
1 | result100 = ParallelTable[Module[{data, results, aic, bic}, |
Problem 2
使用上一题的代码生成数据, 进行正态白噪声检验
1 | datanormal = Normal[data][[1, All, 2]]; |
得到
使用逆序检验法检验平稳性
1 | m = 20; |
得到
使用游程检验法检验平稳性
1 | mean = Mean[datanormal]; |
计算得到
进行序列零均值检验. 取
1 | \[Gamma] = CovarianceFunction[data, {n - 1}] |
得到
模型的识别与参数估计, 绘制自相关图
1 | gamma = CovarianceFunction[data, {10}]; |
绘制偏相关图
1 | phi = PartialCorrelationFunction[data, {10}]; |
发现自相关函数在 2 步截尾, 偏相关函数拖尾, 有可能认为是
Problem 3
1 | model = SARIMAProcess[{0.1, 0.12}, |
进行模型识别,绘制一阶差分的自相关图
1 | gamma = CovarianceFunction[Differences[data], {20}]; |
注意到数据有明显的季节性,且均值随时间明显地变化,则使用 SARIMA 模型是合适的,
使用 TimeSeriesModelFit
估计参数
1 | tsm = TimeSeriesModelFit[data, {"SARIMA", {{2, 1, 1}, {2, 1, 1}, 10}}] |
与理论模型差距明显.
Problem 4
1 | data = TimeSeries[{184.61, 205.76, 229.31, 242.32, 275.23, 311, |
从图像上认为数据存在类似于指数增长的确定性趋势,考虑
1 | fit = FindFit[data, a + b E^(c (t - 1978)), {a, b, c}, t] |
拟合得到
1 | {a -> -688.723, b -> 382.643, c -> 0.118877} |
看看残差
1 | res = data - Table[(a + b E^(c t)) /. fit, {t, Length[data]}]; |
并不算是平稳,但本来数据量就不多,将就吧
1 | tsm = TimeSeriesModelFit[TimeSeries[res]] |
Mathematica 建议使用 SARIMA 来建模残量序列,残量序列确实具有一定的季节性
1 | SARIMAProcess[-4159.83, {2.75393, -5.90893}, 1, {-0.843746, \ |
但是由于数据量过少,难以估计许多参数. 使用更为简单的 ARMA 模型
1 | tsm = TimeSeriesModelFit[TimeSeries[res], "ARMA"] |
1 | ARMAProcess[-4.20369*10^-14, {1.36553, -0.673662}, {0.414017}, \ |