R中CO2数据集的ARIMA建模、预测和绘图
我正在使用R中CO2数据集的ARIMA建模、预测和绘图,r,time-series,R,Time Series,我正在使用arima0()和co2。我想在我的数据上绘制arima0()model。我尝试了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
arima0()
和co2
。我想在我的数据上绘制arima0()
model。我尝试了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)
我想画出模型和预测。我希望有一种方法可以在R基中实现这一点。我还希望能够绘制预测图。课程1:首先 老实说,我非常担心你建模时间序列的方式。当你去趋势化二氧化碳时,已经发生了一些错误。为什么要使用
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)
无论该模型是否良好,我们需要检查残差的ACF:
acf(fit$residuals)
看起来这个型号不错(实际上相当不错)
出于预测目的,将co2dt
的季节差异与co2dt.dif
的模型拟合相结合实际上是一个更好的想法。我们开始吧
fit <- arima0(co2dt, order = c(1,0,0), seasonal = c(0,1,1), include.mean = FALSE)
让我们绘制co2dt
,将模型和预测拟合在一起:
fittedco2dt <- co2dt - fit$residuals
ts.plot(co2dt, fittedco2dt, predco2dt, col = 1:3)
ts.plot(co2, co2fitted, co2pred, col = 1:3)
但对于预测来说更难,因为我们不知道未来的年平均值是多少。在这方面,我们的建模虽然看起来不错,但实际上并不有用。我将在另一个答案中谈论一个更好的想法。为了完成本课程,我们仅用拟合值绘制co2
:
ts.plot(co2, fittedco2, col = 1:2)
课程1:首先 老实说,我非常担心你建模时间序列的方式。当你去趋势化二氧化碳时,已经发生了一些错误。为什么要使用
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)
无论该模型是否良好,我们需要检查残差的ACF:
acf(fit$residuals)
看起来这个型号不错(实际上相当不错)
出于预测目的,将co2dt
的季节差异与co2dt.dif
的模型拟合相结合实际上是一个更好的想法。我们开始吧
fit <- arima0(co2dt, order = c(1,0,0), seasonal = c(0,1,1), include.mean = FALSE)
让我们绘制co2dt
,将模型和预测拟合在一起:
fittedco2dt <- co2dt - fit$residuals
ts.plot(co2dt, fittedco2dt, predco2dt, col = 1:3)
ts.plot(co2, co2fitted, co2pred, col = 1:3)
但对于预测来说更难,因为我们不知道未来的年平均值是多少。在这方面,我们的建模虽然看起来不错,但实际上并不有用。我将在另一个答案中谈论一个更好的想法。为了完成本课程,我们仅用拟合值绘制co2
:
ts.plot(co2, fittedco2, col = 1:2)
第2课时:时间序列建模的更好想法 在上一节课中,我们已经看到,如果我们将去趋势系列的去趋势和建模分开,预测会有困难。现在,我们尝试一次将这两个阶段结合起来
co2
的季节性模式非常强,因此我们需要季节性差异:
data(co2)
co2dt <- diff(co2, lag = 12)
par(mfrow = c(1,2)); ts.plot(co2dt); acf(co2dt)
季节内和季节间的负峰值表明两者都需要MA过程。我不会使用co2dt.dif
;我们可以直接使用co2
:
fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1))
acf(fit$residuals)
通过调用predict
进行预测:
co2pred <- predict(fit, n.ahead = 36, se.fit = FALSE)
哦,这真是太棒了 第2课时:时间序列建模的更好想法 在上一节课中,我们已经看到,如果我们将去趋势系列的去趋势和建模分开,预测会有困难。现在,我们尝试一次将这两个阶段结合起来
co2
的季节性模式非常强,因此我们需要季节性差异:
data(co2)
co2dt <- diff(co2, lag = 12)
par(mfrow = c(1,2)); ts.plot(co2dt); acf(co2dt)
季节内和季节间的负峰值表明两者都需要MA过程。我不会使用co2dt.dif
;我们可以直接使用co2
:
fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1))
acf(fit$residuals)
通过调用predict
进行预测:
co2pred <- predict(fit, n.ahead = 36, se.fit = FALSE)
哦,这真是太棒了 第三课时:车型选择 故事现在应该已经结束了;但是我想与
forecast
中的auto.arima
进行比较,它可以自动决定“最佳”模型
AIC值表明我们的模型更好。BIC也是如此:
BIC = -2 * loglik + log(n) * p
我们有
n课程3:车型选择
故事现在应该已经结束了;但是我想与forecast
中的auto.arima
进行比较,它可以自动决定“最佳”模型
AIC值表明我们的模型更好。BIC也是如此:
BIC = -2 * loglik + log(n) * p
我们有n