我正在使用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有一种方法可以做到这一点。我也希望能够绘制预测。
答案 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)
两个去趋势系列都具有强烈的季节性影响,因此需要进一步的季节差异。
## 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)
co2.dt.dif
的ACF具有更显着的负相关。这是过度趋势的标志。所以我们更喜欢co2dt
。 co2dt
已经是静止的,不再需要差分(否则你只是过度区分并引入更多的负自相关)。
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)
看起来这个模型很不错(实际上非常棒)。
出于预测的目的,将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)
结果看起来很有希望!
现在最后阶段,实际上是将其映射回原来的co2
系列。对于拟合值,我们只需添加我们已经下降的年平均值:
fittedco2 <- fittedco2dt + yearlymean
但是对于预测来说更难,因为我们不知道未来的年度意味着什么。在这方面,我们的建模虽然看起来不错,但实际上并不实用。我将在另一个答案中讨论一个更好的主意。要完成此会话,我们仅使用其拟合值绘制co2
:
ts.plot(co2, fittedco2, col = 1:2)
答案 1 :(得分:1)
第2节:时间序列建模的更好主意
在上一次会议中,如果我们将去趋势和去趋势系列的建模分开,我们已经看到了预测的困难。现在,我们尝试将这两个阶段结合在一起。
co2
的季节性模式确实很强,所以无论如何我们都需要季节差异:
data(co2)
co2dt <- diff(co2, lag = 12)
par(mfrow = c(1,2)); ts.plot(co2dt); acf(co2dt)
在此季节性差异之后,co2dt
看起来并不稳定。所以我们需要进一步的非季节性差异。
co2dt.dif <- diff(co2dt)
par(mfrow = c(1,2)); ts.plot(co2dt.dif); acf(co2dt.dif)
季节内和季节之间的负面峰值表明两者都需要MA过程。我不会与co2dt.dif
合作;我们可以直接使用co2
:
fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1))
acf(fit$residuals)
现在残差完全不相关!因此,我们为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)
哦,这真是太棒了!
答案 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引入了负相关。