AR中的二氧化碳数据集的ARIMA建模,预测和绘图

时间:2016-10-22 19:59:15

标签: r time-series

我正在使用arima0()co2。我想在我的数据上绘制arima0()模型。我尝试过fitted()curve()但没有成功。

这是我的代码:

###### Time Series

# format: time series
data(co2)

# format: matrix
dmn <- list(month.abb, unique(floor(time(co2))))
co2.m <- matrix(co2, 12, dimnames = dmn)

co2.dt <- pracma::detrend(co2.m, tt = 'linear')
co2.dt <- ts(as.numeric(co2.dt), start = c(1959,1), frequency=12)

# first diff
co2.dt.dif <- diff(co2.dt,lag = 12)

# Second diff
co2.dt.dif2 <- diff(co2.dt.dif,lag = 1)

准备好数据后,我运行了以下arima0

results <- arima0(co2.dt.dif2, order = c(2,0,0), method = "ML")
resultspredict <- predict(results, n.ahead = 36)

我想绘制模型和预测。我希望在基地R有一种方法可以做到这一点。我也希望能够绘制预测。

3 个答案:

答案 0 :(得分:2)

第1节:首先......

说实话,我非常担心你的co2时间序列建模方式。当你退出co2时,已经发生了一些错误。为什么要使用tt = "linear"?您在每个时期(即年份)内拟合线性趋势,并将残差用于进一步检查。这通常不推荐,因为它往往会对残余系列产生人为影响。我倾向于做tt = "constant",即简单地降低年平均值。这至少会保留原始数据中的季节相关性。

也许你想在这里看到一些证据。考虑使用ACF来帮助您进行诊断。

data(co2)

## de-trend by dropping yearly average (no need to use `pracma::detrend`)
yearlymean <- ave(co2, gl(39, 12), FUN = mean)
co2dt <- co2 - yearlymean

## de-trend by dropping within season linear trend
co2.m <- matrix(co2, 12)
co2.dt <- pracma::detrend(co2.m, tt = "linear")
co2.dt <- ts(as.numeric(co2.dt), start = c(1959, 1), frequency = 12)

## compare time series and ACF
par(mfrow = c(2, 2))
ts.plot(co2dt); acf(co2dt)
ts.plot(co2.dt); acf(co2.dt)

enter image description here

两个去趋势系列都具有强烈的季节性影响,因此需要进一步的季节差异。

## seasonal differencing
co2dt.dif <- diff(co2dt, lag = 12)
co2.dt.dif <- diff(co2.dt, lag = 12)

## compare time series and ACF
par(mfrow = c(2, 2))
ts.plot(co2dt.dif); acf(co2dt.dif)
ts.plot(co2.dt.dif); acf(co2.dt.dif)

enter image description here

co2.dt.dif的ACF具有更显着的负相关。这是过度趋势的标志。所以我们更喜欢co2dtco2dt已经是静止的,不再需要差分(否则你只是过度区分并引入更多的负自相关)。

对于co2dt.dif的ACF,滞后1的大幅负增长表明我们需要季节性MA。此外,季节的积极峰值通常意味着轻微的AR过程。所以考虑一下:

## we exclude mean because we found estimation of mean is 0 if we include it
fit <- arima0(co2dt.dif, order = c(1,0,0), seasonal = c(0,0,1), include.mean = FALSE)

这个模型是否表现良好,我们需要检查残差的ACF:

acf(fit$residuals)

enter image description here

看起来这个模型很不错(实际上非​​常棒)。

出于预测的目的,将co2dt的季节差异与co2dt.dif的模型拟合相结合实际上是一个更好的主意。我们来做吧

fit <- arima0(co2dt, order = c(1,0,0), seasonal = c(0,1,1), include.mean = FALSE)

这将给出与上述两阶段工作完全相同的AR和MA系数估计,但现在预测相当容易处理一次predict调用。

## 3 years' ahead prediction (no prediction error; only mean)
predco2dt <- predict(fit, n.ahead = 36, se.fit = FALSE)

让我们一起绘制co2dt,拟合模型和预测:

fittedco2dt <- co2dt - fit$residuals
ts.plot(co2dt, fittedco2dt, predco2dt, col = 1:3)

enter image description here

结果看起来很有希望!

现在最后阶段,实际上是将其映射回原来的co2系列。对于拟合值,我们只需添加我们已经下降的年平均值:

fittedco2 <- fittedco2dt + yearlymean

但是对于预测来说更难,因为我们不知道未来的年度意味着什么。在这方面,我们的建模虽然看起来不错,但实际上并不实用。我将在另一个答案中讨论一个更好的主意。要完成此会话,我们仅使用其拟合值绘制co2

ts.plot(co2, fittedco2, col = 1:2)

enter image description here

答案 1 :(得分:1)

第2节:时间序列建模的更好主意

在上一次会议中,如果我们将去趋势和去趋势系列的建模分开,我们已经看到了预测的困难。现在,我们尝试将这两个阶段结合在一起。

co2的季节性模式确实很强,所以无论如何我们都需要季节差异:

data(co2)
co2dt <- diff(co2, lag = 12)
par(mfrow = c(1,2)); ts.plot(co2dt); acf(co2dt)

enter image description here

在此季节性差异之后,co2dt看起来并不稳定。所以我们需要进一步的非季节性差异。

co2dt.dif <- diff(co2dt)
par(mfrow = c(1,2)); ts.plot(co2dt.dif); acf(co2dt.dif)

enter image description here

季节内和季节之间的负面峰值表明两者都需要MA过程。我不会与co2dt.dif合作;我们可以直接使用co2

fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1))
acf(fit$residuals)

enter image description here

现在残差完全不相关!因此,我们为ARIMA(0,1,1)(0,1,1)[12]系列提供了co2模型。

像往常一样,通过从数据中减去残差来获得拟合值:

co2fitted <- co2 - fit$residuals

通过一次调用predict预测:

co2pred <- predict(fit, n.ahead = 36, se.fit = FALSE)

让我们一起策划:

ts.plot(co2, co2fitted, co2pred, col = 1:3)

enter image description here

哦,这真是太棒了!

答案 2 :(得分:1)

第3节:模型选择

这个故事现在应该已经完成​​了;但是我希望与auto.arima中的forecast进行比较,这可以自动决定“最佳”模型。

library(forecast)
autofit <- auto.arima(co2)

#Series: co2 
#ARIMA(1,1,1)(1,1,2)[12]                    
#
#Coefficients:
#         ar1      ma1     sar1     sma1     sma2
#      0.2569  -0.5847  -0.5489  -0.2620  -0.5123
#s.e.  0.1406   0.1204   0.5880   0.5701   0.4819
#
#sigma^2 estimated as 0.08576:  log likelihood=-84.39
#AIC=180.78   AICc=180.97   BIC=205.5

auto.arima已选择ARIMA(1,1,1)(1,1,2)[12],因为它涉及季节性差异和非季节性差异,因此更为复杂。

我们基于逐步调查的模型建议ARIMA(0,1,1)(0,1,1)[12]

fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1))

#Call:
#arima0(x = co2, order = c(0, 1, 1), seasonal = c(0, 1, 1))
#
#Coefficients:
#      ma1     sma1
#  -0.3495  -0.8515
#s.e.   0.0497   0.0254
#
#sigma^2 estimated as 0.08262:  log likelihood = -85.98,  aic = 177.96

AIC值表明我们的模型更好。 BIC也是如此:

BIC = -2 * loglik + log(n) * p

我们有n <- length(co2)个数据和p <- length(fit$coef) + 1个参数(sigma2的附加参数),因此我们的模型有BIC

-2 * fit$loglik + log(n) * p
# [1] 196.5503

因此,auto.arima过度拟合数据。

事实上,一旦我们看到ARIMA(1,1,1)(1,1,2)[12],我们就会对其过度拟合产生强烈怀疑。因为不同的效果相互“抵消”。这种情况发生在auto.arima引入的额外季节性MA和非季节性AR,因为AR引入了正自相关,而MA引入了负相关。