-1

これが私がやりたいことです:

私は時系列データフレームを持っています。たとえば、長さ600の時系列が100個あり、それぞれがデータフレームの1列にあります。

時系列のうち10個をランダムに取得し、合計で1個になるランダムな重みを割り当てたいと思います。それらを使用して、10個の加重時系列変数の合計の分散を計算します(凸結合など)。

dfは次の形式です

v1,v2,v2.....v100
1,5,6,.......9
2,4,6,.......10
3,5,8,.......6
2,2,8,.......2
etc

ループ内で計算できますが、rはベクトル指向であり、効率的ではありません。

ntrials = 10000
ts.sd = NULL
for (x in 1:ntrials))
  {
  temp = t(weights[,x]) %*% cov(df[, samples[, x]]) %*% weights[, x]
  ts.sd = cbind(ts.sd, temp)
  }
4

1 に答える 1

1

重みに必要な「ランダム」のタイプがわからない...したがって、合計が1になるようにスケーリングされた正規分布を使用します。

x=as.data.frame(matrix(sample(1:20, 100*600, replace=TRUE), ncol=100))

myfun <- function(inc, DF=x) {
  w = runif(10)
  w = w / sum(w)
  t(w) %*% cov(DF[, sample(seq_along(DF), 10)]) %*% w
}

lapply(1:ntrials, myfun)

ただし、これはlapply単なる効率的なループ構造であるため、ループを実際に回避しているわけではありません。とは言ってもfor loops、R では明示的に悪いとか非効率的というわけではありません。cbindただし、 で 行っているように、データ構造を成長させることはできます。

ただし、この場合、単一の要素を追加することによってのみ成長しているため、実際にはあまり変化しません。ts.sd「正しい」バージョンは、を使用してベクトルを事前に割り当てることntrialsです。

ts.sd = vector(mode='numeric', length=ntrials)

ループ内で次を使用してそれに割り当てますi

for (x in 1:ntrials))
  {
  temp = t(weights[,x]) %*% cov(df[, samples[, x]]) %*% weights[, x]
  ts.sd[i] = temp
  }
于 2012-11-27T18:36:47.630 に答える