5

我想做以下两个步骤:

  1. 基于给定的时间序列,我想校准一个 AR(1) 过程,即我想估计参数。
  2. 根据估计的参数,我想模拟一个 AR(1) 过程。

这是我的方法:

set.seed(123)
#Just generate random AR(1) time series; based on this, I want to estimate the parameters
ts_AR <- arima.sim(n=10000, list(ar=c(0.5)))
#1. Estimate parameters with arima()
model_AR <- arima(ts_AR, order=c(1,0,0))
#Looks actually good
model_AR
Series: ts_AR 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
  ar1  intercept
0.4891    -0.0044
s.e.  0.0087     0.0195

sigma^2 estimated as 0.9974:  log likelihood=-14176.35
AIC=28358.69   AICc=28358.69   BIC=28380.32  

#2. Simulate based on model
arima.sim(model=model_AR, n = 100)
Error in arima.sim(model = model_AR, n = 100) : 
  'ar' part of model is not stationary

我不是最大的时间序列专家,但我很确定持久性参数低于 1 的 AR(1) 过程应该会产生一个平稳的模型。但是,错误消息告诉我一些不同的事情。所以我在这里做一些愚蠢的事情吗?如果是这样,为什么以及我应该做什么来根据我估计的参数来模拟 AR(1) 过程。或者你不能只是将输出arima作为模型输入传递给arima.sim?然后,但是,我不明白我是如何得到这样一个错误消息的......我希望像“模型输入无法读取。它应该是......”

4

2 回答 2

8

它不是世界上最清晰的界面,但该model参数是一个给出 ARMA 顺序的列表,而不是实际arima模型。

arima.sim(model=as.list(coef(model_AR)), n=100)

这将创建一个模拟序列,其 AR 系数为 0.489,根据您的起始数据估计。请注意,截距被忽略。

于 2013-07-27T12:50:21.747 回答
6

我认为您使用的方法不正确,因为您的系数估计存在不确定性。以正确的方式实现您想要的最佳方法是在生成过程中加入不确定性,可能有参数化的方法可以做到这一点,但我认为引导程序在这里很方便。

让我们先生成 AR 流程

set.seed(123)
ts_AR <- arima.sim(n = 10000, list(ar = 0.5))

我们将定义两个将在 boostrap 中使用的辅助函数。第一个生成我们需要的统计数据(这里是 AR 过程的系数和实际时间序列),第二个函数实现我们的重采样方案(它将基于残差)

ar_fun <- function(ts) c(ar = coef(arima(ts, order = c(1, 0, 0),
                                       include.mean = FALSE)), ts = ts)

ar_sim <- function(res, n.sim, ran.args) {
    rg <- function(n, res) sample(res, n, replace = TRUE)
    ts <- ran.args$ts
    model <- ran.args$model
    arima.sim(model = model, n = n.sim,
              rand.gen = rg, res = c(res))
}

现在我们可以开始我们的模拟了

ar_fit <- arima(ts_AR, order = c(1, 0, 0), include.mean = FALSE)
ts_res <- residuals(ar_fit)
ts_res <- ts_res - mean(ts_res)
ar_model <- list(ar = coef(ar_fit))

require(boot)
set.seed(1)
ar_boot <- tsboot(ts_res, ar_fun,
                   R = 99, sim = "model",
                   n.sim = 100, orig.t = FALSE,
                   ran.gen = ar_sim,
                   ran.args = list(ts = ts_AR, model = ar_model))

如果你想得到所有生成的系数和相关的时间序列

coefmat <- apply(ar_boot$t, 1, "[", 1)
seriesmat <- apply(ar_boot$t, 1, "[", -1)

您可以在第 8 章的帮助文件tsbootBootstrap 方法及其应用程序中获得更多详细信息。

在此处输入图像描述

于 2013-07-27T13:47:10.423 回答