【问题标题】:R: Autocorrelation in a matrixR:矩阵中的自相关
【发布时间】:2013-06-15 07:49:31
【问题描述】:

我对 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])
   }
  }

【问题讨论】:

    标签: r matrix correlation montecarlo


    【解决方案1】:

    撇开统计数据不谈,我认为这可以实现您的目标,但我没有得到 NA。我改变了它的完成方式,因为你说它进展缓慢。

    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) 来生成非平稳时间序列,您可以执行以下操作:

    myInnov <- function(N=100, a=1, SD=1) {a + rnorm(n=N, sd=SD)}
    mc2 <- matrix(rep(NA,1E7), nrow=100)
    for(i in seq_len(1E5)){
        mc2[,i] <- arima.sim(model=list(ar=0.99), n=100, innov=myInnov(a=1, N=100, SD=1)) + 1
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 2019-04-15
      • 2018-08-08
      • 1970-01-01
      • 2018-03-15
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多