递归计算模拟变量

时间:2016-12-11 18:17:05

标签: r time-series

我试图模拟一个变量,它应该像这样工作:

v[t] = Q * v[t-1] + e[t]

e是我使用rnorm(156,0,0.001)生成的随机错误; v是我的目标模拟; Q是一个系数(I' m使用0.5)。

第一个值v[1]将等于e[1]。然后

v[2] = Q * v[1] + e[2]
v[3] = Q * v[2] + e[3]
. . . 

我是R的新手,我试图使用for循环,但我正在挣扎(我本来要在这里发布我的代码,但它不是&#t; t工作所以我想我不会浪费人们的时间)。提前谢谢!

2 个答案:

答案 0 :(得分:3)

这是一个典型的自回归过程,可以使用filter生成"递归"方法

e <- rnorm(156, 0, 0.001)
filter(x = c(0, e), filter = 0.5, method = "recursive")[-1]

让我们考虑一个长度为5的小例子:

set.seed(0)

e <- rnorm(5, 0, 0.1)
# [1]  0.12629543 -0.03262334  0.13297993  0.12724293  0.04146414

x <- filter(x = c(0, e), filter = 0.5, method = "recursive")

x[-1]
# [1] 0.12629543 0.03052438 0.14824212 0.20136399 0.14214614

filterarima.sim的主力,然而,它只是一个带有编写C代码的计算例程,并不需要该过程是静止的。对arima.sim感兴趣的读者可以继续阅读:

答案 1 :(得分:1)

我们注意到单位对自动回归过程v(t)=Q*v(t-1) + u(t)的响应是:

unit_res <- c(1, Q, Q^2, Q^3, ...)

我们可以使用unit_res <- q^(seq_len(length(err))-1)生成此回复。然后,回复verr只是err与此unit_res的卷积:

set.seed(123) ## for reproducibility
q <- 0.5
err <- rnorm(156,0,0.0001)
unit_res <- q^(seq_len(length(err))-1)
## first (initial value is zero) and we take the first 156 values from the convolution
v <- c(0, convolve(err,rev(unit_res),type="open")[1:156])
##head(v,20)
## [1]  0.000000e+00 -5.604756e-05 -5.104153e-05  1.303501e-04  7.222587e-05  4.904171e-05
## [7]  1.960274e-04  1.441053e-04 -5.445347e-05 -9.591202e-05 -9.252221e-05  7.614708e-05
##[13]  7.405492e-05  7.710461e-05  4.962057e-05 -3.077383e-05  1.633044e-04  1.314372e-04
##[19] -1.309431e-04  4.664044e-06

由于156不是一个很大的数字,另一种方法是为表格的差分方程v(t)=Q*v(t-1) + err(t)构建一个单位响应矩阵:

Z = [1   0   0   0   ...
     Q   1   0   0   ...
     Q^2 Q   1   0   ...
     Q^3 Q^2 Q   1   ...
     ... ... ... ... ...]

在您的情况下,此矩阵将为156 x 156。请注意,此矩阵的每一列都是时间err中单位输入的响应,时间t等于列索引。由于系统是线性的,因此响应verr=rnorm(156,0,0.001)由每个单位响应的叠加给出,并且可以通过矩阵乘法v = Z %*% err来计算。

要构建此矩阵,我们可以使用函数:

constructZ <- function(Q, N) {
  r <- Q^(seq_len(N)-1)
  m <- matrix(rep(r,N),nrow=N)
  z <- matrix(0,nrow=N,ncol=N)
  z[lower.tri(z,diag=TRUE)] <- m[row(m) <= (N+1-col(m))]
  z
}

有了这个,我们有:

v <- c(0,constructZ(q, length(err)) %*% err)

给出相同的结果。