-3

如果可能,我会尽量避免使用 for 循环。这是整个代码,矩阵的数据只是百分比。

x.r = read.zoo("Matrix.csv", header=F, sep = ",", format = "%m/%d/%Y")
yrs = 5
niter = nrow(x.r)-yrs*52+1
N = ncol(x.r)
x.r.w = matrix(0,nrow=niter,ncol=N)
for (i in 1:niter) {
     x.r.sub = x.r[i:(i+yrs*52-1),]
     covar = cov.shrink(x.r.sub)
     zeros = array(0, dim = c(N,1))
     aMat  = t(array(1, dim = c(1,N)))
     res = solve.QP(covar, zeros, aMat, bvec=1, meq = 1)
     x.r.w[i,] = res$solution
     }

我已在此链接中上传了 Matrix.csv 中的部分数据

矩阵.csv

4

1 回答 1

3

让我们从你的问题开始。我实际上下载了您的数据,但是您提供的用于读取文件的代码不起作用。它错误:

Error in read.zoo("Downloads/Matrix.csv", header = FALSE, sep = ";", format = "%m/%d/%Y",  : 
  index has 155 bad entries at data rows: 2 3 6 7 ...

我也将其更改为sep=','sep=';'因为那是您提供的数据。接下来,您分配niter哪个,因为x.r是 256 行,所以最终是-3. 所以,当然,x.r.w不能被创造,因为nrow=niter没有任何意义......

最后,加速你的代码:

将不变的东西移到 for 循环之外。具体来说:

zeros = array(0, dim = c(N,1))
aMat  = t(array(1, dim = c(1,N)))

因为他们不依赖i.

我确实找到了该功能solve.QP,但没有找到cov.shrink. 而且我也不熟悉。求解器通常缓慢且迭代且难以加速。但是,听起来这很容易被拆分为多个线程。看看foreach

就避免 而言for loops,有时代码在 afor loop中和在apply类型函数中一样清晰和高效。 For loops没有被淘汰,只是使用得当。

将来,请创建一个完全可重现的示例,其中包含您的数据、您正在使用的包和有效的代码。这将引导您更深入地了解问题,并为您提供更好、更准确和更完整的答案。

于 2013-01-10T15:14:04.897 回答