2015-09-30 4 views
0

Я написал цикл for в R и попытаюсь сохранить мои вычисленные значения в матрице. К сожалению, он сохраняет только мое последнее значение. Я уже просматривал интернет, и я узнал, что эту проблему можно решить путем индексирования. Тем не менее, я уже делаю это, и он все еще не работает. Вы видите мою ошибку?для цикла только сохраняет последнее значение

Набор данных:

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) 
} 

Спасибо за вашу помощь!

+6

Вы возвращаете RMSE каждую итерацию с помощью 'RMSE <- matrix (ncol = 1, nrow = 12)', вынимаете это из цикла. В общем, вы должны попытаться избежать циклов - посмотрите на функцию «rollapply» в пакете 'zoo' для способов анализа временных рядов. – jeremycg

ответ

1

Вот простой пример:

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

Теперь, если мы возьмем вторую строку и поместить его в петле, только последнее значение возвращается т.е. значения ans1 сбрасывается каждый раз, когда цикл запускается ,

Этот вид кода далек от «лучшей практики». Тем не менее, петли часто могут быть полезным первым шагом в направлении векторизации функции, ее легче читать и (реже) может быть быстрее.

+0

Большое вам спасибо. Я этого не видел. – nelakell

Смежные вопросы