这是我想要做的:
我有一个时间序列数据框,让我们说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)
}
答案 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
}