如果可能的话,我试图避免使用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中上传了部分数据
答案 0 :(得分: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
,因为zeros = array(0, dim = c(N,1))
aMat = t(array(1, dim = c(1,N)))
没有任何意义......
最后,加快你的代码:
移动for循环之外的常量。具体做法是:
i
因为他们不依赖solve.QP
。
我确实找到了函数cov.shrink
但未找到foreach
。我也不熟悉。解算器经常是缓慢而迭代的,很难加速。但是,听起来这可以很容易地分成多个线程。看看for loops
。
就避免for loop
而言,有时代码在apply
中比在For loops
类型函数中更清晰,更有效。 {{1}}没有被淘汰,只是适当使用。
将来,请创建一个完整的reproducible example,其中包含您的数据,您正在使用的软件包以及有效的代码。这将使您更深入地了解问题,并将为您提供更好,更准确和更完整的答案。