-1

这是我想做的事情:

我有一个时间序列数据框,让我们说 100 个长度为 600 的时间序列 - 每个都在数据框的一列中。

我想随机选取 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 回答