-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にデータの一部をアップロードしました

Matrix.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=','。次に、これは 256 行であるため、sep=';'最終的に を割り当てます。もちろん、何の意味もないので作成できません...niterx.r-3x.r.wnrow=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と同様に、コードがより明確で効率的であるfor loop場合があります。排除する必要はありません。適切に使用してください。applyFor loops

将来的には、データ、使用しているパッケージ、および動作するコードを含む、完全に再現可能な例を作成してください。これにより、問題の理解が深まり、より正確で完全な回答が得られます。

于 2013-01-10T15:14:04.897 に答える