R:矩阵中的自相关

时间:2013-06-18 22:23:17

标签: r matrix correlation montecarlo

我对AR(1)时间序列采用蒙特卡罗方法。我必须生成10,000个100长度的时间序列,之后我必须为每个时间序列获得第一步自相关rho_1。我的问题是我只获得自相关的NA值,并且计算需要花费很多时间。我对计算AR(1)时间序列没有任何问题。 谢谢你的帮助:))

gen_ar <- function(a,b,length,start)
{
 z<-rep(0,length)                                 
 e<-rnorm(n=length,sd=1)  
 z[1]<-start
  for (i in 2:length)
  {
    z[i]<-a+b*z[i-1]+e[i]
  }
 z
}

mc <- matrix(c(rep(0,10000000)),nrow=10000)
 for (i in 1:10000)
 {
  mc[i,] <- gen_ar(0.99,1,100,0)
 }

 ac <- matrix(c(rep(0,10000)),nrow=1)
  for (i in 1:10000){
   for (j in 1:99){
    ac[i] <- cor(mc[i,j],mc[i,j+1])
   }
  }

1 个答案:

答案 0 :(得分:0)

除了统计数据外,我认为这可以实现你的目标,而且我没有得到NA。我改变了它的方式b / c你说它进展缓慢。

mc <- matrix(rep(NA,1E5), nrow=100)
for(i in seq_len(100)){
    mc[,i] <- arima.sim(model=list(ar=0.99), n=100, sd=1) + 1
}

myAR <- function(x){
    cor(x[-1], x[-length(x)])
}

answer <- apply(mc, 2, myAR)

我跳过最后一组嵌套的for循环,并用apply()替换它们。它似乎更容易阅读,而且可能更快。另外,要使用apply(),我创建了一个名为myAR的函数,该函数执行cor()for()循环中执行的相同计算。

现在,我做了一些统计调整。首先,这些是在模拟步骤中。

首先,你的模拟AR(1)过程的系数等于1,这对我来说似乎很奇怪(这不会是静止的,arima.sim()甚至不会让你模拟这种类型的过程)。

此外,您的“a”参数在每个时间步的时间序列中加1。换句话说,你的时间序列从1单调增加到100,因为系数等于1.这也会使你的时间序列非平稳,并且如果有一个强正斜率,cor()函数可能会返回{{ 1}}作为估计的相关性,与模拟的AR系数的值无关。我假设您希望长期均值在1附近徘徊,因此在模拟后将1简单地添加到整个时间序列中,而不是在每个时间步进行迭代。

假设您确实希望通过在每个时间步添加一些常量(a)来生成非平稳时间序列,您可以执行以下操作:

1

我希望这会有所帮助。