计算不带循环的样本方差

时间:2012-11-27 18:11:43

标签: r loops

这是我想要做的:

我有一个时间序列数据框,让我们说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)
  }

1 个答案:

答案 0 :(得分:1)

不确定你想要什么类型的“随机”权重...所以我将使用正常分布比例s.t.它总结为一个:

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只是一个有效的循环结构,因此这并不能避免每个循环的循环。也就是说,R中的for loops没有明显的坏或低效。然而,增长数据结构,就像你使用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
  }