用不同的时间序列初始化 ARIMA 模拟

机器算法验证 时间序列 预测 模拟 有马 生态
2022-04-05 14:11:14

我有相当长的年度丰度时间序列(Nt)的野生动物物种(73 年的丰富)。为了预测人口的轨迹,我使用了 ARIMA 建模。检查一阶差分时间序列的 ACF 和 PACF 表明存在 10 年周期。因此,我使用跨度 10 的季节性差异来解释这种周期性模式。因此,响应变量为:

Yt=(NtNt1)(Nt10Nt11)
通常,我会使用对数变换,但它会导致异方差残差。ACF 和 PACF 的检查Yt表示乘法季节性结构,因此我适合模型:
ARIMA(0,1,1)(0,1,1)10
R在.... 中使用预测包library(forecast)

拟合模型的示例代码:

m1=Arima(y,order=c(0,1,1),seasonal=list(order=c(0,1,1),period=10),include.mean=FALSE)

该模型的残差是正态分布的,不是自相关的,并且是同方差的。

我一直在使用上面的拟合模型使用该simulate.Arima函数进行一些额外的模拟工作。但是,我想用不同的时间序列初始化模拟。arima.sim函数允许这样做,但该arima.sim函数似乎无法处理季节性 ARIMA 模型。使用该simulate.Arima功能,可以使用该future=TRUE选项来模拟模型中“数据的未来和条件”的值m1可以简单地替换模型对象中的数据m1以创建以不同数据为条件的模拟吗?

例如:

# Create a new model object for simulation.
m.sim=m1
# Replace the data in the model object with the new data.
m.sim$x=new
# Simulation conditional on the new data.
sim.forecasts=replicate(1000,simulate.Arima(m.sim,future=TRUE,bootstrap=TRUE))
2个回答

您可以将模型“拟合”到不同的数据,然后模拟:

m2 <- Arima(z,model=m1)
simulate.Arima(m2,future=TRUE,bootstrap=TRUE)

m2将具有相同的参数m1(它们不会重新估计),但残差等是在新数据上计算的。

但是,我担心你的模型。季节性模型适用于季节性固定且已知的情况。有了动物种群数据,您几乎可以肯定会有非周期性的种群循环。这是一个众所周知的现象,可以使用非季节性 ARIMA 模型轻松处理。查看有关加拿大猞猁数据的文献进行讨论。

无论如何,使用平方根,但我会使用非季节性 ARIMA 模型。如果 AR 顺序大于 1,则可能有循环。

您可以一步完成所有这些:

m1 <- auto.arima(y, lambda=0.5)

然后继续进行上述模拟。

在相关说明中,如果您的 ARIMA 模型具有外部回归器,您可以实现相同的目标。这有时对我很有帮助。

例如,假设您的第一个模型创建如下:

fit.arimax <- Arima(response, order=c(1, 0, 1), xreg=xreg)

然后假设在创建模型后,您观察到响应变量和外部回归变量中的附加值,并希望在给定这些新观察的情况下预测或模拟未来结果。例如,假设您正在预测电力需求,并且您观察到另一个小时的需求(即响应)和温度(即外部回归)数据。

然后,您可以将原始模型拟合到更新的时间序列,如下所示,其中 response.new 和 xreg.new 是您更新的响应和回归变量。

fit.arimax.new <- Arima(response.new, model=fit.arimax, xreg=xreg.new)

您可以使用这个新模型来预测或模拟未来的结果,条件是所有观察到的数据。请注意,您必须为每个提供预测外部回归器。例如,

forecast.Arima(fit.arimax.new, h=length(xreg.forecast), xreg=xreg.forecast)

simulate.Arima(fit.arimax.new, n=length(xreg.forecast), xreg=xreg.forecast)

完成所有这些的另一种方法是使用更新的数据制作一个全新的模型。但上述方法适用于实时应用,在这种情况下,拟合新的 ARIMA 模型将花费太长时间。