2013-07-27 45 views
2

我想要做以下两个步骤:如何用arima.sim和估计模型模拟AR(1)过程?

  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 

我不是最大的时间序列的专家,但我敢肯定,在AR(1)过程与下面的一个持续性参数应导致一个静止的模型。但是,错误消息告诉我一些 不同。那么我在这里做一些愚蠢的事情?如果是这样,为什么以及我该如何根据我的估计参数来模拟AR(1)过程。或者难道你不能把arima的输出作为模型输入到arima.sim吗?然后,然而,我不明白我是如何得到这样一个错误信息...我会期望类似“模型输入不能被读取,它应该是类似于...”

回答

6

这不是最清楚的界面,但model论点是为了给出ARMA订单的列表,而不是实际的arima模型。

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

这将根据您的起始数据估计的AR系数.489创建一个模拟系列。请注意,拦截将被忽略。

4

我不认为你正在使用正确的方法,因为你的系数估计存在不确定性。 以合适的方式实现你想要的最好方法是在生成过程中加入不确定性,可能有参数化的方法来做到这一点,但我认为bootstrap在这里可以得心应手。

让我们产生了AR过程首先

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

我们将定义将在自举使用两个辅助功能。第一个产生我们所需要的统计数据(这里的AR过程的COEF和实际时间序列)和第二功能实现我们重新采样方案(它会根据残差)

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) 

您可以在0帮助文件获取更多详细信息和Bootstrap Methods and Their Application,第一章8

enter image description here

+0

这当然是一个有趣的附加点(所以+1),但没有我关心的是特别。现在,我只想模拟一个过程,并想知道为什么它不像我在R中尝试的方式那样工作。 –

+0

@Christoph_J我只是想分享一下我对这个问题的观点,但你绝对是对的,所以对编程而言并不是数据! – dickoa