我试图模拟一个变量,它应该像这样工作:
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工作所以我想我不会浪费人们的时间)。提前谢谢!
答案 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
filter
是arima.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)
生成此回复。然后,回复v
到err
只是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
等于列索引。由于系统是线性的,因此响应v
到err=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)
给出相同的结果。