我在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)
}
感谢您的帮助!
答案 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
的值。
这种代码远非“最佳实践”。也就是说,循环往往是向量化函数的有用的第一步,可以更容易阅读,并且(很少)可以更快。