for循环只存储最后一个值

时间:2015-09-30 16:20:39

标签: r loops

我在R中写了一个for循环,并尝试将我的计算值存储在矩阵中。不幸的是,它只保存了我的最后价值。我已经浏览了互联网,我发现,这个问题可以通过索引来解决。但是,我已经这样做了,但它仍然不起作用。你看到我的错了吗?

数据集:

require(stats)

data <- ts.union(a=arima.sim(model=list(ar=c(.9,-.2)), n=144), 
             b=arima.sim(model=list(ar=c(.6, -.3)), n=144), 
             c=arima.sim(model=list(ar=c(-.2,-.6)), n=144), 
             d=arima.sim(model=list(ar=c(-.1,-.6)), n=144), 
             e=arima.sim(model=list(ar=c(.2,-.6)), n=144), 
             f=arima.sim(model=list(ar=c(.2,.7)), n=144), 
             g=arima.sim(model=list(ar=c(.3,.2)), n=144), 
             h=arima.sim(model=list(ar=c(-.4,.3)), n=144), 
             i=arima.sim(model=list(ar=c(.1,-.7)), n=144), 
             j=arima.sim(model=list(ar=c(.8,.1)), n=144))
data <- ts(data, start=c(2007, 2), frequency=12)

循环:

require(vars)

for(i in 1:12){
  # compute factors, window is 5.5 years wide
  factors <- ts(prcomp(window(data, start=c(2007, (i+1)), end=c(2012, i+6)), center=T, scale=T)$x[,1:5], 
          start=c(2007,(i+1)), frequency=12)
  # estimate VAR model
  model <- VAR(window(data, start=c(2007, (i+1)), end=c(2012, i+6)), 
         exogen=factors, type="const")
  # forecast factors
  factor.fcst <- sapply(factors, function(x) predict(auto.arima(x, stationary=T, seasonal=F), n.ahead=12))[1,]
  factor.fcst <- cbind(factor.fcst$PC1, factor.fcst$PC2, factor.fcst$PC3, factor.fcst$PC4, factor.fcst$PC5)
  colnames(factor.fcst) <- colnames(factors)

  # forecast model
  a_fcst <- ts(predict(model, dumvar=factor.fcst, n.ahead=12, ci=0.95)$fcst$a[,1],
              start=c(2012, (i+7)), frequency=12)
  # compute RMSE
  RMSE <- matrix(ncol=1, nrow=12)
  RMSE[i,] <- sqrt(mean((window(data[,1], start=c(2012, (i+7)), 
                          end=c(2012, (i+18))) - a_fcst)^2))
  print(RMSE)
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这是一个更简单的例子:

  d1 <- seq(10)
  ans1 <- vector(length=length(d1), mode="double")
  for (i in seq.int(length(d1))){
    ans1[i] <- sqrt(d1[i])
  }

现在,如果我们取第二行并将其放入循环中,则只返回最后一个值,即每次循环运行时都会重置ans1的值。

这种代码远非“最佳实践”。也就是说,循环往往是向量化函数的有用的第一步,可以更容易阅读,并且(很少)可以更快。

相关问题